diff options
340 files changed, 43514 insertions, 9103 deletions
@@ -13,3 +13,4 @@ /doxygen_docs /doxygen.tag +/build* diff --git a/.travis.yml b/.travis.yml index acc325a..1130bec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,56 @@ language: cpp +os: + - linux-ppc64le + - linux +dist: xenial compiler: - gcc - clang +sudo: required -before_install: - - sudo apt-add-repository ppa:smspillaz/cmake-2.8.12 -y - - sudo apt-get update -qq +addons: + apt: + update: true + packages: + - texlive + - texlive-generic-recommended + - texlive-extra-utils + - texlive-latex-extra + - texlive-font-utils + - ghostscript + - libxml2-utils + - cmake + - cmake-data -install: - - sudo apt-get install -qq texlive - - sudo apt-get install -qq texlive-extra-utils - - sudo apt-get install -q -y texlive-latex-extra - - sudo apt-get install -qq libxml2-utils - - sudo apt-get install -qq 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 diff --git a/CMakeLists.txt b/CMakeLists.txt index ba105b8..45c2f2c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ if (use_sqlite3) set(sqlite3 "1" CACHE INTERNAL "used in settings.h") endif() -set(MACOS_VERSION_MIN 10.5) +set(MACOS_VERSION_MIN 10.9) if (use_libclang) set(clang "1" CACHE INTERNAL "used in settings.h") find_package(LLVM CONFIG REQUIRED) @@ -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) @@ -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,25 +29,20 @@ 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 Issues, bugs, requests, ideas ---------------------------------- -Use the bug tracker to report bugs: -* current list: - * [Bugzilla](https://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED) -* Submit a new bug or feature request - * [Enter bug](https://bugzilla.gnome.org/enter_bug.cgi?product=doxygen) +Use the [issue](https://github.com/doxygen/doxygen/issues) tracker to report bugs. Comms ---------------------------------- @@ -63,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) @@ -1 +1 @@ -1.8.14 +1.8.15 diff --git a/addon/doxmlparser/src/dochandler.h b/addon/doxmlparser/src/dochandler.h index 4340dbd..59af4e3 100644 --- a/addon/doxmlparser/src/dochandler.h +++ b/addon/doxmlparser/src/dochandler.h @@ -571,7 +571,7 @@ class EMailHandler : public DocEMailImpl, public BaseHandler<EMailHandler> //----------------------------------------------------------------------------- -/* \brief Node representing a link to an URL +/* \brief Node representing a link to a URL * */ class ULinkHandler : public DocULinkImpl, public BaseHandler<ULinkHandler> diff --git a/addon/doxyparse/README b/addon/doxyparse/README index 9f7429c..288b31e 100644 --- a/addon/doxyparse/README +++ b/addon/doxyparse/README @@ -5,16 +5,24 @@ This directory contains an "source parsing engine" based on doxyapp code. More info and source code repository: https://github.com/analizo/doxygen +## build dependencies + + apt-get install flex bison cmake build-essential python + ## build cmake -G "Unix Makefiles" -Dbuild_parse=ON make +## install + + sudo make install + AUTHORS ======= Antonio Terceiro <terceiro@softwarelivre.org> João M. Miranda <joaomm88@gmail.com> -Joenio Costa <joenio@colivre.coop.br> +Joenio Costa <joenio@joenio.me> Paulo Meirelles <paulo@softwarelivre.org> Vinicius Daros <vkdaros@mercurio.eclipse.ime.usp.br> diff --git a/addon/doxyparse/doxyparse.cpp b/addon/doxyparse/doxyparse.cpp index 6a1886c..584e8b0 100644 --- a/addon/doxyparse/doxyparse.cpp +++ b/addon/doxyparse/doxyparse.cpp @@ -138,7 +138,7 @@ static void printDefines() { modules[current_module] = true; } static void printDefinition(std::string type, std::string signature, int line) { - printf(" - %s:\n", signature.c_str()); + printf(" - \"%s\":\n", signature.c_str()); printf(" type: %s\n", type.c_str()); printf(" line: %d\n", line); } @@ -155,7 +155,7 @@ static void printUses() { printf(" uses:\n"); } static void printReferenceTo(std::string type, std::string signature, std::string defined_in) { - printf(" - %s:\n", signature.c_str()); + printf(" - \"%s\":\n", signature.c_str()); printf(" type: %s\n", type.c_str()); printf(" defined_in: %s\n", defined_in.c_str()); } @@ -167,6 +167,24 @@ static int isPartOfCStruct(MemberDef * md) { return is_c_code && md->getClassDef() != NULL; } +std::string removeDoubleQuotes(std::string data) { + // remove surrounding double quotes + if (data.front() == '"' && data.back() == '"') { + data.erase(0, 1); // first double quote + data.erase(data.size() - 1); // last double quote + } + return data; +} + +std::string argumentData(Argument *argument) { + std::string data = ""; + if (argument->type != NULL) + data = removeDoubleQuotes(argument->type.data()); + else if (argument->name != NULL) + data = removeDoubleQuotes(argument->name.data()); + return data; +} + std::string functionSignature(MemberDef* md) { std::string signature = md->name().data(); if(md->isFunction()){ @@ -175,9 +193,9 @@ std::string functionSignature(MemberDef* md) { signature += "("; Argument * argument = iterator.toFirst(); if(argument != NULL) { - signature += argument->type.data(); - for(++iterator; (argument = iterator.current()) ;++iterator){ - signature += std::string(",") + argument->type.data(); + signature += argumentData(argument); + for(++iterator; (argument = iterator.current()); ++iterator){ + signature += std::string(",") + argumentData(argument); } } signature += ")"; @@ -245,7 +263,7 @@ static void lookupSymbol(Definition *d) { std::string signature = functionSignature(md); printDefinition(type, signature, md->getDefLine()); if (md->protection() == Public) { - printProtection("protection public"); + printProtection("public"); } if (md->isFunction()) { functionInformation(md); @@ -311,7 +329,10 @@ static void detectProgrammingLanguage(FileNameListIterator& fnli) { checkLanguage(filename, ".cc") || checkLanguage(filename, ".cxx") || checkLanguage(filename, ".cpp") || - checkLanguage(filename, ".java") + checkLanguage(filename, ".java") || + checkLanguage(filename, ".py") || + checkLanguage(filename, ".pyw") || + checkLanguage(filename, ".cs") ) { is_c_code = false; } 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/CMakeLists.txt b/addon/doxywizard/CMakeLists.txt index 0907d23..a89864d 100644 --- a/addon/doxywizard/CMakeLists.txt +++ b/addon/doxywizard/CMakeLists.txt @@ -4,9 +4,6 @@ if (NOT force_qt4) if (Qt5Core_FOUND) message(STATUS "Using Qt5") find_package(Qt5 COMPONENTS Widgets Gui Xml) - macro(qt_use_modules) - qt5_use_modules(${ARGN}) - endmacro() macro(qt_wrap_cpp) qt5_wrap_cpp(${ARGN}) endmacro() @@ -23,8 +20,6 @@ if (NOT Qt5Core_FOUND) message(STATUS "Using Qt4") endif() find_package(Qt4 REQUIRED COMPONENTS QtCore QtXml QtGui) - macro(qt_use_modules) - endmacro() macro(qt_wrap_cpp) qt4_wrap_cpp(${ARGN}) endmacro() @@ -103,10 +98,13 @@ ${GENERATED_SRC_WIZARD}/config_doxyw.cpp ${GENERATED_SRC_WIZARD}/configdoc.cpp ${doxywizard_MOC} ${doxywizard_RESOURCES_RCC} +doxywizard.rc ) -qt_use_modules(doxywizard Core Gui Widgets Xml) -target_link_libraries(doxywizard -${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY} -) + +if(Qt5Core_FOUND) + target_link_libraries(doxywizard Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Xml) +else() + target_link_libraries(doxywizard ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY}) +endif() install(TARGETS doxywizard DESTINATION bin) diff --git a/addon/doxywizard/config_doxyw.l b/addon/doxywizard/config_doxyw.l index 7874a19..960b7cb 100644 --- a/addon/doxywizard/config_doxyw.l +++ b/addon/doxywizard/config_doxyw.l @@ -540,22 +540,34 @@ void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s) { QChar c; bool needsEscaping=false; + bool needsHashEscaping=false; // convert the string back to it original encoding //QByteArray se = codec->fromUnicode(s); t.setCodec(codec); const QChar *p=s.data(); if (!s.isEmpty() && !p->isNull()) { - while (!(c=*p++).isNull() && !needsEscaping) + if (*p != QChar::fromLatin1('"')) { - needsEscaping = (c==QChar::fromLatin1(' ') || - c==QChar::fromLatin1('\n') || - c==QChar::fromLatin1('\t') || - c==QChar::fromLatin1('"')); + while (!(c=*p++).isNull() && !needsEscaping) + { + needsEscaping = (c==QChar::fromLatin1(' ') || + c==QChar::fromLatin1('\n') || + c==QChar::fromLatin1('\t') || + c==QChar::fromLatin1('"')); + } + p=s.data(); + while (!(c=*p++).isNull() && !needsHashEscaping) + { + needsHashEscaping = (c==QChar::fromLatin1('#')); + } } - if (needsEscaping) + if (needsHashEscaping || needsEscaping) { t << "\""; + } + if (needsEscaping) + { p=s.data(); while (!p->isNull()) { @@ -564,12 +576,15 @@ void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s) if (*p ==QChar::fromLatin1('"')) t << "\\"; // escape quotes t << *p++; } - t << "\""; } else { t << s; } + if (needsHashEscaping || needsEscaping) + { + t << "\""; + } } } diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index 492912b..56378ed 100755 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -208,7 +208,7 @@ void MainWindow::updateWorkingDir() void MainWindow::manual() { - QDesktopServices::openUrl(QUrl(QString::fromLatin1("http://www.doxygen.org/manual.html"))); + QDesktopServices::openUrl(QUrl(QString::fromLatin1("http://www.doxygen.org/manual/index.html"))); } void MainWindow::about() @@ -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 Binary files differindex 4c7dd9d..9e595e4 100755 --- a/addon/doxywizard/images/tunecolor.png +++ b/addon/doxywizard/images/tunecolor.png 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/addon/doxywizard/wizard.cpp b/addon/doxywizard/wizard.cpp index b320aaa..ae8fa61 100644 --- a/addon/doxywizard/wizard.cpp +++ b/addon/doxywizard/wizard.cpp @@ -1210,18 +1210,23 @@ void Step4::setCallerGraphEnabled(int state) void Step4::init() { + int id = 0; if (getBoolOption(m_modelData,STR_HAVE_DOT)) { m_diagramModeGroup->button(2)->setChecked(true); // Dot + id = 2; } else if (getBoolOption(m_modelData,STR_CLASS_DIAGRAMS)) { m_diagramModeGroup->button(1)->setChecked(true); // Builtin diagrams + id = 1; } else { m_diagramModeGroup->button(0)->setChecked(true); // no diagrams + id = 0; } + m_dotGroup->setEnabled(id==2); m_dotClass->setChecked(getBoolOption(m_modelData,STR_CLASS_GRAPH)); m_dotCollaboration->setChecked(getBoolOption(m_modelData,STR_COLLABORATION_GRAPH)); m_dotInheritance->setChecked(getBoolOption(m_modelData,STR_GRAPHICAL_HIERARCHY)); 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..7beb485 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 @@ -131,7 +144,7 @@ set_source_files_properties(config.doc PROPERTIES GENERATED 1) ################################################################################ add_custom_target(run_doxygen COMMENT "Generating Latex and HTML documentation." - COMMAND ${DOXYGEN_EXECUTABLE} + COMMAND ${CMAKE_COMMAND} -E env VERSION=${VERSION} ${DOXYGEN_EXECUTABLE} DEPENDS ${PROJECT_BINARY_DIR}/doc/language.doc ${PROJECT_BINARY_DIR}/doc/config.doc DEPENDS ${OUT_DOC_FILES} DEPENDS examples @@ -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 e5fbbdc..bd51a1b 100644 --- a/doc/arch.doc +++ b/doc/arch.doc @@ -41,14 +41,14 @@ available through the global functions \c Config_getXXX(), where \c XXX is the type of the option. The argument of these function is a string naming the option as it appears in the configuration file. For instance: \c Config_getBool("GENERATE_TESTLIST") returns a reference to a boolean -value that is \c TRUE if the test list was enabled in the config file. +value that is \c TRUE if the test list was enabled in the configuration file. The function \c readConfiguration() in \c src/doxygen.cpp reads the command line options and then calls the configuration parser. <h3>C Preprocessor</h3> -The input files mentioned in the config file are (by default) fed to the +The input files mentioned in the configuration file are (by default) fed to the C Preprocessor (after being piped through a user defined filter if available). The way the preprocessor works differs somewhat from a standard C Preprocessor. @@ -139,8 +139,8 @@ strings and executes the commands it finds in it (this is the second pass in parsing the documentation). It writes the result directly to the output generators. -The parser is written in C++ and can be found in src/docparser.cpp. The -tokens that are eaten by the parser come from src/doctokenizer.l. +The parser is written in C++ and can be found in \c src/docparser.cpp. The +tokens that are eaten by the parser come from \c src/doctokenizer.l. Code fragments found in the comment blocks are passed on to the source parser. The main entry point for the documentation parser is \c validatingParseDoc() @@ -190,12 +190,12 @@ could extract information from the XML output. Possible tools could be: Since doxygen uses a lot of \c flex code it is important to understand how \c flex works (for this one should read the \c man page) and to understand what it is doing when \c flex is parsing some input. -Fortunately, when flex is used with the `-d` option it outputs what rules +Fortunately, when \c flex is used with the `-d` option it outputs what rules matched. This makes it quite easy to follow what is going on for a particular input fragment. -To make it easier to toggle debug information for a given flex file I -wrote the following perl script, which automatically adds or removes `-d` +To make it easier to toggle debug information for a given \c flex file I +wrote the following \c perl script, which automatically adds or removes `-d` from the correct line in the \c Makefile: \verbatim @@ -240,11 +240,30 @@ $now = time; utime $now, $now, $file; \endverbatim Another way to get rules matching / debugging information -from the \c flex code is setting LEX_FLAGS with \c make (`make LEX_FLAGS=-d`). +from the \c flex code is setting \c LEX_FLAGS with \c make (`make LEX_FLAGS=-d`). Note that by running doxygen with `-d lex` you get information about which `flex codefile` is used. +<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`. 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>. \endhtmlonly diff --git a/doc/autolink.doc b/doc/autolink.doc index 98556c5..bf9fe57 100644 --- a/doc/autolink.doc +++ b/doc/autolink.doc @@ -16,7 +16,7 @@ */ /*! \page autolink Automatic link generation - \tableofcontents + \tableofcontents{html,latex} Most documentation systems have special `see also' sections where links to other pieces of documentation can be inserted. @@ -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 3efb31e..a06d09f 100644 --- a/doc/changelog.doc +++ b/doc/changelog.doc @@ -1,130 +1,531 @@ /** \page changelog Changelog -\tableofcontents +\tableofcontents{html,latex} \section log_1_8 1.8 Series +\subsection log_1_8_15 Release 1.8.15 +\htmlonly +<b>(release date 27-12-2018)</b> +<a name="1.8.15"></a> +</p> +<ul> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/851">851</a> - A function cannot be documented as related to two classes. [<a href="https://github.com/doxygen/doxygen/commit/e8661c343a4e8ebeaf82b2f926d68167e41be284">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/1041">1041</a> - <a href> doesn't allow <img> as visible part? [<a href="https://github.com/doxygen/doxygen/commit/6c80429e303c89a9cba83569d65d118f8d48f97c">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/1601">1601</a> - Missing warning of undocumented member in member group [<a href="https://github.com/doxygen/doxygen/commit/fe7e597a172fa08a075ac10bbefc572a785e4c0d">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2274">2274</a> - Tooltips are not shown in dot-generated graphs [<a href="https://github.com/doxygen/doxygen/commit/56f6398447407a3826285e527cee547588e2e517">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/1419dca75d33aaf96919ae7a1fc77137d22db14f">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/dbb7838937e7bcbe129dd246438aeabfafc6be32">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2354">2354</a> - caller graph can be improved by having caller on left & callee on right [<a href="https://github.com/doxygen/doxygen/commit/af7dfbdda302e55fb8a62ab224184abccab3d167">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2478">2478</a> - Handling of unnamed parameters (C/C++) unclear [<a href="https://github.com/doxygen/doxygen/commit/7ef7b137d38d7ddcbcef787704317531b44c2baf">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2655">2655</a> - cond/endcond cannot be used in aliases [<a href="https://github.com/doxygen/doxygen/commit/be8465e89496d9b5e0d219d0e3f21aafb70dc299">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2859">2859</a> - Unnamed parameters parsed incorrectly [<a href="https://github.com/doxygen/doxygen/commit/657a6b5348d453fd1351b8c3238426e25acdbbb9">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3206">3206</a> - Fortran: Does not recognize backslash at end of documentation line [<a href="https://github.com/doxygen/doxygen/commit/ad244059b3ffc896905f1000ad40b435d8bbe823">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3361">3361</a> - Merging of consecutive repeated commands creates poorly-structured HTML [<a href="https://github.com/doxygen/doxygen/commit/d9b93a377237efd3f60186c5ba2ba344d4439173">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3677">3677</a> - <![CDATA[ is not handled inside C# comments [<a href="https://github.com/doxygen/doxygen/commit/f2b6959dff5b5d3d2bbbe8204b1fc32905003ad3">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3691">3691</a> - C# keywords 'get' and 'set' are highlighted as reserved words in C++ documentation source browser. [<a href="https://github.com/doxygen/doxygen/commit/0bdaf4541c2495b3166386992666f842c38642c1">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3892">3892</a> - @var in php is not documented [<a href="https://github.com/doxygen/doxygen/commit/d83265914607c6556fefa852a90b6a16821b0634">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3958">3958</a> - \cond after @string literal containing backslash fails in C# [<a href="https://github.com/doxygen/doxygen/commit/179f80e666d6c017f7130b6b26e687f2b5ea54d9">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4013">4013</a> - Automatic links don't work correctly with operator< and operator<= [<a href="https://github.com/doxygen/doxygen/commit/7508151230301113cf6531bfe631472fa4513d19">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4064">4064</a> - Support for C# nullable type [<a href="https://github.com/doxygen/doxygen/commit/98eb981dba723ed1d71fdcbcd7ca2de0e086b1e0">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4244">4244</a> - Fortran: tagfile.tag:789: warning: Unknown compound attribute `type' found! [<a href="https://github.com/doxygen/doxygen/commit/5088fb700cd0bb4a9ce676ae235d48586229e1ba">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4316">4316</a> - Can't use pound sign in alias command, escaped or unescaped [<a href="https://github.com/doxygen/doxygen/commit/e15c80cbf1c0f35c2d2ddc950e3d653bc24aac4e">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4458">4458</a> - @todo in @param leads to strange confusing message [<a href="https://github.com/doxygen/doxygen/commit/59781ae4ee1937f51836c03bd7c67e1e7be13bfc">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4529">4529</a> - HTML tags <u> and </u> not supported [<a href="https://github.com/doxygen/doxygen/commit/9eec9866fcdab896b53d44056c5afbc0b6a6373d">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/b4e535197890521306d30e0713ca8b88a98f7bf7">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4725">4725</a> - single quote in HTML section of PHP breaks doxygen [<a href="https://github.com/doxygen/doxygen/commit/53d89156855079fcf2f25fe516e6493e42e35f1e">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4771">4771</a> - Not warning of undocumented function parameters [<a href="https://github.com/doxygen/doxygen/commit/2a61c8542284261e74e5d6720ee6165b8202ed99">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4878">4878</a> - Value from enumeration followed with semicolon is not present in java docs [<a href="https://github.com/doxygen/doxygen/commit/e2b0f27d6fca5dacfedc79a1a4eff32d5e9254e9">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4954">4954</a> - JavaDoc @linkplain is not recognized [<a href="https://github.com/doxygen/doxygen/commit/a06b1020839f36e3b2ea73c09d9ead7f75983549">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5032">5032</a> - Line numbers for examples [<a href="https://github.com/doxygen/doxygen/commit/0b4b3698b29436b299d4e4a315d610bc1ab98acb">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5068">5068</a> - The 'Examples:' section; bad/missing style and incorrect spelling [<a href="https://github.com/doxygen/doxygen/commit/12eaf6afe565ae1f7d440080205ddb76585bd31d">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5213">5213</a> - Generated Doxyfile differs from result of doxygen -u [<a href="https://github.com/doxygen/doxygen/commit/406b442fc3d0360e387324ff1c08251d86a1d035">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/58d4ad3cd25569f09b31c4b80bc145477c6d61cb">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5327">5327</a> - <img> on a \page does not copy the image to the html output folder [<a href="https://github.com/doxygen/doxygen/commit/4fcf0ebe7f8b5040fa6b8cca72de6cfa774d4b15">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5366">5366</a> - Error with inserting images to PDF with Markdown [<a href="https://github.com/doxygen/doxygen/commit/7ef3ba54570275a423ce52f65437607446c15b12">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5442">5442</a> - Misparsed comments leading to missing call graph [<a href="https://github.com/doxygen/doxygen/commit/ec8a1a465ef6b4cbcba9b7b9b9cbdf87e39c7bba">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5539">5539</a> - Error message when using memberof in a C macro [<a href="https://github.com/doxygen/doxygen/commit/65a3129eea3d3f807fa6a641087c26c3d0100eac">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5547">5547</a> - "remove" is treated as a keyword (green) in the source browser for C++ [<a href="https://github.com/doxygen/doxygen/commit/55e020ce14abfa2dc2ee395fefd7b1da33180e70">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5677">5677</a> - Negative sign in -Foo::Bar ruins hyperlink in generated output [<a href="https://github.com/doxygen/doxygen/commit/5a9bfc176eb3da266f44bd5cb0b38975c812e49c">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5725">5725</a> - Field with name "internal" confuses documentation builder. [<a href="https://github.com/doxygen/doxygen/commit/89f808f75f7d39962a0b9dba4f479b5c6d6d9a24">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5765">5765</a> - \todo at end of C# XML comment breaks following todo's [<a href="https://github.com/doxygen/doxygen/commit/c6adc51933fcb58970bbcf89465d57edc2d19c0d">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5783">5783</a> - Navigation incorrect with escaped symbols [<a href="https://github.com/doxygen/doxygen/commit/09af3e03a55a5b02ebb6254c39a09877c8bd671b">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5784">5784</a> - Doxygen not creating call graphs for C# methods if namespace contains the classname [<a href="https://github.com/doxygen/doxygen/commit/5f9be083471dad47a9b3ad59d85bf04d3a855001">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5818">5818</a> - Main page absent in TOC of CHM, if PROJECT_NAME is empty [<a href="https://github.com/doxygen/doxygen/commit/887db516c1b0163139db971c5aa720804cc23f37">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5853">5853</a> - Can't suppress @author, @date and @copyright information in the detailed file description [<a href="https://github.com/doxygen/doxygen/commit/39232901e3577f6e548353b89c4338cc8ba11016">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5901">5901</a> - Macros (@test, @todo, etc) used with PHP namespaces causes illegal command warning [<a href="https://github.com/doxygen/doxygen/commit/bf793310d5d493d19b6cb8840151ab38659dd58f">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5929">5929</a> - \internal stops all parsing if used inside a section [<a href="https://github.com/doxygen/doxygen/commit/4e71a72e6c826bee54f2aba55a329c2032a83c66">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6025">6025</a> - Make maxLineLen of latex output configurable [<a href="https://github.com/doxygen/doxygen/commit/ee1ea269e1c684cf5ff39ed836fd8af288837275">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6041">6041</a> - PHP: New array syntax not supported when parsing initial value [<a href="https://github.com/doxygen/doxygen/commit/7d325579b7b38a898d3766d186f9358d899dc304">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6104">6104</a> - EXTERNAL_GROUPS lose hierarchy [<a href="https://github.com/doxygen/doxygen/commit/730b7827a8e6dd4ef82d91b6ac6c3d58f95313e3">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6118">6118</a> - Title in rtf file is incorrect when overridden by user in extension file [<a href="https://github.com/doxygen/doxygen/commit/67a22b2d5b9c14a325374dd8857e066b11abb7ca">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6153">6153</a> - Build of PDF with LaTEX breaks [<a href="https://github.com/doxygen/doxygen/commit/bf4c90ae6e433922b011d51401db8eb23a83f294">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6160">6160</a> - Python List as Default Parameter not parsed correctly [<a href="https://github.com/doxygen/doxygen/commit/e5e75b7f713251dd6caa472f9c5fb8d49e36ff5a">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6172">6172</a> - CREATE_SUBDIRS breaks SERVER_BASED_SEARCH [<a href="https://github.com/doxygen/doxygen/commit/c95b50542c519a66d6adbdc7031c5a5bafb75929">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6175">6175</a> - plantuml:an unwanted newline is generated after @startuml [<a href="https://github.com/doxygen/doxygen/commit/032d8fd0cd8bd33448186081c54168889e25d55e">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6197">6197</a> - Czech/Slovak language documentation with tables from LaTeX to PDF is not possible [<a href="https://github.com/doxygen/doxygen/commit/509cf2db2304ee74e3fa1a580f33dbea3cdfca30">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6208">6208</a> - Annotated function parameter generates <dt> warning in todo list [<a href="https://github.com/doxygen/doxygen/commit/9277e1466f91d7b2d4190b4e55d6e7b9b5e3962d">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6213">6213</a> - rtf generation [<a href="https://github.com/doxygen/doxygen/commit/be4fb2753c2f028a53d657a7920267a4191cd566">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6214">6214</a> - LaTeX output for \tparam block fails to compile when it contains a \code block [<a href="https://github.com/doxygen/doxygen/commit/8afcb87097c92fd124282a998dad61ea2b16c7ec">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/d59ed22f114398d74d5c3fd1445a7901d26ff93a">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6224">6224</a> - .tex file is wrong when generating a function whose name includes an underline [<a href="https://github.com/doxygen/doxygen/commit/1c55b572b345bf124daaa33d436d2e822b5f6eee">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6269">6269</a> - Disabled controls when `HAVE_DOT` is already set to `YES` [<a href="https://github.com/doxygen/doxygen/commit/8bf975ea2861def50f9b7d4cca0fb4002c991ec0">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6270">6270</a> - Bad handling of Python class members when a class declaration line contains a comment [<a href="https://github.com/doxygen/doxygen/commit/eb72534ade8b9598806fc7e7b08374bd43bb44f3">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6295">6295</a> - doxygen has problem with operator&=() [<a href="https://github.com/doxygen/doxygen/commit/1e935dc5b1a7f01fe1f3545f773eca52629dad09">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6305">6305</a> - XHTML pages are broken several ways [<a href="https://github.com/doxygen/doxygen/commit/5bae9d9ec8e5a253d6f5e8f15be43b85cd7ae0ff">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/ceedc1b7c0e9c2ea6e00d44fae2c0f8f477def69">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6308">6308</a> - When generating xhtml, async attribute on script tags need a value [<a href="https://github.com/doxygen/doxygen/commit/1b8afc8802f7ac40614e95a47ffd3ae152b57987">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6310">6310</a> - Table markdown produces invalid xhtml code [<a href="https://github.com/doxygen/doxygen/commit/eb4af56797a4bd5396c4ecda76196de61e709f56">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6311">6311</a> - Blank rows on class page when using external tag file [<a href="https://github.com/doxygen/doxygen/commit/44960da16786f6fe769b2c45d9be309568c3c1a8">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6312">6312</a> - markdown plantuml use of graphviz fail if plantuml work i code file [<a href="https://github.com/doxygen/doxygen/commit/a50c7551d3e8cb18514f517d36b6ba343596a426">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6316">6316</a> - unescaped double quote in searchdata.js breaks search box functionality [<a href="https://github.com/doxygen/doxygen/commit/ed642b1cabdd2f3f52906a75cae7c477eb1c0378">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6322">6322</a> - incorrect parsing of markdown table [<a href="https://github.com/doxygen/doxygen/commit/efcc4d035e4ecdb3ecc449770a5fd26694717efa">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6323">6323</a> - error: Could not open file .../doc/html/functions_ .html for writing [<a href="https://github.com/doxygen/doxygen/commit/2609f6f49763fd75e5c529788795a07f6559b954">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6324">6324</a> - C#: Incorrect parsing of property definitions containing "//" symbols in one line with "} [<a href="https://github.com/doxygen/doxygen/commit/098bc86187295a77b08c1e5c061ed5788aaa73ae">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6325">6325</a> - Segmentation fault when generating graphical class hierarchy [<a href="https://github.com/doxygen/doxygen/commit/17338710275948c23e0f0b312d004b84976f68bc">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6339">6339</a> - Examples of TCL files fail to display [<a href="https://github.com/doxygen/doxygen/commit/05bec28930831888b6dfb610307a04da2d345924">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6340">6340</a> - Missed warning opportunity: duplicated arguments [<a href="https://github.com/doxygen/doxygen/commit/d39cdf826f15470def2ca36bc636868a62c42bbf">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6345">6345</a> - c# see langword broken [<a href="https://github.com/doxygen/doxygen/commit/7e041a6f5bf32637ebb71589d471586db1d0f7fd">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6346">6346</a> - Doxygen crash when using \code{.markdown}...\endcode in VHDL source [<a href="https://github.com/doxygen/doxygen/commit/1431d16ca2a8a20a72f029b48e4b178aa59009e3">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6350">6350</a> - Broken extension test in FileDef::generateSourceFile() [<a href="https://github.com/doxygen/doxygen/commit/b1792d19afd245f33667e6170b9f08a8528e07f8">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6352">6352</a> - "unexpected token TK_EOF as the argument of ref" when target starts with a digit [<a href="https://github.com/doxygen/doxygen/commit/07ae32a61e779647bace1efdbf8d15b35871fcca">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6362">6362</a> - Adjacent xrefitems always added to first list present on page [<a href="https://github.com/doxygen/doxygen/commit/a6b0a7fe237c5eb6e76073d366f281c8413eb0dd">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6363">6363</a> - Backslashes in default values confuse the parser (and cause params to be ignored) [<a href="https://github.com/doxygen/doxygen/commit/b33c0e0274ee25b1a414a79c13521ef8defecbda">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6368">6368</a> - LaTeX: Class scrbook Error: undefined old font command `\tt' [<a href="https://github.com/doxygen/doxygen/commit/52c0b2e25fc3bb15be1d240d86701a5827630db0">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6370">6370</a> - Invalid 3-byte UTF8 found in input of graph [<a href="https://github.com/doxygen/doxygen/commit/21ce6ed9d2a37df2de846d48398261bb087c0a09">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6373">6373</a> - Collapsed treeview arrow displays as emoji in Microsoft Edge [<a href="https://github.com/doxygen/doxygen/commit/293e5c9ba4b88924e0cc4b513318cf822f5c63eb">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6378">6378</a> - @cond does not stop at @endcond Fortran [<a href="https://github.com/doxygen/doxygen/commit/a0db6fdbff2e21502bb2ac7437c5bd57d515d83b">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6517">6517</a> - Emoji support [<a href="https://github.com/doxygen/doxygen/commit/47fee387821113956e10fffa79ea22062de8c817">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/e7fde5d604faf27dec989c8894e949d48676e0c1">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6524">6524</a> - Markdown formats missing in doxygen outputs. [<a href="https://github.com/doxygen/doxygen/commit/dee50d6921e2f6fe2a0dd2e9b50fa51cd1fc4c60">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6533">6533</a> - PHP: Namespaced typehints in deprecated methods not handled correctly [<a href="https://github.com/doxygen/doxygen/commit/97f2d220240a1f6692627171398a06a3fa238639">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6547">6547</a> - Call graph missing due to ALIASES [<a href="https://github.com/doxygen/doxygen/commit/0077ab48f682cca9caf99b2d92a8448d1d66cb98">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/93b085e465a42eb26ef8305edfc6d61ba6ce858f">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6566">6566</a> - INHERIT_DOCS not working for python [<a href="https://github.com/doxygen/doxygen/commit/f56ce241a09dff819c194be4585aae99f35d85f1">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6580">6580</a> - xrefitems not listed if the page is referenced multiple times [<a href="https://github.com/doxygen/doxygen/commit/50d47c3383becb7ba7cedc53bb43b99898df7481">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6589">6589</a> - anchor after test command in a namespace produces duplicate tests [<a href="https://github.com/doxygen/doxygen/commit/cc3cb095a035db0037604dca2109c927e3ba7df3">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6594">6594</a> - using ingroup and anchor causes tests to disappear [<a href="https://github.com/doxygen/doxygen/commit/ebbb2ca96a23951dbd82b976ace0d01470e8a9d6">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6597">6597</a> - SIGSEGV presumably caused by C++ "using" declaration [<a href="https://github.com/doxygen/doxygen/commit/efc33490c36cb7c21955901ce0abccc343c0c7b3">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6601">6601</a> - tparam HTML gobbles up lines after the tparam comment [<a href="https://github.com/doxygen/doxygen/commit/3b95f4936ce8841f88fdaebdfe80da8eb0504cd3">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6612">6612</a> - Issue with handling of emoji [<a href="https://github.com/doxygen/doxygen/commit/d748615666f7fac43880f0d3ec859d11ad304deb">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6632">6632</a> - References to Objective C protocols by name broken in 1.8.12 [<a href="https://github.com/doxygen/doxygen/commit/c0b367ecd4a2f48cde85d4f5aed416892d3fa775">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6657">6657</a> - "QGDict::hashAsciiKey: Invalid null key" when using anonymous union/struct [<a href="https://github.com/doxygen/doxygen/commit/62f8c5346b2f3ea492404ae85942a0de4b091c71">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6690">6690</a> - Regression in handling of shorthand signed/unsigned types in function parameters (with bisect and test case) [<a href="https://github.com/doxygen/doxygen/commit/6833f142284376d256688511c5111dda6df9d79d">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6691">6691</a> - Multiple issues with emoji matching [<a href="https://github.com/doxygen/doxygen/commit/a06e660406d655568635521f6df161e3a7e5734b">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6692">6692</a> - XML TOC generation is not backwards-compatible with 1.8.14 [<a href="https://github.com/doxygen/doxygen/commit/15541e75816673fdc51d90820d6620e98b8fcd4b">view</a>] +<li>'self' keyword in PHP documentation [<a href="https://github.com/doxygen/doxygen/commit/7e591135c56c3679c5ee63aa78f6baeae2cde63f">view</a>] +<li>Added: support RTL for DocXRefItem in html - Removed: support RTL form Return section in html, for consistency with parameter sections [<a href="https://github.com/doxygen/doxygen/commit/08be7a8ef12518736b2530504a28904eec3e47ab">view</a>] +<li>Fixed: list item bullets overlap floating elements in html - Fixed: fragment lines overlap floating elements in html [<a href="https://github.com/doxygen/doxygen/commit/dda245dbab60bddab4e7593cccbf59117d00a812">view</a>] +<li>Fixed: text-align of rtl toc [<a href="https://github.com/doxygen/doxygen/commit/2ad516fef49f95b9edafe7ade6d1ed6d35cb75f7">view</a>] +<li>Fixed: last line underline overlap border in html fragment [<a href="https://github.com/doxygen/doxygen/commit/1245145d6710abbb58057dc555fccac08ac8a3fa">view</a>] +<li>A few more language updates [<a href="https://github.com/doxygen/doxygen/commit/9d35bd4f5865a63f3daacc8d4ab613fb4743bb72">view</a>] +<li>Add VHDL strings to Translator class and add german translations. [<a href="https://github.com/doxygen/doxygen/commit/f1fea3603fa3e561d8f1efff5bc685e4484e7998">view</a>] +<li>Add commands to handle referenced by relation and references relation [<a href="https://github.com/doxygen/doxygen/commit/0697535ad38ed122964c4673b102a8e30ad4369f">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/6c0436303d76a3df4c323bf6ca1e5716b6027ec0">view</a>] +<li>Add formula (images) to RTF output [<a href="https://github.com/doxygen/doxygen/commit/79ac5232cf029f3d40543641e92daa8aaa1c9f7c">view</a>] +<li>Add function annotations support [<a href="https://github.com/doxygen/doxygen/commit/72c5c25695273c96f30f118cb8270a037e28eb7a">view</a>] +<li>Add possibility for adding doxygen configuration items to, all, tests during runtime. [<a href="https://github.com/doxygen/doxygen/commit/bb23893d5d5267942092bb93fd22b14dea9c1135">view</a>] +<li>Add support for std::shared_ptr [<a href="https://github.com/doxygen/doxygen/commit/6c380ba91ae41c6d5c409a5163119318932ae2a3">view</a>] +<li>Add support of dict/set in annotations and default values [<a href="https://github.com/doxygen/doxygen/commit/ec98b6f662024fc3d5bf47e33630fc8d06bde6c6">view</a>] +<li>Add variadic arguments support to @link and @ref, aka '...' arguments, fixes [<a href="https://github.com/doxygen/doxygen/commit/dd88186b18613388902e4921e5203375458783b6">view</a>] +<li>Add variadic function arguments '...' regression tests [<a href="https://github.com/doxygen/doxygen/commit/fce142b4282d80f16fff53ba1cbd2572119b17ef">view</a>] +<li>Add variadic template function regression tests [<a href="https://github.com/doxygen/doxygen/commit/818f0458205a2965f0a676265e2454450a4c3455">view</a>] +<li>Added *.ice files as a recognized file type. Added a Slice-optimized output mode. [<a href="https://github.com/doxygen/doxygen/commit/3a97099d5e6afd298486f219694a7fb5eff67fea">view</a>] +<li>Added French translation [<a href="https://github.com/doxygen/doxygen/commit/7d058fe977db011e35cbfd0247bfa8d7f9435998">view</a>] +<li>Added missing #include for util.h to portable.cpp [<a href="https://github.com/doxygen/doxygen/commit/74c9b5f67758ad21f014f6447d55e8aea6722cb5">view</a>] +<li>Added not for usage of [TOC] together with Markdown headers [<a href="https://github.com/doxygen/doxygen/commit/19e2abe877cafbe4ab56cbc50d913dfaf249e450">view</a>] +<li>Added some VHDL code coloring [<a href="https://github.com/doxygen/doxygen/commit/cb331331f7b09aa44376596e83d29b3191a55b43">view</a>] +<li>Added some missing default types for argument matching [<a href="https://github.com/doxygen/doxygen/commit/72f1b53bb5aebfebf829a684a7f16de1c07873c7">view</a>] +<li>Added substitution variant for character substitution [<a href="https://github.com/doxygen/doxygen/commit/bd6c93b2d26a9a80df66a25404613e285ef35815">view</a>] +<li>Added support for RTL(right to left) languages like Arabic and Persian in HTML output [<a href="https://github.com/doxygen/doxygen/commit/5885c89d6b30ca607f84794d0de6800f49dd327b">view</a>] +<li>Added test case for \ref, and fixed representation of operator->*() [<a href="https://github.com/doxygen/doxygen/commit/2b4257860046b3863b7c478d7f6ad5bdfcab757b">view</a>] +<li>Adding debug options to vhdl parser generator [<a href="https://github.com/doxygen/doxygen/commit/6ad7854e72abda652bdf034d7cf355dcb136a7fe">view</a>] +<li>Adjustment of xhtml1-transitional.dtd [<a href="https://github.com/doxygen/doxygen/commit/2427e160d2299d72813f52f0862d504956c6c209">view</a>] +<li>Automatic detection of UCS-2 based on BOM corrected [<a href="https://github.com/doxygen/doxygen/commit/f3b423989086728ded99492e61a0a5c127f21f69">view</a>] +<li>Better HTML output for VHDL Ports [<a href="https://github.com/doxygen/doxygen/commit/36afe5e25c10dfd5a6208df7c8892eb2bb7498c5">view</a>] +<li>Bold text terminated by plus sign [<a href="https://github.com/doxygen/doxygen/commit/5ddb9f02b9fdaf6e3e25f0281d11e6d516ab4aad">view</a>] +<li>Bug fix for plantuml [<a href="https://github.com/doxygen/doxygen/commit/cbb0ae9a02305e0464737b316abd35e8e6d7c1a2">view</a>] +<li>Bump minimal deployment target for OSX to 10.9 to avoid deprecation warning while linking [<a href="https://github.com/doxygen/doxygen/commit/58f9985ba779cbf733f78a720060ff0225f0156d">view</a>] +<li>C++11 features used in Doxygen [<a href="https://github.com/doxygen/doxygen/commit/e2b07563dd9cc21f8472570d2cc8d6cd69d536b8">view</a>] +<li>Cannot Generate Layout File using -l [<a href="https://github.com/doxygen/doxygen/commit/5c3bcaadff1a693dab41ee49701dc12df7d6b09a">view</a>] +<li>Cannot properly jump from brief to detailed function description [<a href="https://github.com/doxygen/doxygen/commit/edfa0d2a95dacfea8c2cddc1da1e37728d1cc608">view</a>] +<li>Change german translation of trClassDocumentation() for VHDL output. [<a href="https://github.com/doxygen/doxygen/commit/fe88231028cc137b9e97ae1024ce8781244f3103">view</a>] +<li>Changed implementation, added test case [<a href="https://github.com/doxygen/doxygen/commit/0a384496099569c2a675a94c5af06ad83cccb247">view</a>] +<li>Changed mail address and removed obsolete files [<a href="https://github.com/doxygen/doxygen/commit/92aae074ff9115e13295dcc9eb1515ed1d62319c">view</a>] +<li>Changed refiltering to forced use of insideTabbing [<a href="https://github.com/doxygen/doxygen/commit/8deca51e0c8cca7873d40d5670edbea36ea38ee3">view</a>] +<li>Changed state guard instead of adding pattern check+reject [<a href="https://github.com/doxygen/doxygen/commit/510f342b4d6f61f4ea6f0e7cab5531895bc86a20">view</a>] +<li>Close last code line properly. [<a href="https://github.com/doxygen/doxygen/commit/ef9c151c86073f107ec6556b779cd7b8da3154eb">view</a>] +<li>Combined lrRank and rank parameters for computeMd5Signature [<a href="https://github.com/doxygen/doxygen/commit/cbca2bdcd77ce0ab6b907cf2d4bab65340a57f00">view</a>] +<li>Consistency between 'generate' and 'update' startup option [<a href="https://github.com/doxygen/doxygen/commit/c17bfe7f9ee46c9cf41bbf16ef72607793c80036">view</a>] +<li>Consistency between preprocessor and handling of \cond and \if [<a href="https://github.com/doxygen/doxygen/commit/50019481eb64142248d74bb89ad2c6e2b50e69f2">view</a>] +<li>Consistency for "group" commands [<a href="https://github.com/doxygen/doxygen/commit/3514452268bf860ac7516185adc0907817ccda97">view</a>] +<li>Consistency in headings and layout for template parameters (tparam) [<a href="https://github.com/doxygen/doxygen/commit/626e56ee5c6d6d2f6c51bd64855c70500b28472e">view</a>] +<li>Consistency of Index name in LaTeX output [<a href="https://github.com/doxygen/doxygen/commit/84c791d75dd1e9026cbbc1a338316656b0c03896">view</a>] +<li>Consistency of environment variables between config and code [<a href="https://github.com/doxygen/doxygen/commit/35b7de3e692b127f8192900e1ae1152221afe76b">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/b1a7c9f513fd7c15d86d536cad64338dfd2b617c">view</a>] +<li>Consistent warning messages [<a href="https://github.com/doxygen/doxygen/commit/1a16a1be6eff7c32795455e47c09b9452f7c3a4e">view</a>] +<li>Correct list of not used translator functions [<a href="https://github.com/doxygen/doxygen/commit/ca68fbb7cb8937b0a90fcd1b326c00e6e413e70c">view</a>] +<li>Correct typing error in test 5 [<a href="https://github.com/doxygen/doxygen/commit/a705a7a3f3cd0689e0185d92c4f0542c83b9dcb6">view</a>] +<li>Correct typing error in test 51 [<a href="https://github.com/doxygen/doxygen/commit/03fad37f3bd695d0a30333e8cecc3931c4f870ba">view</a>] +<li>Correct typing error in warning message. [<a href="https://github.com/doxygen/doxygen/commit/bae4bd915ac018c4a3ce681067e0a1a51017e418">view</a>] +<li>Corrected description of XML output for emoji characters [<a href="https://github.com/doxygen/doxygen/commit/7d86cf4c84221696cbd2879809dba1e85d2dbaa6">view</a>] +<li>Corrected warning in case of a not supported output format with \image command. [<a href="https://github.com/doxygen/doxygen/commit/e570fd61c6975ef067efbf6a9c09b79cc58d96f5">view</a>] +<li>Correcting "Definition at line @0 of file @1." [<a href="https://github.com/doxygen/doxygen/commit/afecea64c225ec3c8ef9c84235d9fe091af588ca">view</a>] +<li>Correcting labels for citations [<a href="https://github.com/doxygen/doxygen/commit/e2306e7ff24e72d49893eb9ebc568b468298e236">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/fcb7d9fb380b714e1db9a279ceeba5af4cf59965">view</a>] +<li>Correcting tag example and uniform calling all examples [<a href="https://github.com/doxygen/doxygen/commit/dfdf4323434ec466613e9c358da98a4be868986c">view</a>] +<li>Correcting tag in printdocvisitor [<a href="https://github.com/doxygen/doxygen/commit/6ea7d92e56c929af29aafc7ea072ce465d5961d9">view</a>] +<li>Correcting warning messages and echoing unknown command [<a href="https://github.com/doxygen/doxygen/commit/a68e6c0724f99dfa6cea25f7d56fb6077100fc85">view</a>] +<li>Correction for `doxygen -g` [<a href="https://github.com/doxygen/doxygen/commit/f5e25bba9c01e473991ea6c7d8622a40e5c8f92d">view</a>] +<li>Correction in example of FILE_VERSION_FILTER [<a href="https://github.com/doxygen/doxygen/commit/b278c8f658a2507076840f37287e7fe1e3357b54">view</a>] +<li>Correction in title of FAQ [<a href="https://github.com/doxygen/doxygen/commit/f1148cc406d6e1eefd146f35e766b62bd376cdc3">view</a>] +<li>Correction internal documentation [<a href="https://github.com/doxygen/doxygen/commit/55bdda94dc8661dc740e26e6fb91beb7e2bb7ec7">view</a>] +<li>Correction of some coloring of code comments in VHDL, adding data type 'positive' [<a href="https://github.com/doxygen/doxygen/commit/fdd10f2415c65a9a34d64c985ea5ff0a6f4b6654">view</a>] +<li>Create command for escaped equal sign [<a href="https://github.com/doxygen/doxygen/commit/8292eeebd57aea339ea4ebad2267402d1183b097">view</a>] +<li>Create test possibilities for xhtml and pdf output [<a href="https://github.com/doxygen/doxygen/commit/4575eef95039149eb19c4f5e5bf99e67e36afb5a">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/95a6451107f8964b1c2290e2f4e9761a64be124b">view</a>] +<li>Debug output commentcnv independent of QUIET setting [<a href="https://github.com/doxygen/doxygen/commit/3c0327c1f8461a029c83b744d076617e28cd26bf">view</a>] +<li>Difference between standard and used Doxyfile [<a href="https://github.com/doxygen/doxygen/commit/ed1fb80b55bab16443b211ebeb1cd45bb630b08b">view</a>] +<li>Difference between standard and used Doxyfile (list) [<a href="https://github.com/doxygen/doxygen/commit/c6ec3a813f61b1a5c15d959b923c4f26dd2f62c5">view</a>] +<li>Disabled Appveyor documentation build due to unreliability of MikTeX download [<a href="https://github.com/doxygen/doxygen/commit/8c7b1352474e4da5024cfc3ecc25a486b1d4ef2a">view</a>] +<li>Disabled debug print [<a href="https://github.com/doxygen/doxygen/commit/200353a0886f5ee20101b7af4b55af498adc495f">view</a>] +<li>Documentation EXTENSION_MAPPING [<a href="https://github.com/doxygen/doxygen/commit/967be1c5a03c4e80149c984e5a6b208c9f65f824">view</a>] +<li>Documentation correction [<a href="https://github.com/doxygen/doxygen/commit/f1274b44ad4cb7b4c1a04893b5ad17f830600af4">view</a>] +<li>Documentation correction CLANG option usage [<a href="https://github.com/doxygen/doxygen/commit/0e80abeb4c0966ef66a616c21ecb71583465955a">view</a>] +<li>Documentation correction include command with options [<a href="https://github.com/doxygen/doxygen/commit/731758537f45b602b000cb081d8b642fc54141da">view</a>] +<li>Documentation corrections [<a href="https://github.com/doxygen/doxygen/commit/17c8c0ee8c0dd06938f3b85db6361de24c1bbe58">view</a>] +<li>Documentation internet addresses [<a href="https://github.com/doxygen/doxygen/commit/78a73c52935396f0158ed9dd58909424981bee7e">view</a>] +<li>Documentation update regarding right font usage in architecture chapter [<a href="https://github.com/doxygen/doxygen/commit/824025bdec187c07b744e4a1fa0837b932d13679">view</a>] +<li>Does not generate TOC for markdown [<a href="https://github.com/doxygen/doxygen/commit/ea361e255efa1286566fef7f38c1ce5a01a44f33">view</a>] +<li>Don't link to non existing / not accessible namespaces , in CSharp, in the source code [<a href="https://github.com/doxygen/doxygen/commit/28fe14198cf1da1f6bef42d4cba4cfbec35c7155">view</a>] +<li>Doxygen creates empty image titles for Docbook output [<a href="https://github.com/doxygen/doxygen/commit/2e3c07357f208033b502bb6cc5ae015ff76668de">view</a>] +<li>Doxygen manual doesn't have lines around markdown tables / cells. [<a href="https://github.com/doxygen/doxygen/commit/2c5a80f301032ab4653736f767037f2cd6c0ef61">view</a>] +<li>Doxygen manual is not XHTML compliant [<a href="https://github.com/doxygen/doxygen/commit/565c21b260ca58c9d6b845ecc64f8c4aaa9a9a96">view</a>] +<li>Drop down lists in menu bar missing [<a href="https://github.com/doxygen/doxygen/commit/09ae56fcfc540ab79378ba83fdb95ff28401786c">view</a>] +<li>Enable comma as separator in configuration lists [<a href="https://github.com/doxygen/doxygen/commit/7c76f37c452ad49f1b19a661525ceebafc036a6e">view</a>] +<li>Enable in page table of contents for LaTeX [<a href="https://github.com/doxygen/doxygen/commit/ba30b13cfd4910a5913f080a039fc429ec8a7e3f">view</a>] +<li>Enable in page table of contents for XML and add maximum level to in page table of contents [<a href="https://github.com/doxygen/doxygen/commit/5b735d5118581e3bca686f79de341b8b2e76691f">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/956342ae0b2e09f5e398778c255006f9d26e7b52">view</a>] +<li>Enable possibility of CLANG for Cygwin [<a href="https://github.com/doxygen/doxygen/commit/9e29820e9f0207230ac05facb93f414cb5239ae5">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/b0f638cb3a63ba4e73657ed5fd6276e1814391d7">view</a>] +<li>Enable possibility to run single tests [<a href="https://github.com/doxygen/doxygen/commit/a34987da94ea06a53bf4841e09436db1748bf306">view</a>] +<li>Ensure all language files are reset [<a href="https://github.com/doxygen/doxygen/commit/4663bed1653e1009bf06a6e21907e93ad74f281f">view</a>] +<li>Expand sqlite3gen's breadth, depth, and quality [<a href="https://github.com/doxygen/doxygen/commit/61cddaf2d440aff48868fc3a50185a2788917914">view</a>] +<li>Extending \cite command with '-' and '?' characters. [<a href="https://github.com/doxygen/doxygen/commit/8ef2c893f372d44225f9536bac379387e8d2bc44">view</a>] +<li>Extending tests with extra possibilities [<a href="https://github.com/doxygen/doxygen/commit/8176639e13357f74d317c631a5bf01a60bb543af">view</a>] +<li>Fix French lang build [<a href="https://github.com/doxygen/doxygen/commit/e36d06860e9e1441a402ec8c9a7e03742eb85e9a">view</a>] +<li>Fix HTTPS links [<a href="https://github.com/doxygen/doxygen/commit/4cda8f612403c6feb6b596c101ddf1e5d6fe35e0">view</a>] +<li>Fix VHDL Latex documentation having two chapters with the same name. [<a href="https://github.com/doxygen/doxygen/commit/efd2921d1e3a3f9b7f994673d0af6d70b1888b98">view</a>] +<li>Fix Windows build failure [<a href="https://github.com/doxygen/doxygen/commit/e2bbd54c5eb915c6dfecef1895b336d4b16c9df3">view</a>] +<li>Fix annotation with default value parsing [<a href="https://github.com/doxygen/doxygen/commit/03894677569451502c4bbc0b5f656244357dd907">view</a>] +<li>Fix building with Visual Studio 2013 [<a href="https://github.com/doxygen/doxygen/commit/dcd7390a61abc1da656c10dde282191e651a36fb">view</a>] +<li>Fix for 'Definition at line' points to end of multiple-lined definition for Python #6706 [<a href="https://github.com/doxygen/doxygen/commit/babfc33370e28963f890a5f05355aa7778700ca6">view</a>] +<li>Fix for module quicklinks [<a href="https://github.com/doxygen/doxygen/commit/109bd64ceb2fbe41cd1f94011edd51f03b28fbdb">view</a>] +<li>Fix for unbounded memory usage due to a bug in \ref const matching #6689 [<a href="https://github.com/doxygen/doxygen/commit/f30a5fa78d9460550c7e921e73e11087f90b7db3">view</a>] +<li>Fix potential hangup when merging scopes [<a href="https://github.com/doxygen/doxygen/commit/c506514a32991918e06ec75ebaad3f6eaea1dc9b">view</a>] +<li>Fix regression due to move of markdown processing [<a href="https://github.com/doxygen/doxygen/commit/48e838a1d15c5feb2247f9c93bebc971b871800c">view</a>] +<li>Fix scanner.l for Slice [<a href="https://github.com/doxygen/doxygen/commit/d5fd75574bc816e95f1bcdcdb8e2121949d484d8">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/d0f90ba4a1b7a8e2b5a15e7d8a05d0f484e8f3b5">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/e78925a2142bb254dfc8ffc993a21f54ee4cf461">view</a>] +<li>Fix/New: add variadic function args '...' support to @link [<a href="https://github.com/doxygen/doxygen/commit/6b29c4e55009771545305fe3ec3ba92e8d0ba38e">view</a>] +<li>Fix/New: add variadic function args '...' support to @ref [<a href="https://github.com/doxygen/doxygen/commit/037f465e934ce122c8412b55548a153ad517aba0">view</a>] +<li>Fixed bug in URL [<a href="https://github.com/doxygen/doxygen/commit/fbabed9704a0d9876676122515be2651ab696cf1">view</a>] +<li>Fixed compile errors in clang and gcc [<a href="https://github.com/doxygen/doxygen/commit/2a539e12679a244389c781f6146d7f6bd9c82048">view</a>] +<li>Fixed compiler warning for nested /* in scanner.l [<a href="https://github.com/doxygen/doxygen/commit/c78c338fffbdbb9b2379b1896e647f7cc697da57">view</a>] +<li>Fixed differently by changing root cause for introducing the space [<a href="https://github.com/doxygen/doxygen/commit/890e3567470b0767c5ebe52207d1c75a96e888aa">view</a>] +<li>Fixed documentation to point to GitHub issue tracker [<a href="https://github.com/doxygen/doxygen/commit/d72bfbd272669f22bfa615549dc737199a48dc95">view</a>] +<li>Fixed incorrect XHTML output for test 021 [<a href="https://github.com/doxygen/doxygen/commit/d33a129d784f2b0f823f14a008e929513b302ad3">view</a>] +<li>Fixed logic error [<a href="https://github.com/doxygen/doxygen/commit/301425d57d422431037779e52e0ffcc93e509a35">view</a>] +<li>Fixed merge problem [<a href="https://github.com/doxygen/doxygen/commit/c4b853d749fcaffb2f2c142dcd14e48ab049013e">view</a>] +<li>Fixed one remained compile error in clang [<a href="https://github.com/doxygen/doxygen/commit/3977359bd3fb5527a237c2c0cdb61407f2d85464">view</a>] +<li>Fixed problems with emoji handling and added a test case for it [<a href="https://github.com/doxygen/doxygen/commit/348a8cc72dd481fa9e65e6209946bfeef5716914">view</a>] +<li>Fixed some more small memory leaks [<a href="https://github.com/doxygen/doxygen/commit/b6662b61dd83be32481a1c83e092082e9d797f0a">view</a>] +<li>Fixed two small memory leaks [<a href="https://github.com/doxygen/doxygen/commit/0591146bb406c8601c452f7a8a9e6e24823ce8d9">view</a>] +<li>Fixing coverity messages [<a href="https://github.com/doxygen/doxygen/commit/99f948c038b763028fcb95ef2a65fdbc1d5f9520">view</a>] +<li>Fixing coverity messages (Namespace tag) [<a href="https://github.com/doxygen/doxygen/commit/b7cdfc8d47dc7a7f86605bbbc74aa78501d2bc33">view</a>] +<li>Fixing problem with possible not initialized variable (endless loop in VS 2017 debug) [<a href="https://github.com/doxygen/doxygen/commit/0a4b995cdd7735aaf42c423eed2889db5b8617ef">view</a>] +<li>Fortran code coloring improvements (REAL and comment lines) [<a href="https://github.com/doxygen/doxygen/commit/2e570d3762a412f87fff19ea4a30d60b171a6ea4">view</a>] +<li>Fortran improvements [<a href="https://github.com/doxygen/doxygen/commit/5f11678370f55e491fa9a04b7fd03cd473f8982f">view</a>] +<li>Fortran improvements (2) [<a href="https://github.com/doxygen/doxygen/commit/4013e52ba0f87eb12f8a1c8cb3b2714c0d519a81">view</a>] +<li>Fortran scanner abort message [<a href="https://github.com/doxygen/doxygen/commit/ee12e104e1f43aa4e5301b314f7c620dbbf58ecc">view</a>] +<li>French translation for VHDL additions [<a href="https://github.com/doxygen/doxygen/commit/76098e99ae17ed2bf69e3ac17d97b496d3d706f8">view</a>] +<li>Further simplified the fix [<a href="https://github.com/doxygen/doxygen/commit/f194a3165042428359ec5b5af7e9bad7878c0536">view</a>] +<li>Generating doxygen documentation on Windows (with MikTex) [<a href="https://github.com/doxygen/doxygen/commit/df9a47bd2080ce6385f2a21c6d868755ba7b1f67">view</a>] +<li>Handling Fortran functions in call graphs [<a href="https://github.com/doxygen/doxygen/commit/58cf0414b9bfc5d7216e75e00beb115d91e36245">view</a>] +<li>Heading in rtf. #6522 https://github.com/doxygen/doxygen/issues/6522 [<a href="https://github.com/doxygen/doxygen/commit/b90d628a80179f2a2c82f7d43bbec1df3f8190bb">view</a>] +<li>Ignore build* directories and not just build [<a href="https://github.com/doxygen/doxygen/commit/bad04c77bd626e5badf7654136b6a5dfa20c6b93">view</a>] +<li>Implementation Fortran ENUM / ENUMERATION [<a href="https://github.com/doxygen/doxygen/commit/f5ffd481a44fa5eae225ce728d1777070c4143e1">view</a>] +<li>Implementation of standard generator for docbook output [<a href="https://github.com/doxygen/doxygen/commit/7340b1c0e767b0ee88ce389df653d3d2a77801cd">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/d198c549fb88769912761d75277680438d88d69b">view</a>] +<li>Improved robustness of the emoji feature [<a href="https://github.com/doxygen/doxygen/commit/c3ee766d0ad5721c753581e7f87026614c0730e1">view</a>] +<li>Improvement LaTeX output [<a href="https://github.com/doxygen/doxygen/commit/66a728cdcf50baeef45f78a1180c5ce86fe734af">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/496ebe413b20d406ef4a3b6b2a5966461c30af6c">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/4c7ed9016d24482cb2b46363537c95954a809012">view</a>] +<li>Improvement regarding width and title for docbook [<a href="https://github.com/doxygen/doxygen/commit/f5390468388b80c1f0279f5942d05cb325744b28">view</a>] +<li>Improvements in handling special characters in Latex [<a href="https://github.com/doxygen/doxygen/commit/0f8902275a4c02196d4eb1398e621a349355410a">view</a>] +<li>Include "empty" directories in the documentation if they contain a `.dox` file (or similar) documenting the directory itself. [<a href="https://github.com/doxygen/doxygen/commit/5d79d65df3b66554c8e9630fd3bea322c3e36f0d">view</a>] +<li>Include header for CompilationDatabase [<a href="https://github.com/doxygen/doxygen/commit/9606604a18ac78165b92099bc822ccbddda32bb7">view</a>] +<li>Include height item in XML output [<a href="https://github.com/doxygen/doxygen/commit/43e606f185c7fb334062521eff4905d047f78503">view</a>] +<li>Inconsistency in respect to tgroup in docbook [<a href="https://github.com/doxygen/doxygen/commit/529244ed7be4c289c46c66f0d7aa248e80fbacdf">view</a>] +<li>Incorrect tag sequence for xhtml with class diagram possible [<a href="https://github.com/doxygen/doxygen/commit/2bcda330add9279f777990b450f182be16b67e80">view</a>] +<li>Incorrect closing tags for in page table of contents (XHTML) [<a href="https://github.com/doxygen/doxygen/commit/9ef709e59187f18229fce1f9443547ad93f17be0">view</a>] +<li>Incorrect closing tags for in page table of contents (docbook) [<a href="https://github.com/doxygen/doxygen/commit/71b0a3ab98690e20208280c1715807786d56cbc2">view</a>] +<li>Incorrect number of start / end paragraph tags for xhtml with htmlonly [<a href="https://github.com/doxygen/doxygen/commit/f923f26d602fd991577b7a6676d129bd1642f453">view</a>] +<li>Incorrect number of start / end paragraph tags for xhtml with image command [<a href="https://github.com/doxygen/doxygen/commit/5998b139855faba0e089338b6f53e8c1a6eee814">view</a>] +<li>Incorrect number tag sequence for xhtml with htmlinclude command possible [<a href="https://github.com/doxygen/doxygen/commit/1c0a565a28582d0bc0776988ffef16565563e950">view</a>] +<li>Incorrect tag sequence for xhtml with latexinclude command possible [<a href="https://github.com/doxygen/doxygen/commit/f4a16c46b29817ab0847555a2a51e4fa556e4f16">view</a>] +<li>Incorrect tag sequence possible for images possible in case of xhtml [<a href="https://github.com/doxygen/doxygen/commit/400de444ef9b0569b2803dc4a8e5497c181384ce">view</a>] +<li>Index bugfix [<a href="https://github.com/doxygen/doxygen/commit/846cde72cbd7b3f69393391adca19d009fecb8c3">view</a>] +<li>Index list cannot contain special characters in ids for XHTML [<a href="https://github.com/doxygen/doxygen/commit/6f836989966863932e10678bbcfc4dc5ccbf0ea9">view</a>] +<li>Inline images [<a href="https://github.com/doxygen/doxygen/commit/4682b91364247aafe66b6af472e321511e115e7c">view</a>] +<li>Invalid warnings regarding todos when source file name contains a '-' [<a href="https://github.com/doxygen/doxygen/commit/ee97be448f7adc1285b38bae5adb7e7d48d4c29e">view</a>] +<li>Issue #6631 Code blocks incorrectly formatted in Latex [<a href="https://github.com/doxygen/doxygen/commit/75f2cfcffbd0e4667d668e80b9c69ce56e9bd438">view</a>] +<li>Issue 6411: CSS for Markdown tables do not use HTML_COLORSTYLE_HUE, HTML_COLORSTYLE_SAT config variables [<a href="https://github.com/doxygen/doxygen/commit/359e09007d056646bfe4e3bccf64c0a36ac3ccc1">view</a>] +<li>Issue 6469: Java method calls are ignored in generating call/caller graph with Graphviz [<a href="https://github.com/doxygen/doxygen/commit/f0cf6f2324a2f27214b0216be9f9f0d03d32f401">view</a>] +<li>Issue 6494: asterisks before args and kwargs are ignored in python [<a href="https://github.com/doxygen/doxygen/commit/eef433c0531f8f5321f3034bcc5bed02c006f2cf">view</a>] +<li>Issue_6456 Using # in links causes errors in PDF generation [<a href="https://github.com/doxygen/doxygen/commit/1f849a16671e1c9afff4ee30a5b5a33d271e8684">view</a>] +<li>Issue_6585: Unexpected anchor tags in tag-files [<a href="https://github.com/doxygen/doxygen/commit/fcc956dcd48be631a88df8ffbb7fbe160b7250f2">view</a>] +<li>Keyword register (in code) is deprecated since C++11 [<a href="https://github.com/doxygen/doxygen/commit/24e97b9b61e3fb87fc1b9fbc5362ad24cc40b780">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/b6101af96fb793d9e9bdc0c34f0690545f3a1e56">view</a>] +<li>LaTeX with verbatim part inside a table [<a href="https://github.com/doxygen/doxygen/commit/7a8e1182ba11369f11325d75af552ad7467b1e81">view</a>] +<li>Large CALL / CALLER graphs cannot be processed in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/49079853fc4670c11b46e12eba7cb519608be8b0">view</a>] +<li>Make conanfile creation more readable [<a href="https://github.com/doxygen/doxygen/commit/9fa511f6a7080ce19036088078105fc4e01d3f35">view</a>] +<li>Make it possible to list namespace members in file scope for XML output. [<a href="https://github.com/doxygen/doxygen/commit/f5ed5051c0754f9c7e0e5556114e173016d7f984">view</a>] +<li>Making VHDL error messages more doxygen like [<a href="https://github.com/doxygen/doxygen/commit/12ea0367d27b47280e8d768d04c8c332e9657491">view</a>] +<li>Making the 'tex' part of \makeindex available to the user [<a href="https://github.com/doxygen/doxygen/commit/9b52da49cb544fb0a676e9d12fdbafaf0c1db8cb">view</a>] +<li>Markdown list wrong displayed [<a href="https://github.com/doxygen/doxygen/commit/ed562f3ed5e3208a1351387441028c7831ad14fd">view</a>] +<li>Minor documentation fix [<a href="https://github.com/doxygen/doxygen/commit/ae25f5c41545e17b37d67ab7dabf422f0eb757aa">view</a>] +<li>Minor fixes to local toc logic after feedback [<a href="https://github.com/doxygen/doxygen/commit/b6c724e8ab5caeef1e3d065e4c2fa05740d87859">view</a>] +<li>Minor restructuring [<a href="https://github.com/doxygen/doxygen/commit/f0cc0f5da51faddd490c2cf358614b4ab70cc8ac">view</a>] +<li>Misc. typos [<a href="https://github.com/doxygen/doxygen/commit/436ba3423e9a7d9b482bb4b35ae2fce2249dc762">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/99a836218ca4e20862d3f816361c4586b45560ee">view</a>] +<li>Missing opening round bracket in case of an exception [<a href="https://github.com/doxygen/doxygen/commit/a9f1c59479e316ab277521faa2a629f25fde25ba">view</a>] +<li>More typos [<a href="https://github.com/doxygen/doxygen/commit/03a9454f2b748b3c9b7f5e12b921b25a9c8c98cb">view</a>] +<li>Moved #include "config.h" back to the original place [<a href="https://github.com/doxygen/doxygen/commit/d4b5fa51ec2ad9dd2ba59e16fa85c53f9015755f">view</a>] +<li>Moved duplicated code into dedicated function skipLanguageSpecificKeyword [<a href="https://github.com/doxygen/doxygen/commit/2b6fd3bd70795c1c1cf0accb1a991015ad6b2ba9">view</a>] +<li>Moved local toc data into a separate type for better encapsulation [<a href="https://github.com/doxygen/doxygen/commit/185d6abdc832e7dd66183a2154a13a546414b96f">view</a>] +<li>Multiple `\xreflist` in one page with same key [<a href="https://github.com/doxygen/doxygen/commit/00dff76126039629de0595f76260e94ddc189cbe">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/2e03d23d0385dbbe39f5b6a67ab480734f285e76">view</a>] +<li>Multiple addindex commands in HTML with same name [<a href="https://github.com/doxygen/doxygen/commit/2e072c9e3cbc748ac2cdf6453c16d95cbfabf9d7">view</a>] +<li>Namespace with name docstrings_linebreak [<a href="https://github.com/doxygen/doxygen/commit/ab80e5dff5e3f3f1e9ce473ea25894ca08d1f739">view</a>] +<li>Not showing external project in HTML hierarchy class pages [<a href="https://github.com/doxygen/doxygen/commit/12aeab904791c514325d8ef0e230c13893b0b41a">view</a>] +<li>Numbers in comment disappear [<a href="https://github.com/doxygen/doxygen/commit/e91f7a173e00db8ccb6d217728ccfc71981c4d7b">view</a>] +<li>Numbers overlap the titles in TOC of PDF [<a href="https://github.com/doxygen/doxygen/commit/abca136aa24db05c5a3bcbac3e4708cb01aac2c2">view</a>] +<li>Order resources not only on filename but also dirname [<a href="https://github.com/doxygen/doxygen/commit/dc90259bb67126a6f3e016db2a67499945d6224f">view</a>] +<li>PATCH -- updates reference link with no closing [<a href="https://github.com/doxygen/doxygen/commit/30362ecc6da4123a9d87e9c74a6918aa23cc1403">view</a>] +<li>Path for external commands on windows [<a href="https://github.com/doxygen/doxygen/commit/67375f4cf2dc12ad1445d6b02863954c1c11ee97">view</a>] +<li>Possibility to have a \image command inside a <A> tag [<a href="https://github.com/doxygen/doxygen/commit/fb7592546b89471e62f68892c945ab7db98875b6">view</a>] +<li>Possible fix for the build [<a href="https://github.com/doxygen/doxygen/commit/5c4ee43f13433a0c1de63805cc139b61e9a4d872">view</a>] +<li>Prevent <center> and <div> inside brief descriptions to avoid broken XHTML output [<a href="https://github.com/doxygen/doxygen/commit/bed8623159191e65997b34dba80a804bfd4ea85b">view</a>] +<li>Prevent empty list [<a href="https://github.com/doxygen/doxygen/commit/30299da719fea492d07cf56b37537c45c52c52f0">view</a>] +<li>Prevent empty member list table (XHTML) [<a href="https://github.com/doxygen/doxygen/commit/052fea7e9e03fe2fde177cf6c1a788a58a8f392f">view</a>] +<li>Prevent empty page list table (XHTML) [<a href="https://github.com/doxygen/doxygen/commit/f2e96034620007f7ef2e2c66845237814e80d356">view</a>] +<li>Prevent possible 'QGDict::hashAsciiKey: Invalid null key' warning [<a href="https://github.com/doxygen/doxygen/commit/c94a53eefb4159d238cb5714b6732e145aaeb582">view</a>] +<li>Prevent potential race condition [<a href="https://github.com/doxygen/doxygen/commit/cd9c5bb4ceb6bf9ce48c2861bdf72d5c1ff79752">view</a>] +<li>Print emoji text in case of unknown emoji [<a href="https://github.com/doxygen/doxygen/commit/427d2df4b2d7fc35abac519c646b52a1285aab9f">view</a>] +<li>Problem with TEST_FLAGS when using CMake for Visual Studio [<a href="https://github.com/doxygen/doxygen/commit/33f574a534239b9d9e713b8d4c9d1d1dedf4d177">view</a>] +<li>Problem with \cond in normal comment of test 015 [<a href="https://github.com/doxygen/doxygen/commit/f7663cf300375b4ec8d8fe052f3da48782743919">view</a>] +<li>Problem with code inside a Doxy table in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/ed86c707318c1cb005702ef88dbdaa3a2bee5581">view</a>] +<li>Problems and some enhancements for LaTeX tables [<a href="https://github.com/doxygen/doxygen/commit/d984f7dd21863fc01a1a6ede0878d3dd14af157a">view</a>] +<li>RTF layout regarding References and Referenced by [<a href="https://github.com/doxygen/doxygen/commit/c90505681054d51da05fd476d08c610d3e20ca38">view</a>] +<li>RTF lists more levels and removing extra paragraphs [<a href="https://github.com/doxygen/doxygen/commit/8fc23878b4375546bfb6a9149f009fbe0f7da42f">view</a>] +<li>Readded missing "Span" case to DocStyleChange::styleString [<a href="https://github.com/doxygen/doxygen/commit/6a3d1b3d12e353d0c6ebd642b691e5e2608f8df2">view</a>] +<li>Redundant whitespace removal breaks some C++ links [with test case and Git bisect] (Origin: bugzilla #791942) [<a href="https://github.com/doxygen/doxygen/commit/449a7e2b4ff114a72be573013558bae19672ebbc">view</a>] +<li>Refactored code a bit [<a href="https://github.com/doxygen/doxygen/commit/4ed08b969b575d6dc1a49bca936a43eb43d337e2">view</a>] +<li>Refactored code a bit (use const references and made global functions members) [<a href="https://github.com/doxygen/doxygen/commit/3820f6a841115bd66ed409221c73824ec41ae6ab">view</a>] +<li>Reference text in reference list seen as emoji [<a href="https://github.com/doxygen/doxygen/commit/3540365053d32741b0caab83dbdc79b83a7da1cf">view</a>] +<li>Remove debug statement [<a href="https://github.com/doxygen/doxygen/commit/c8ff40b37ca811e207968b70b7c60cbb7dd58596">view</a>] +<li>Remove debug statements [<a href="https://github.com/doxygen/doxygen/commit/51ab08fa5bded3db613d06909fc6d3109c0a9a4c">view</a>] +<li>Remove default assignment from Translator::trVhdlType() declaration [<a href="https://github.com/doxygen/doxygen/commit/da7ff05881501450be84bc870fdb1931b7e57af2">view</a>] +<li>Remove double line with documented argument from addContentsItem in ftvhelp.cpp [<a href="https://github.com/doxygen/doxygen/commit/8c838d66fae65187692ec5fc04389d0811860a7f">view</a>] +<li>Remove non-english translations [<a href="https://github.com/doxygen/doxygen/commit/1a8ea5cd42a1a7c397c21eb8410244608769be46">view</a>] +<li>Remove obsolete definitions from scanner [<a href="https://github.com/doxygen/doxygen/commit/8e6a8c7c396748051a8cb3bbe5dbe0def92e82cc">view</a>] +<li>Remove obsolete line from README.md [<a href="https://github.com/doxygen/doxygen/commit/69092a59ad04016f2423776425140c3190db6a01">view</a>] +<li>Remove old obsolete docbook generator [<a href="https://github.com/doxygen/doxygen/commit/55063c91fa74921d0c5c7c84d1784ce617f0d53b">view</a>] +<li>Remove some dead code [<a href="https://github.com/doxygen/doxygen/commit/279f5286ecd3f1e7a35bbfedab774d9d93b80f99">view</a>] +<li>Renamed (start/end)SimpleSect to (start/end)Examples. [<a href="https://github.com/doxygen/doxygen/commit/a2ea725e1b0070ee8bcf55683157e67f5f727254">view</a>] +<li>Renamed command and moved duplicated code into a macro [<a href="https://github.com/doxygen/doxygen/commit/dff7c1af885ceb0210f6c529df4e16b0ebf19164">view</a>] +<li>Renamed option and test case numbers [<a href="https://github.com/doxygen/doxygen/commit/63931be561ab140b558418cffdd9b63b522c0e0d">view</a>] +<li>Replace ''printf' with appropriate warn 'message' [<a href="https://github.com/doxygen/doxygen/commit/21021ce13919d19ce5434a3db868c2d4f5a4a53c">view</a>] +<li>Replace calls to trTypeString with trVhdlType in single mode, which is the default. [<a href="https://github.com/doxygen/doxygen/commit/6caac96a48e055807920f724d7de68f764e06441">view</a>] +<li>Replaced replace(QRegExp(..)) by substitute [<a href="https://github.com/doxygen/doxygen/commit/5caff305e828e98939c87191342ea6c33b17e96c">view</a>] +<li>Replaced replace(QRegExp..) by substitute [<a href="https://github.com/doxygen/doxygen/commit/fbca3f69cf0e98a8269c86567c7d24d25723bb82">view</a>] +<li>Resolve inconsistency in formula repositories. [<a href="https://github.com/doxygen/doxygen/commit/5d89de25fa5aa146ab65a88f09a7cc729dea3e51">view</a>] +<li>Restructured code to avoid the need for global state [<a href="https://github.com/doxygen/doxygen/commit/f91bf62416c80cbe3bce8c428e0d3da2afa0d55f">view</a>] +<li>Return VHDL specific text in trClassHierarchyDescription() [<a href="https://github.com/doxygen/doxygen/commit/9f7406d151e4f5d021558e97f5d87a0d9cacecf9">view</a>] +<li>Section label with minus sign not recognized properly. [<a href="https://github.com/doxygen/doxygen/commit/7e185a2e25e4bdbac422299f029a68d1c0c70d6e">view</a>] +<li>Small clarification for REFERENCED_BY_RELATION [<a href="https://github.com/doxygen/doxygen/commit/f69d501429f12a2027bb2dfc100a69a30ca1c7f9">view</a>] +<li>Small correction installation / build procedure [<a href="https://github.com/doxygen/doxygen/commit/44278f94827cf772b9f679a6d9f5ea9d3a663b49">view</a>] +<li>Small corrections in distributed man pages [<a href="https://github.com/doxygen/doxygen/commit/c546894fc6c2af3ff81789893a5fb816c697ab73">view</a>] +<li>Small documentation corrections [<a href="https://github.com/doxygen/doxygen/commit/ec0e5078b3a9db1f24079257287f7aee9e721093">view</a>] +<li>Small problems when displaying python code [<a href="https://github.com/doxygen/doxygen/commit/48817487de116ee526714587900380e53b195f5e">view</a>] +<li>Small problems when having code in LaTeX output [<a href="https://github.com/doxygen/doxygen/commit/7bb6b4792a95626685df5750a6ab79b675c9fd60">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/f4544b7508bde732dacb1172e8200e88ac07c82b">view</a>] +<li>Sorting of index in case of LaTex [<a href="https://github.com/doxygen/doxygen/commit/080389ee153981831ea36e14726b49f756e081bf">view</a>] +<li>Spanish translation for VHDL additions [<a href="https://github.com/doxygen/doxygen/commit/8daabeb2d8650e215b9cfd3e242f687a6f06289c">view</a>] +<li>Spelling of the word Javadoc [<a href="https://github.com/doxygen/doxygen/commit/d42f1d1bbb3cd73f71ee2c57791d31ff37d5d0f1">view</a>] +<li>Synchronize chapter names of doxygen's own documentation. [<a href="https://github.com/doxygen/doxygen/commit/35f3081a603c4e2a8fb95f50a9e8a3593e9ca2b6">view</a>] +<li>Syntax highlighting / code coloring in RTF [<a href="https://github.com/doxygen/doxygen/commit/d05562bb395d0e83be29c8ff5ad76ddbe2a794bc">view</a>] +<li>Tag sequence incorrect for svg image (XHTML) [<a href="https://github.com/doxygen/doxygen/commit/57633468f2f0cfb7d4f93bf58c3e8801824dca8d">view</a>] +<li>Test renumbering [<a href="https://github.com/doxygen/doxygen/commit/1c3317e72f7845f121009c10add4d209d607ce48">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/80ec5521ebee6072f6c43946cb5ef3e812ee777a">view</a>] +<li>Tooltip was twice 'HTML escaped' [<a href="https://github.com/doxygen/doxygen/commit/1de4faf17a4b5de11839220d95e08264303924c5">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/80c321c6856e7923e99c2ece878da5625566712c">view</a>] +<li>Translators updated to version 1.8.15. [<a href="https://github.com/doxygen/doxygen/commit/fc2d26714142033dfec24f846c439464bda65dca">view</a>] +<li>Truncated split bar in HTML output between treeview and normal text area [<a href="https://github.com/doxygen/doxygen/commit/5b11346a3620a0788bd0b9106c159e2f1e6356df">view</a>] +<li>Typos [<a href="https://github.com/doxygen/doxygen/commit/c9f7e5073163ede0a1ca071030d6b3746b943b94">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/2f2c2d79d4104b25d87df86d0843d017b125fcdb">view</a>] , [<a href="https://github.com/doxygen/doxygen/commit/a40b6623967d2ab9817d674b0c13c746784bb020">view</a>] +<li>Unbalanced start of lists resulting in not creatable pdf of rtf document [<a href="https://github.com/doxygen/doxygen/commit/b3838c5b58fc224f2638530694f9b3210d5d49d2">view</a>] +<li>Update Dutch translation for new Slice implementation [<a href="https://github.com/doxygen/doxygen/commit/b85c68bd1ea21c2a5b537fbdd2fe64f440f901d8">view</a>] +<li>Update Dutch translation in respect to new VHDL entries. [<a href="https://github.com/doxygen/doxygen/commit/5b2c378d1932bc548d6b3fcc1841b6c7778c4a97">view</a>] +<li>Updated Hungarian translation [<a href="https://github.com/doxygen/doxygen/commit/992204b8a0d8cd509d8da9f17366054a2b7ffa37">view</a>] +<li>Upgrade to jQuery 1.7.2 to get rid of security scan violations. [<a href="https://github.com/doxygen/doxygen/commit/a9471149d84c618f307f8b3970720d38d01a07a9">view</a>] +<li>Usage of '{', '}' and ',' in ALIAS [<a href="https://github.com/doxygen/doxygen/commit/9766554d63dd85ba8857fe18eb7064c84b0231f6">view</a>] +<li>Use QCStringList::split i.s.o. QStringList::split [<a href="https://github.com/doxygen/doxygen/commit/d0852053693f3f56741657f2a5167950e4d000d5">view</a>] +<li>Version bump for next release [<a href="https://github.com/doxygen/doxygen/commit/27731a36c182f672fe4486c4a9ae390c4ee8a10f">view</a>] +<li>Warning running xmllint for xhtml [<a href="https://github.com/doxygen/doxygen/commit/b851ef73be5ea01726bca0b6d686508e54a4191d">view</a>] +<li>Wrong counting of lines during VHDL code output [<a href="https://github.com/doxygen/doxygen/commit/9447c47c5f569dec436e0facef8c0d99fd12943f">view</a>] +<li>Wrong determination of begin / end tag of formula in markdown. [<a href="https://github.com/doxygen/doxygen/commit/39118ed6cef251d1dbdca98801960eab49154128">view</a>] +<li>Wrong link generated for inherited members when tag files are used. [<a href="https://github.com/doxygen/doxygen/commit/135412e4e9af74cda860205b4c8104098c2b65aa">view</a>] +<li>Wrong separator in index for a.o. Python, C# [<a href="https://github.com/doxygen/doxygen/commit/3e6447119d64b492ed55c3baad17b04dd57f4821">view</a>] +<li>Wrong spelling of word doxygen [<a href="https://github.com/doxygen/doxygen/commit/ea4af8a8579f3a1a9712e13b01a725c61773432b">view</a>] +<li>XHTML image tag mandatory alt attribute [<a href="https://github.com/doxygen/doxygen/commit/66f9f6ec07f29fb737b0d0fe11072ea156581576">view</a>] +<li>XHTML incorrect attribute values for align and valign [<a href="https://github.com/doxygen/doxygen/commit/7db371ebe9d770cb1bd977b5698fd698ab0e399b">view</a>] +<li>XHTML problem with class index table [<a href="https://github.com/doxygen/doxygen/commit/a4c2fd0e8f367531b78683ba920a853e23d101ec">view</a>] +<li>XHTML problem with multiple use of node numbers in id attribute [<a href="https://github.com/doxygen/doxygen/commit/36adf08f19b7c6bce53b42a5de577d578bbd0bea">view</a>] +<li>XHTML problem with name attribute with VHDL name attribute [<a href="https://github.com/doxygen/doxygen/commit/889a302661db7eba47b70a4a61827a5971dbe75e">view</a>] +<li>XML output: avoid warnings with scoped enum values in anonymous namespaces. [<a href="https://github.com/doxygen/doxygen/commit/5db858953001c534341562cfaeba39782abc5ca6">view</a>] +<li>[ImgBot] Optimize images [<a href="https://github.com/doxygen/doxygen/commit/ddfe40a3834f63a2705739c19dc9ab637ecb40df">view</a>] +<li>added PHP7 support for the search engine on HTML output. See: http://php.net/manual/en/language.basic-syntax.phptags.php [<a href="https://github.com/doxygen/doxygen/commit/22b67836d678cea695b977ec648c0aa013339c55">view</a>] +<li>addindex supports also DocBook and RTF [<a href="https://github.com/doxygen/doxygen/commit/5fe01a8548f0ac7f9f7eafdc7d0fc614222267ba">view</a>] +<li>correct typo in comment [<a href="https://github.com/doxygen/doxygen/commit/c15e0f7a41510e89145b0562833821a7a4245c77">view</a>] +<li>declares XMLCodeGenerator in xmlgen.h [<a href="https://github.com/doxygen/doxygen/commit/172016e3d3b5cfe6f51470d43669f794b993da65">view</a>] +<li>doxyparse bugfixes and minor improvements [<a href="https://github.com/doxygen/doxygen/commit/b4ec5e1442ec24b0345ba4362cf202014d8371cf">view</a>] +<li>fix build with qt 5.11, deprecated qt5_use_modules macro was removed, patch by Christophe Giboudeaux [<a href="https://github.com/doxygen/doxygen/commit/a74e24784f4d5b6be5cd2167340a7572d869e220">view</a>] +<li>perlmod syntax correction [<a href="https://github.com/doxygen/doxygen/commit/6a0f531d104d80fb1ab220ea952d3c45d3474f57">view</a>] +<li>redundant input_filter runs significantly reduce performance when FILTER_SOURCE_FILES and INLINE_SOURCES are both enabled #6395 [<a href="https://github.com/doxygen/doxygen/commit/608b5c375a3ea265afe96dd8b921b4b81d6b354d">view</a>] +<li>sqlite3: fix missing external_file view schema col [<a href="https://github.com/doxygen/doxygen/commit/eec2d3b6a9f80715fb590b0fb67b7fe87ba5fee7">view</a>] +<li>sqlite3: require sqlite >= 3.9.0 [<a href="https://github.com/doxygen/doxygen/commit/e4f408eb4aad7fb035847616debe68fe115e2ae4">view</a>] +</ul> +<p> +\endhtmlonly + \subsection log_1_8_14 Release 1.8.14 \htmlonly <b>(release date 25-12-2017)</b> <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 "Namespaces" and "Files" (matching "Classes") [<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://bugzilla.gnome.org/show_bug.cgi?id=557094">557094</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://bugzilla.gnome.org/show_bug.cgi?id=652086">652086</a> - does ALIAS work for VHDL code? [<a href="http://github.com/doxygen/doxygen/commit/05364c46f806e73cce76be37a6a31230d0468507">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729237">729237</a> - (UnFriendlyTemplate) Spurious warning when documenting friend template [<a href="http://github.com/doxygen/doxygen/commit/2fe7bc7f1df9a2483355b0743b5e0455aaccc969">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733705">733705</a> - parser misinterpreting fortran [<a href="http://github.com/doxygen/doxygen/commit/747fc768476aef8b8b70fdd78749702a410dcd29">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=743367">743367</a> - Duplicate attribute (target="_top" target="_top") generated in .SVG files [<a href="http://github.com/doxygen/doxygen/commit/97bfbfa6c4d4eb07ac8c60545086c3370e9683b8">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=775493">775493</a> - Usage of underscore's in parameter names [<a href="http://github.com/doxygen/doxygen/commit/c10af45c61a1f9b25c514f397ace16c94cc7c8df">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=776791">776791</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://bugzilla.gnome.org/show_bug.cgi?id=776870">776870</a> - XML Parsing Error for operator<< methods when outputing to XHTML [<a href="http://github.com/doxygen/doxygen/commit/0e8530e42b69c909ef2c26468b24dfb88cc0997f">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=776964">776964</a> - Menu does not work without Javascript [<a href="http://github.com/doxygen/doxygen/commit/1be97720b7820361e85242d08d4cac3e46570bfe">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=776988">776988</a> - Too greedy behavior of @ref const matching [<a href="http://github.com/doxygen/doxygen/commit/04001c8926fb0f37dfcf284b3637b182125bba75">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=778730">778730</a> - doxygen build fails [<a href="http://github.com/doxygen/doxygen/commit/bb5c8dd29782ecbb05a4ef9788f2507e9a156848">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=779014">779014</a> - Add "\~" command to internatioalization article [<a href="http://github.com/doxygen/doxygen/commit/e204b982eebd54bd15148a520da6608935e33e50">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=784281">784281</a> - Problem RTF output: The class list "classes" within the namespace report is wrong indicated. [<a href="http://github.com/doxygen/doxygen/commit/753c06281f6b2e9172c449157fc9f863063232e3">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=786409">786409</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://bugzilla.gnome.org/show_bug.cgi?id=787952">787952</a> - Problem parsing c++ gnu::visibility [<a href="http://github.com/doxygen/doxygen/commit/d8001efd89146e04d92f5ea41ab27a7de09b6c53">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=788209">788209</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://bugzilla.gnome.org/show_bug.cgi?id=789007">789007</a> - Error in markdown emphasis examples [<a href="http://github.com/doxygen/doxygen/commit/81956108f2e6e97bf4dd0f1011fcae1b5c4c4408">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=789168">789168</a> - Increasing access of inherited C++ members with 'using...' is not recognized by Doxygen [<a href="http://github.com/doxygen/doxygen/commit/9468ede259153cf79eb8d61635389744e9a2ee7d">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=790320">790320</a> - C++ parameter from lambda not recognized [<a href="http://github.com/doxygen/doxygen/commit/7b43be09e513ea6f86f9ca53ce05c94d63eada4c">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=790788">790788</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 https://bugzilla.gnome.org/show_bug.cgi?id=782583. [<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 '\n' [<a href="http://github.com/doxygen/doxygen/commit/856a43cfe08179ebbcebe656262b0229925547c8">view</a>] -<li>Fix: add missing semicolon ';' at end of line [<a href="http://github.com/doxygen/doxygen/commit/507880a0c7ed6029ce7ede2e85d23a9650a3f6bf">view</a>] -<li>Fix: change 'CMakefiles' to 'CMakeFiles' (the 'F' 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 "double-space line breaks" 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 <programlisting> 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 "strongness" in the XML output. [<a href="http://github.com/doxygen/doxygen/commit/169cad806ea795e5c425fd397aa0de54cbc0a81e">view</a>] -<li>Provide page brief in <briefdescription> 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 'make tests' 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 <see langword="..."/> [<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>] -<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 "doxyparse" [<a href="http://github.com/doxygen/doxygen/commit/82dbb5fe863e13175eda130dcc728b102101ccda">view</a>] +<li>Add language type attribute to programlisting tag [<a href="https://github.com/doxygen/doxygen/commit/141dbfd5a4f79c98da14a1b414c6db4e1b34618b">view</a>]</li> +<li>Add links behind nav entries "Namespaces" and "Files" (matching "Classes") [<a href="https://github.com/doxygen/doxygen/commit/464919adf1cdae9057ff840f40c60472b4c30bfd">view</a>]</li> +<li>Allow case insensitive file pattern matching based on CASE_SENSE_NAMES [<a href="https://github.com/doxygen/doxygen/commit/bd759f9a3aa4096bc8574ea45ad6b23fed830742">view</a>]</li> +<li>Async load of mathjax javascript [<a href="https://github.com/doxygen/doxygen/commit/340e516dbf5efd3ae21d964e92369e97b252e4ab">view</a>]</li> +<li>Avoid generating unused dir_* output files for non HTML output formats [<a href="https://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="https://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="https://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="https://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="https://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="_top" target="_top") generated in .SVG files [<a href="https://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's in parameter names [<a href="https://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="https://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<< methods when outputting to XHTML [<a href="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/bb5c8dd29782ecbb05a4ef9788f2507e9a156848">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6170">6170</a> - Add "\~" command to internatioalization article [<a href="https://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 "classes" within the namespace report is wrong indicated. [<a href="https://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="https://github.com/doxygen/doxygen/commit/2f5e22a4be9d237a150d04659bf6abec1349fbd9">view</a>] +, [<a href="https://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="https://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="https://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="https://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 'using...' is not recognized by Doxygen [<a href="https://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="https://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="https://github.com/doxygen/doxygen/commit/137b2e8dd03a98e692c2f6d813b47f19f2c64e5b">view</a>]</li> +<li>CMake: avoid if() around the whole contents of documentation CMakeLists.txt [<a href="https://github.com/doxygen/doxygen/commit/62e87408cb7094eeac130775e62d5b7a6f4a79c9">view</a>]</li> +<li>CMake: avoid if() around the whole contents of plugin CMakeLists.txt [<a href="https://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="https://github.com/doxygen/doxygen/commit/ca7e60edd370949cfb2adb83ca0b532bb3fdc441">view</a>]</li> +<li>CMake: let file(MAKE_DIRECTORY) create all directories at once [<a href="https://github.com/doxygen/doxygen/commit/0d7be027a6fea2ac198dded58f8b55cda1bbe962">view</a>]</li> +<li>CMake: remove CUSTOM_(LINK|INCLUDE)_DIR [<a href="https://github.com/doxygen/doxygen/commit/28f09783b1e45a827729abaca61f963dd869381b">view</a>]</li> +<li>CMake: remove needless variable expansions [<a href="https://github.com/doxygen/doxygen/commit/975fb19eb07bc65ef48ddd5f26bf6be2736d0e0a">view</a>]</li> +<li>CMake: remove unused program searching [<a href="https://github.com/doxygen/doxygen/commit/02f726b63e2b3a2ed4c5da43c164dcaad5fcfe94">view</a>]</li> +<li>CMake: search for Qt5 only in config file mode [<a href="https://github.com/doxygen/doxygen/commit/ac5ca4ef86ad50232be75a65fab99302307b7795">view</a>]</li> +<li>CMake: use GNUInstallDirs module for man pages directory [<a href="https://github.com/doxygen/doxygen/commit/fcf5fecb64d5c194430e10cbe52482b14224d645">view</a>]</li> +<li>CMake: use add_test to create a test [<a href="https://github.com/doxygen/doxygen/commit/b54b843accb97105ae4afaf24136e33bfd1ea9d4">view</a>]</li> +<li>CMakeLists: Avoid MSVC iconv changes for MinGW builds [<a href="https://github.com/doxygen/doxygen/commit/9532e0f19532e9d76c3f1092d131af91125a2dff">view</a>]</li> +<li>Call endMemberItem consistently. [<a href="https://github.com/doxygen/doxygen/commit/1aafbbc97bdb643cae8be036f2b9ab569ca7f15e">view</a>]</li> +<li>Change navtree collapsed list icon [<a href="https://github.com/doxygen/doxygen/commit/b3869a3ed82957c1785dc955876885f8b73a020b">view</a>]</li> +<li>Code color of , (comma) together with only in use statement [<a href="https://github.com/doxygen/doxygen/commit/6f7264f4a16f5b1240291c6d33a0e4cc98ba30e4">view</a>]</li> +<li>Corrected small type [<a href="https://github.com/doxygen/doxygen/commit/4360982dbaee9b32973a95ba88290022d0643e10">view</a>]</li> +<li>Correction display of backtick in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/beaa386ca97341e66ad673660c808993240df637">view</a>]</li> +<li>Correction of non reachable links and redirected links in documentation. [<a href="https://github.com/doxygen/doxygen/commit/31cf78d223e52fe078ad9b0651672aeb73926065">view</a>]</li> +<li>Documentation, correct referenced file [<a href="https://github.com/doxygen/doxygen/commit/c93a7c34e7efd5ae1f2c3e4d230e29a333bc237a">view</a>]</li> +<li>Doxygen/VHDLdocgen: [<a href="https://github.com/doxygen/doxygen/commit/77e0cf86eadbec22b81e26e083ffc831240869da">view</a>]</li> +<li>Encode invalid XML characters instead of skipping them. [<a href="https://github.com/doxygen/doxygen/commit/b6a7abf02652b74872b9c676fcfa545e18d9bde7">view</a>]</li> +<li>Expose TOC placeholder in XML output. [<a href="https://github.com/doxygen/doxygen/commit/fe760977e2cb643b94fbf21847e0c81e8a080966">view</a>]</li> +<li>Expose underlying enum type in the XML output. [<a href="https://github.com/doxygen/doxygen/commit/17bceb8f4580535de52d19e8cadf0d088f972bef">view</a>]</li> +<li>Fetch filename property from object instead of hardcoded duplicated string [<a href="https://github.com/doxygen/doxygen/commit/84fd1fecfe2de7b4f8c88e1923ef7d5958dc70b0">view</a>]</li> +<li>Fix C# property initializer parsing [<a href="https://github.com/doxygen/doxygen/commit/14a0bcc74a121525917aefc8c9034e283e94884b">view</a>]</li> +<li>Fix for regression in XML output generation after fixing bug 789168 [<a href="https://github.com/doxygen/doxygen/commit/1a1fdbed64de6ce01959b2e4d0988be823fb6bad">view</a>]</li> +<li>Fix <a href="https://github.com/doxygen/doxygen/issues/6210">6210</a>. [<a href="https://github.com/doxygen/doxygen/commit/c87f730fe4bc40f72ed5fa52fe032a7bdf2d549c">view</a>]</li> +<li>Fix minor markup issue in the documentation. [<a href="https://github.com/doxygen/doxygen/commit/b4df85466cf0447d46f311046fc5b3fe062b957f">view</a>]</li> +<li>Fix not initialized pointer when parser is starting on a new file. [<a href="https://github.com/doxygen/doxygen/commit/52fb4cd5bb085960476e0cd256cc81db1370839d">view</a>]</li> +<li>Fix typo [<a href="https://github.com/doxygen/doxygen/commit/d6e9db71645d895450993972ed41406c1cf1fc52">view</a>]</li> +<li>Fix: add missing newline char '\n' [<a href="https://github.com/doxygen/doxygen/commit/856a43cfe08179ebbcebe656262b0229925547c8">view</a>]</li> +<li>Fix: add missing semicolon ';' at end of line [<a href="https://github.com/doxygen/doxygen/commit/507880a0c7ed6029ce7ede2e85d23a9650a3f6bf">view</a>]</li> +<li>Fix: change 'CMakefiles' to 'CMakeFiles' (the 'F' is uppercase) [<a href="https://github.com/doxygen/doxygen/commit/bcc09aa2ba01eff458a00aff853d58ed8213a5da">view</a>]</li> +<li>Fix: perl script regexp to toggle flex debug information [<a href="https://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="https://github.com/doxygen/doxygen/commit/5fc82b2275e202438ac61b070ac5f4be0df792d6">view</a>]</li> +<li>Fixes for cross platform build with new LLVM/CLANG version [<a href="https://github.com/doxygen/doxygen/commit/b0aae61c97966cb9d424b500d7ced5bdf500d8db">view</a>]</li> +<li>Fixup man page NAME section when page has title [<a href="https://github.com/doxygen/doxygen/commit/9d0908359363dbb43236767669c214721700acf7">view</a>]</li> +<li>Function declaration following a function definition incorrectly listed as calling dependencing [<a href="https://github.com/doxygen/doxygen/commit/436fc7ed1158d517dd6f6d25aa3e05568f8c3d94">view</a>]</li> +<li>Further cleanup of lodepng code [<a href="https://github.com/doxygen/doxygen/commit/c627108f3315144f5d9fb84d0197502b939caf7d">view</a>]</li> +<li>Implement "double-space line breaks" syntax in Markdown [<a href="https://github.com/doxygen/doxygen/commit/e4596c7eab90ba4d307e2c212cefeab8ac820269">view</a>]</li> +<li>Improve Chinese translation [<a href="https://github.com/doxygen/doxygen/commit/ded5247523ec8d47129405df3999ce391cca9e2d">view</a>]</li> +<li>Inline attribute got reset for functions returning an explicit struct type [<a href="https://github.com/doxygen/doxygen/commit/127a43d464790dd0312794fe7ae1d92247cd9eef">view</a>]</li> +<li>Isolated none-existing posix threading functions on Android [<a href="https://github.com/doxygen/doxygen/commit/4e25f081847cf2717ad561214e90d9750da5a511">view</a>]</li> +<li>Marks JS as freely licensed [<a href="https://github.com/doxygen/doxygen/commit/6b5617e5a4c87afd2c7f2f7b8cb03de2b6735627">view</a>]</li> +<li>Misc. doxy and comment typos [<a href="https://github.com/doxygen/doxygen/commit/1764f7a0f199b9f2a85f885cfd0f1804f8292c49">view</a>]</li> +<li>Misc. typos [<a href="https://github.com/doxygen/doxygen/commit/9fd7f3aeb4c2e78bda669bf4ef6fff1c12c062a4">view</a>]</li> +<li>New table features mentioned in the documentation were not enabled. [<a href="https://github.com/doxygen/doxygen/commit/c120ac4762331513305e8a19fd9b267b2d4f9e41">view</a>]</li> +<li>Pass strings as const references. [<a href="https://github.com/doxygen/doxygen/commit/ebf75c1fe8a0ff2cc9235155b6d63367944d6342">view</a>]</li> +<li>Physical newlines in ALIASES configuration tags. [<a href="https://github.com/doxygen/doxygen/commit/d6801c4c5eaeebc5e14f5d1cd7c312ad82c1dbbd">view</a>]</li> +<li>Propagate language information to all <programlisting> XML elements. [<a href="https://github.com/doxygen/doxygen/commit/eaf8edbac7e6a1873aa5c4ff0df063cd367351d6">view</a>]</li> +<li>Properly copy images for the XML output. [<a href="https://github.com/doxygen/doxygen/commit/507dd0a60dd12c61ff2088db419187efc928c010">view</a>]</li> +<li>Provide dot path to plantuml [<a href="https://github.com/doxygen/doxygen/commit/c24cb9a74ef0af854455047f29f9925d79ac0195">view</a>]</li> +<li>Provide information about enum type "strongness" in the XML output. [<a href="https://github.com/doxygen/doxygen/commit/169cad806ea795e5c425fd397aa0de54cbc0a81e">view</a>]</li> +<li>Provide page brief in <briefdescription> of XML output. [<a href="https://github.com/doxygen/doxygen/commit/bd2cf98e75c600e0c2f5ae95301df8745d65571a">view</a>]</li> +<li>Provide template parameters also for type aliases in the XML output. [<a href="https://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="https://github.com/doxygen/doxygen/commit/6c288bf0e7548117aa358719aaecffedcc579590">view</a>]</li> +<li>Restore 'make tests' rule [<a href="https://github.com/doxygen/doxygen/commit/7ce59c9fbd5e99619a9ab0ac6177d21e6aca49c7">view</a>]</li> +<li>Restore Makefile in vhdlparser dir [<a href="https://github.com/doxygen/doxygen/commit/aee944fe954de993a4273fafef6b5f0c726be7f3">view</a>]</li> +<li>Spelling correction [<a href="https://github.com/doxygen/doxygen/commit/4cca51612a50a9016be5adbd6ccdc26c03d12b58">view</a>]</li> +<li>Stripped unused LodePNG code to prevent false positives for coverity [<a href="https://github.com/doxygen/doxygen/commit/64865ad3e91fffe6e50b51b29ae2a54126f80126">view</a>]</li> +<li>Suppresses warning for XML <see langword="..."/> [<a href="https://github.com/doxygen/doxygen/commit/a3c5958b437b5dc9de91de5f40917ec53532b60a">view</a>]</li> +<li>Suppression warnings about deprecated directive [<a href="https://github.com/doxygen/doxygen/commit/cd0faad90e9b6ce83fa1f7b4fb27a39357b0cae3">view</a>]</li> +<li>Update .travis.yml [<a href="https://github.com/doxygen/doxygen/commit/5f028fd744526148aace4c971f739c9876b6108a">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/b7fc8a384b091f5761159d263ec27e30c3160a50">view</a>]</li> +<li>Update mathjax path [<a href="https://github.com/doxygen/doxygen/commit/57e69ba26eff5eac4b31b088cd7d3dfa7532f12c">view</a>]</li> +<li>Updated translator_de.h to doxygen 1.8.13 [<a href="https://github.com/doxygen/doxygen/commit/a9e3d5378ffbef542045d04239482bd6fec33e15">view</a>]</li> +<li>Use hidden symbol visibility by default [<a href="https://github.com/doxygen/doxygen/commit/dcb3b2d0b888902a062eefd8200ea194ed1c42d6">view</a>]</li> +<li>Use language identifier instead of file extension for language attribute [<a href="https://github.com/doxygen/doxygen/commit/ed9acb6e1bb81a2eec334180f7b8c1bf0598b444">view</a>]</li> +<li>Use language in stead of lang for language name attribute [<a href="https://github.com/doxygen/doxygen/commit/4e4741221f4290412ef4a6b6bbfe9799abafaf6c">view</a>]</li> +<li>Update of the Brazillian translation [<a href="https://github.com/doxygen/doxygen/commit/d283dfcdcaa0837e84d7995676d436fa04e96d1f">view</a>]</li> +<li>[preprocessing.doc] typo amended [<a href="https://github.com/doxygen/doxygen/commit/6b67a64bd0bd1c6759294c323433dbd7d37df6ac">view</a>]</li> +<li>add decimal to base identifier [<a href="https://github.com/doxygen/doxygen/commit/9cbc1a04e584e83d91ff3f7501f38b0a825e1953">view</a>]</li> +<li>add the number of conditionals path and bugfix [<a href="https://github.com/doxygen/doxygen/commit/20af63f43e583a31dfe93f78807aa868f9b9ff14">view</a>]</li> +<li>build: fix the way lang_cfg.h is generated [<a href="https://github.com/doxygen/doxygen/commit/cc3a9e611c15f32ae4913a87306699db60758245">view</a> and <a href="https://github.com/doxygen/doxygen/commit/a4b6f59e0c99457ba8f4f71782e51d50b7a1057f">view</a>]</li> +<li>bump version number for the development version/next release [<a href="https://github.com/doxygen/doxygen/commit/0a6d8bf6f5ef3a537de6ab517d0ae9c4f5d558d0">view</a>]</li> +<li>const-ify [<a href="https://github.com/doxygen/doxygen/commit/5df4341210ec2374b8b7c09f5df3cd8f4ff60f65">view</a>]</li> +<li>dot.cpp: Fix DotGfxHierarchyTable first class node loop [<a href="https://github.com/doxygen/doxygen/commit/c7348b4483ace9b5608fbbe949eab02921eb0e70">view</a>]</li> +<li>fix spelling [<a href="https://github.com/doxygen/doxygen/commit/bca94d6ca30bde5f01dd17a83cfa63268c0ca664">view</a>]</li> +<li>fix test to support new programlisting attribute [<a href="https://github.com/doxygen/doxygen/commit/a9963fd94acd5839e818890b6a356d6b335c1f74">view</a>]</li> +<li>fix typo [<a href="https://github.com/doxygen/doxygen/commit/f88ebaf9f23c3151f312400d77150eeeeb8158c2">view</a>]</li> +<li>fixes vhdl literal bug [<a href="https://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="https://github.com/doxygen/doxygen/commit/898b6044194d5967099adfadab454cd09a4f360e">view</a>]</li> +<li>make use of clang compilation database [<a href="https://github.com/doxygen/doxygen/commit/818aefcecf3cca986c971cd236bd7b77337db955">view</a>]</li> +<li>new addon doxyparse, a source parsing engine [<a href="https://github.com/doxygen/doxygen/commit/e6dcc3b6c6dd449800eeebc172c1d15367d61d74">view</a>]</li> +<li>sqlite3gen: add index on params [<a href="https://github.com/doxygen/doxygen/commit/3b3d1edeacde99719456b8f1616077707a5a2012">view</a>]</li> +<li>sqlite3gen: add missing protectedsettable column [<a href="https://github.com/doxygen/doxygen/commit/ba8e4323290da4cb6de59060c77fe02a4df694b4">view</a>]</li> +<li>sqlite3gen: add openDbConnection [<a href="https://github.com/doxygen/doxygen/commit/5596fcd158e7c53638324cea8ba3da31b2c32620">view</a>]</li> +<li>sqlite3gen: start checking operations status [<a href="https://github.com/doxygen/doxygen/commit/74cebdbbbc2c267c254ab2c337ee06250ab8424d">view</a>]</li> +<li>sqlite3gen: use sqlite3_exec for schema setup [<a href="https://github.com/doxygen/doxygen/commit/1ec8f0eb9169fc3f9ab82b60712a332bf60728bf">view</a>]</li> +<li>typos [<a href="https://github.com/doxygen/doxygen/commit/5711b54b4813a2f4ce3b858e496ac846cbda69e5">view</a>]</li> +<li>update compound.xsd to add language attribute [<a href="https://github.com/doxygen/doxygen/commit/0259d2a8bf9571e06873b80df96fd2ff29723dbc">view</a>]</li> +<li>using YAML in the output of "doxyparse" [<a href="https://github.com/doxygen/doxygen/commit/82dbb5fe863e13175eda130dcc728b102101ccda">view</a>]</li> </ul> <p> \endhtmlonly @@ -135,60 +536,60 @@ <a name="1.8.13"></a> </p> <ul> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707266">707266</a> - C++/CLI indexed property not documented [<a href="http://github.com/doxygen/doxygen/commit/80656d68a0838483ea2988adf028e2d85292a109">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707278">707278</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://bugzilla.gnome.org/show_bug.cgi?id=722112">722112</a> - 'static' and 'throw' C++ keywords not colored [<a href="http://github.com/doxygen/doxygen/commit/794ae9cbc40b73d00cce5f0096b53f18e1d3e325">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729921">729921</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://bugzilla.gnome.org/show_bug.cgi?id=756185">756185</a> - Multiline //!< behavior changed [<a href="http://github.com/doxygen/doxygen/commit/d4accb68ff6536dcf128236b7e1e8d0239d4ffc2">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759402">759402</a> - C++11 "using" 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://bugzilla.gnome.org/show_bug.cgi?id=760678">760678</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://bugzilla.gnome.org/show_bug.cgi?id=769552">769552</a> - doxygen warning parsing C++11 "using" declaration [<a href="http://github.com/doxygen/doxygen/commit/5730198d20511d93c20aa7870fc2bd11f478db85">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=770973">770973</a> - Tag file size double between each run [<a href="http://github.com/doxygen/doxygen/commit/155bd0110585d401d0f898baf9c69b2ec46833ff">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=771152">771152</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://bugzilla.gnome.org/show_bug.cgi?id=771199">771199</a> - Web-page bug: Comment blocks in VHDL [<a href="http://github.com/doxygen/doxygen/commit/6c6b847bcd16cc818165b51e62dc11a947f7e084">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=771310">771310</a> - French description for "Namespace Members" is wrong and causes fatal javascript error [<a href="http://github.com/doxygen/doxygen/commit/b5e1e195bc207c7bb93df4e51253f9f3a1026a3d">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=771344">771344</a> - Class name 'internal' breaks class hierarchy in C++ [<a href="http://github.com/doxygen/doxygen/commit/b93dbcdab6dfc5681ec49f1d567698b7c4dc6846">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=772574">772574</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://bugzilla.gnome.org/show_bug.cgi?id=773231">773231</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://bugzilla.gnome.org/show_bug.cgi?id=773354">773354</a> - "name" 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://bugzilla.gnome.org/show_bug.cgi?id=774138">774138</a> - Please add HTML classes to "Definition at..." & "Referenced by..." for CSS [<a href="http://github.com/doxygen/doxygen/commit/d2593e56cd52ecee2424d844916f95e12fef27c8">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=774273">774273</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://bugzilla.gnome.org/show_bug.cgi?id=774514">774514</a> - Modify in some pronounciation expression in Korean [<a href="http://github.com/doxygen/doxygen/commit/cd3e39d7db634d9e11afc8e46269eb509ae10e40">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=774949">774949</a> - Unknown reference in manual [<a href="http://github.com/doxygen/doxygen/commit/dde15c9748053ecb68ba046ebd0fdfe625be0e2e">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=775245">775245</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 ';' 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 & 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="https://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="https://github.com/doxygen/doxygen/commit/0615b1b023f7888dfdbeee7673d6d0bcc7b803df">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5400">5400</a> - 'static' and 'throw' C++ keywords not colored [<a href="https://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="https://github.com/doxygen/doxygen/commit/adb44ae6ef1d102caea1338373be078bf4a5d640">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5882">5882</a> - Multiline //!< behavior changed [<a href="https://github.com/doxygen/doxygen/commit/d4accb68ff6536dcf128236b7e1e8d0239d4ffc2">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5917">5917</a> - C++11 "using" type alias for function pointer with no arguments is formatted incorrectly [<a href="https://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="https://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 "using" declaration [<a href="https://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="https://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="https://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="https://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 "Namespace Members" is wrong and causes fatal javascript error [<a href="https://github.com/doxygen/doxygen/commit/b5e1e195bc207c7bb93df4e51253f9f3a1026a3d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6068">6068</a> - Class name 'internal' breaks class hierarchy in C++ [<a href="https://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="https://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="https://github.com/doxygen/doxygen/commit/d571efb062fbe17d7257f3971e3db6c9cba833d0">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6094">6094</a> - "name" attribute of image map not urlencoded, not working in Chrome [<a href="https://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 "Definition at..." & "Referenced by..." for CSS [<a href="https://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="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/dc02bb977ebc6c683012c106e16e0190ac72b454">view</a>]</li> +<li>Add NVARCHAR as a SQL type [<a href="https://github.com/doxygen/doxygen/commit/6a85240e65bb5e3d59d2cd161eb8cf241e27ed7d">view</a>]</li> +<li>Add mscgen images to index.qhp [<a href="https://github.com/doxygen/doxygen/commit/f50d9ed4cdc7d4e7884bb64fddb01b017b880778">view</a>]</li> +<li>Add sql syntax highlighting to code blocks [<a href="https://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="https://github.com/doxygen/doxygen/commit/7f35695022d3baa8fc8c8d1b9a9f3368a0963871">view</a>]</li> +<li>Added missing language value for SQL to XML output [<a href="https://github.com/doxygen/doxygen/commit/b196b1a28151d75d9546dcc407947fbf29789cc5">view</a>]</li> +<li>Adds plantuml support Qt compressed help file [<a href="https://github.com/doxygen/doxygen/commit/c7b740d96288f19e31bd35405306c49bb9fc20c4">view</a>]</li> +<li>Check for undocumented params warnings if members detailed documentation is not written [<a href="https://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="https://github.com/doxygen/doxygen/commit/3b8b2e1a4b846a5c1b87f4a8ddc837462709895a">view</a>]</li> +<li>Clear header/footer information in ConfigImpl for postProcess [<a href="https://github.com/doxygen/doxygen/commit/5881b1bb624ee6115dc635ba44366d259cc6a10f">view</a>]</li> +<li>Documentation small corrections [<a href="https://github.com/doxygen/doxygen/commit/ae033324fed6ff9b3febe12b5777f19c04e065d2">view</a>]</li> +<li>Doxygen error: Found ';' while parsing initializer list [<a href="https://github.com/doxygen/doxygen/commit/985faf287233badf65fa33d21bde17afa6970d60">view</a>]</li> +<li>Fix for PlantUML configuration [<a href="https://github.com/doxygen/doxygen/commit/701598719c7c4301f2614b38184dfb37cd1704bc">view</a>]</li> +<li>Fix plantuml generation issue [<a href="https://github.com/doxygen/doxygen/commit/6c87c75e197e673d74949839d59fe8b0842e86ff">view</a>]</li> +<li>Fix: Add missing jquery.js, dynsections.js & optional svgpan.js to QCH file [<a href="https://github.com/doxygen/doxygen/commit/bf9415698e53d79b4b94bdf64a52be4347eb3150">view</a>]</li> +<li>Fix: replace deprecated {\bf with \textbf{ in LaTeX generator [<a href="https://github.com/doxygen/doxygen/commit/1d85e00dd1238f74babf0a1d7eeeaf3e2ba659f2">view</a>]</li> +<li>Fixed constexp.y bison issue [<a href="https://github.com/doxygen/doxygen/commit/e12ec76f044b07d4e4fe167c93103be2879abaca">view</a>]</li> +<li>Fixed cross referencing issue when using bitfields. [<a href="https://github.com/doxygen/doxygen/commit/2a5357a0fac644ffb1bf49569344b9bc57603a29">view</a>]</li> +<li>Fixed jump to anchor issue when navigating to source file [<a href="https://github.com/doxygen/doxygen/commit/94b726f4273df805846d7fdcd2e9d5bd7627f628">view</a>]</li> +<li>Fixed problem generating per letter namespace member index pages. [<a href="https://github.com/doxygen/doxygen/commit/2b722b57f20e044b061423109bfa7168a7a1b913">view</a>]</li> +<li>Fixed svgpan.js issue with Chrome causing empty SVG graphs [<a href="https://github.com/doxygen/doxygen/commit/5f01f783e2387a5d44ad70fbff5365aa0e5df938">view</a>]</li> +<li>Fixed typedef and define strings for Spanish translation [<a href="https://github.com/doxygen/doxygen/commit/f69eb5d79885788d6bfc6303f34f5f016b326f1c">view</a>]</li> +<li>Fixup man only output to use generator state push pop [<a href="https://github.com/doxygen/doxygen/commit/051fb8a536e1d52aa0a0422186975852dd139c06">view</a>]</li> +<li>For manpages remove trailing dash when no brief description [<a href="https://github.com/doxygen/doxygen/commit/98d3f8e7d581c589e7bd1a7faf98fc6736847cf1">view</a>]</li> +<li>Made the RTF output honor the PAPER_TYPE option. [<a href="https://github.com/doxygen/doxygen/commit/5e894a760a6584ade2f5417e2577b66c65b51fd9">view</a>]</li> +<li>New classes for generated HTML div elements. [<a href="https://github.com/doxygen/doxygen/commit/84017cac3bc9d08aa95a90cf0e44b913c492c939">view</a>]</li> +<li>Option for PlantUML configuration file [<a href="https://github.com/doxygen/doxygen/commit/d4b0b88e189027d514fa84de75100ff1fe6e681a">view</a>]</li> +<li>Removed x flag from util* source files [<a href="https://github.com/doxygen/doxygen/commit/16d57031188698c7e79dd64554efc56044e91c8f">view</a>]</li> +<li>Replaced section marker before members by diamond shaped bullet [<a href="https://github.com/doxygen/doxygen/commit/da21ad5b5147182c2117751d8c517b81dd57277f">view</a>]</li> +<li>Reverting pull request #537 until it will be fixed [<a href="https://github.com/doxygen/doxygen/commit/fd67ef1f66afb0b51a784866b806ba8f04e12dfb">view</a>]</li> +<li>Update Swedish translation [<a href="https://github.com/doxygen/doxygen/commit/78b43ec9b5469a9e757cd658d21907fa593ed1aa">view</a>]</li> +<li>Updated the Polish translation [<a href="https://github.com/doxygen/doxygen/commit/158b7bdb697d19736692105161af3e891ae7732e">view</a>]</li> +<li>bison: use %declarations instead of command line options. [<a href="https://github.com/doxygen/doxygen/commit/97c2c1d6f323d6d38dda4820c00ca8ca8f5b6940">view</a>]</li> +<li>flex: use %option instead of command line options. [<a href="https://github.com/doxygen/doxygen/commit/0bdb01d4b6ced07750d8e449fd4ffab5554d8a24">view</a>]</li> </ul> <p> \endhtmlonly @@ -199,156 +600,156 @@ <a name="1.8.12"></a> </p> <ul> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306025">306025</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://bugzilla.gnome.org/show_bug.cgi?id=504305">504305</a> - FILTER_PATTERNS won't take command with arguments [<a href="http://github.com/doxygen/doxygen/commit/ce7a983c2849e4c8fa72189a896e594a8497dd4c">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675165">675165</a> - Uses <img> instead of <object> html tag for SVG images [<a href="http://github.com/doxygen/doxygen/commit/8ccd98643a3b88aaa3245b76202666900a2cd401">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700381">700381</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://bugzilla.gnome.org/show_bug.cgi?id=710611">710611</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://bugzilla.gnome.org/show_bug.cgi?id=722654">722654</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://bugzilla.gnome.org/show_bug.cgi?id=742452">742452</a> - Fortran: attributes after a blank line are ignored / Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625602">625602</a> - FORTRAN: comment in subroutine argument list [<a href="http://github.com/doxygen/doxygen/commit/e9ebf43585bffee80c31dd69538feae2a4525178">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=749924">749924</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://bugzilla.gnome.org/show_bug.cgi?id=750930">750930</a> - Representation of arrows [<a href="http://github.com/doxygen/doxygen/commit/ab96c077a8cd99308e6ae90c3c861ab1c0e911d7">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751416">751416</a> - Markdown: > escaped within backticks [<a href="http://github.com/doxygen/doxygen/commit/5f9d80b2ce73a7e7fb0f4fc16f3ef5fee0cf8105">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751984">751984</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://bugzilla.gnome.org/show_bug.cgi?id=752712">752712</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://bugzilla.gnome.org/show_bug.cgi?id=753608">753608</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://bugzilla.gnome.org/show_bug.cgi?id=757509">757509</a> - __init__.py causes to ignore some inheritance [<a href="http://github.com/doxygen/doxygen/commit/607b8a302297169e4319280dba2a61dcbe042965">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=760086">760086</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://bugzilla.gnome.org/show_bug.cgi?id=760836">760836</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://bugzilla.gnome.org/show_bug.cgi?id=760970">760970</a> - CASE_SENSE_NAMES ignored [<a href="http://github.com/doxygen/doxygen/commit/fab854a10f358c15a69291a59388ea0c184bce20">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=761007">761007</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://bugzilla.gnome.org/show_bug.cgi?id=761139">761139</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://bugzilla.gnome.org/show_bug.cgi?id=761471">761471</a> - Do not allow ligatures in log output [<a href="http://github.com/doxygen/doxygen/commit/894bdfdf268ba24a268fa72d7b33899a9f3a126b">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=762670">762670</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://bugzilla.gnome.org/show_bug.cgi?id=762934">762934</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://bugzilla.gnome.org/show_bug.cgi?id=762982">762982</a> - regression, Unescaped percent sign in doxygen output [<a href="http://github.com/doxygen/doxygen/commit/d4ab02c2da7df472bebbf2724419ba00f2de229c">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=763104">763104</a> - hyperref link label drop underscores [<a href="http://github.com/doxygen/doxygen/commit/537a1c67f316c5a9d2d4542e94a4ace439a78b3a">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=763105">763105</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://bugzilla.gnome.org/show_bug.cgi?id=763471">763471</a> - imported section anchors are copied in project tagfile [<a href="http://github.com/doxygen/doxygen/commit/8542ec9c8647da15de486635de40c25f99fc8c63">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=763720">763720</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>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=764359">764359</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://bugzilla.gnome.org/show_bug.cgi?id=764515">764515</a> - doxygen crashes no resolved [<a href="http://github.com/doxygen/doxygen/commit/0e45c10d7db6dc82aa0828df7e30ec4c8c5a1f97">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=764656">764656</a> - generated xml has errors [<a href="http://github.com/doxygen/doxygen/commit/d3078f4e2e0fcb6dd5f82781b54dab8647f7ccc4">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=764711">764711</a> - quick link index in alphabetical class list in classes.html doesn't work [<a href="http://github.com/doxygen/doxygen/commit/ec1ef7b4971540bbe042b16d7ebd3f2a0e0e57f1">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=765001">765001</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://bugzilla.gnome.org/show_bug.cgi?id=765002">765002</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://bugzilla.gnome.org/show_bug.cgi?id=765070">765070</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://bugzilla.gnome.org/show_bug.cgi?id=765692">765692</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://bugzilla.gnome.org/show_bug.cgi?id=766059">766059</a> - DOT_PATH not expanded [<a href="http://github.com/doxygen/doxygen/commit/752523cd122d6ffdd72c89955005d77819740675">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=766069">766069</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://bugzilla.gnome.org/show_bug.cgi?id=766464">766464</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://bugzilla.gnome.org/show_bug.cgi?id=766698">766698</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://bugzilla.gnome.org/show_bug.cgi?id=766787">766787</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://bugzilla.gnome.org/show_bug.cgi?id=766809">766809</a> - Enumerations heading present but none listed [<a href="http://github.com/doxygen/doxygen/commit/e7ac59b018cdf609cc7c6819f38a7de05c699058">view</a>] -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=767171">767171</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://bugzilla.gnome.org/show_bug.cgi?id=768830">768830</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://bugzilla.gnome.org/show_bug.cgi?id=768954">768954</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://bugzilla.gnome.org/show_bug.cgi?id=769018">769018</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://bugzilla.gnome.org/show_bug.cgi?id=769028">769028</a> - Can'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://bugzilla.gnome.org/show_bug.cgi?id=769736">769736</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://bugzilla.gnome.org/show_bug.cgi?id=770660">770660</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://bugzilla.gnome.org/show_bug.cgi?id=770747">770747</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 "anonymous" 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 "extension" 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 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 <p> 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>] -<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>] -<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://bugzilla.gnome.org/show_bug.cgi?id=765001">765001</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 -> 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'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>] +<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="https://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't take command with arguments [<a href="https://github.com/doxygen/doxygen/commit/ce7a983c2849e4c8fa72189a896e594a8497dd4c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4691">4691</a> - Uses <img> instead of <object> html tag for SVG images [<a href="https://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="https://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="https://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="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/ab96c077a8cd99308e6ae90c3c861ab1c0e911d7">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5811">5811</a> - Markdown: > escaped within backticks [<a href="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/936f242956350825d870f7396ae5d6106fe3081d">view</a>] +, [<a href="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/7228bca81e8d054413f85f8758fc13866ab4b85b">view</a>] +, [<a href="https://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="https://github.com/doxygen/doxygen/commit/0f53af1270a0032d4c24d93aeb7cce245427bf8d">view</a>] +, [<a href="https://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="https://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="https://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't work [<a href="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/1c8d2ecc67997ee88dfabbeafdbc2e9805a10e3f">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6035">6035</a> - Can't scroll using finger documentation in Chrome browser on Android OS [<a href="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/d2eeb765ffcf808812e7ac1c846dee97b85ad4bf">view</a>]</li> +<li>Add caption in verbatim blocks. [<a href="https://github.com/doxygen/doxygen/commit/f075557bf207d67cf2638298cbdd843cc1a2f7d7">view</a>]</li> +<li>Add parameter in/out specifiers to output. [<a href="https://github.com/doxygen/doxygen/commit/5592c705d8ac98f579e2675c12777330c4c322c9">view</a>]</li> +<li>Add section title to output. [<a href="https://github.com/doxygen/doxygen/commit/989a0137df8f8e11df67de1a2ded73712b46a8fd">view</a>]</li> +<li>Added .codedocs file [<a href="https://github.com/doxygen/doxygen/commit/5dee6e8aab6f8c76203a3296ef374e035cf55d34">view</a>]</li> +<li>Added an option to add "anonymous" headings to the table of contents (currently Markdown only). [<a href="https://github.com/doxygen/doxygen/commit/7e564896fcc41c2b1a6bd5c86ebebab0de7ea5f9">view</a>]</li> +<li>Added generating template files and reading templates from disk if present [<a href="https://github.com/doxygen/doxygen/commit/d38d33cef2241cd8d29c99f519d21ae225453357">view</a>]</li> +<li>Added missing free [<a href="https://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="https://github.com/doxygen/doxygen/commit/7b887cfbffd73ea12fe0171c149f49c4540aac40">view</a>]</li> +<li>Adding compilation options for flex/lex and bison/yacc [<a href="https://github.com/doxygen/doxygen/commit/c873fad0b4c2948551e53c082a3829243c4ccb9f">view</a>]</li> +<li>Adding partial htmlhelp support to template system [<a href="https://github.com/doxygen/doxygen/commit/d3f2fcd53000fc4a09cf56c90930f8c8e2ad02b4">view</a>]</li> +<li>Adjusted Doxygen to doxygen in running text in the manual [<a href="https://github.com/doxygen/doxygen/commit/4f80d144f98fc998de5118855eec73797a65bf2e">view</a>]</li> +<li>Allow verbatim code block to be placed on the output. [<a href="https://github.com/doxygen/doxygen/commit/4530978dba88a0d6ccc369e480e6b9a98d29fa1e">view</a>]</li> +<li>Also map .f95, .f03 and .f08 file types to Fortran [<a href="https://github.com/doxygen/doxygen/commit/dc6019413c4609c49322e80d1ec2b089e85486f3">view</a>]</li> +<li>Another possible fix [<a href="https://github.com/doxygen/doxygen/commit/445347566078a1cc64705f28932e1da5bf9f531f">view</a>]</li> +<li>Applied responsive design to menu bar using smartmenus [<a href="https://github.com/doxygen/doxygen/commit/8480d35beef57ed08139b58972bfb83a3b37422c">view</a>]</li> +<li>Assertion failure generation documentation [<a href="https://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="https://github.com/doxygen/doxygen/commit/10256be351f8f00ba5986750a08df1108bf6a4f7">view</a>]</li> +<li>Building doxyapp fails after update of config methodology to improve performance [<a href="https://github.com/doxygen/doxygen/commit/cf1706776bd93367dd357f505d04a7b10553f65f">view</a>]</li> +<li>Bump version for GIT repo [<a href="https://github.com/doxygen/doxygen/commit/295a467a2ebee260d95c7bb3e3c616554b7782b1">view</a>]</li> +<li>CMAKE: Fix building on Windows with VS 2015 [<a href="https://github.com/doxygen/doxygen/commit/6b80cc4181dc73a061b049e3283e6e2d8a4e5346">view</a>]</li> +<li>Changed configuration mechanism to directly access options in order to improve performance [<a href="https://github.com/doxygen/doxygen/commit/a93ec7221d1a258f0268e0c081782478372efe0b">view</a>]</li> +<li>Code with "extension" unparsed shows line numbers [<a href="https://github.com/doxygen/doxygen/commit/2b229f69041023f5f473385ee587ef7743850f55">view</a>]</li> +<li>Color code word OPERATOR and ASSIGNMENT as keyword in FORTRAN code [<a href="https://github.com/doxygen/doxygen/commit/3f559575d63f2fd29888107afae85f4cc902b189">view</a>]</li> +<li>Color code word RESULT as keyword in FORTRAN code [<a href="https://github.com/doxygen/doxygen/commit/0f047eb1862193713889d10bccb4894df1f7c23d">view</a>]</li> +<li>Determination of end of parameter list [<a href="https://github.com/doxygen/doxygen/commit/80f08d11c9a21db86bbeb106194f4e76f67bd50e">view</a>]</li> +<li>Disable selecting line number [<a href="https://github.com/doxygen/doxygen/commit/7bda78adac5d72396526c503325020a11cc12464">view</a>]</li> +<li>Disabled debug prints [<a href="https://github.com/doxygen/doxygen/commit/3e03e42e2b10bf2ccba5ab35e52c665ac35cfa15">view</a>]</li> +<li>Documentation for extensions .f95, .f03 and .f08 [<a href="https://github.com/doxygen/doxygen/commit/4c2e91c10dc6d007c410cd282a00fc7a42d38a0d">view</a>]</li> +<li>Doxygen fails to copy logo image to LaTex output dir [<a href="https://github.com/doxygen/doxygen/commit/711c6c0bee87d47d70b3ffa9ca8b39b704e91723">view</a>]</li> +<li>FORTRAN determination string in preprocessing [<a href="https://github.com/doxygen/doxygen/commit/4a7673fed2f28a24e0c7e8bb94621b0e14ac9ed5">view</a>]</li> +<li>Feature: Translations for german language (changes since 1.8.4) [<a href="https://github.com/doxygen/doxygen/commit/261077497f2bcc3364e182e338d914c470a0a235">view</a>]</li> +<li>Fix STRIP_FROM_PATH when running from drive root [<a href="https://github.com/doxygen/doxygen/commit/fd808ae3c1e37a8d476d250cf6b4325624a9eccb">view</a>]</li> +<li>Fix Windows build instructions. [<a href="https://github.com/doxygen/doxygen/commit/eec8d0a31161746041fc94ccbba5a54aecd8cf93">view</a>]</li> +<li>Fix documentation typos [<a href="https://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="https://github.com/doxygen/doxygen/commit/0faf45600c6c640bfaf11b017d43a4b9de193ebf">view</a>]</li> +<li>Fix for changed references due to different removeRedudantWhiteSpace() implementation [<a href="https://github.com/doxygen/doxygen/commit/f26cc41d0d3d436c809c293a56c66c1f5f953745">view</a>]</li> +<li>Fix for empty file name [<a href="https://github.com/doxygen/doxygen/commit/0fead5249b8ef2c3c5cbbbd712855bae877aa27b">view</a>]</li> +<li>Fix for error in travis.yml [<a href="https://github.com/doxygen/doxygen/commit/81cf39f249c58db66368d60d596ac164d886ae90">view</a>]</li> +<li>Fix issue escaping backslash inside markdown style code span [<a href="https://github.com/doxygen/doxygen/commit/402970f77f961b85b6371c8e53bd69981435c2d7">view</a>]</li> +<li>Fix linker flags for building with clang on Windows [<a href="https://github.com/doxygen/doxygen/commit/41846b467bea58b904e26ce139394f7371ea5870">view</a>]</li> +<li>Fix order of member initilaization [<a href="https://github.com/doxygen/doxygen/commit/6b1ebb6bcb345d8997054492c21276dc2dc36416">view</a>]</li> +<li>Fix return-type warnings with -DNDEBUG [<a href="https://github.com/doxygen/doxygen/commit/f4574baf118da6aa2051b865040a9948bb0d22c9">view</a>]</li> +<li>Fix search box rendering in HTML when menu bar is disabled [<a href="https://github.com/doxygen/doxygen/commit/ee9a0664c03c306d0aeb127295ced29f8078ae03">view</a>]</li> +<li>Fix uppercase letters B-Z being unnecessarily escaped in index HTML anchors. [<a href="https://github.com/doxygen/doxygen/commit/0f699ab17cb88beff0ae4aa9b10042c0ccaff937">view</a>]</li> +<li>Fixed for index.hhp output when using template engine [<a href="https://github.com/doxygen/doxygen/commit/e629fc64d42121e86bf2230a3b515d1d0d868dcd">view</a>]</li> +<li>Fixed issue escaping ndashes (\--) and mdashes (\---) [<a href="https://github.com/doxygen/doxygen/commit/ef56187f733d946e4df130d9783eadea41ec1c97">view</a>]</li> +<li>Fixed problem with -w command when no Doxyfile was present and specified [<a href="https://github.com/doxygen/doxygen/commit/7c3126407bbb46717a4e0a09b61ee001702af7bf">view</a>]</li> +<li>Fixed two regressions found during extensive testing [<a href="https://github.com/doxygen/doxygen/commit/d9166baf589f50e94597829b04d0cabee4573130">view</a>]</li> +<li>Fixed typos. [<a href="https://github.com/doxygen/doxygen/commit/a787b94d11e9f337570bfab1d36a36b37438ccea">view</a>]</li> +<li>Fixed wrong <p> nesting issue for call/caller graphs [<a href="https://github.com/doxygen/doxygen/commit/50c78a6f0d720617c5a82045b5b2cd18882a15a9">view</a>]</li> +<li>Fortran inline source code and crash on Linux [<a href="https://github.com/doxygen/doxygen/commit/661991e55f7ae18e8143733f364d9d7864ec66d9">view</a>]</li> +<li>Improve output on mobile devices [<a href="https://github.com/doxygen/doxygen/commit/e0dc837a14a466dd4fb58a0a1e6e72b5c400f563">view</a>]</li> +<li>Improved list of files in htmlhelp.hhp [<a href="https://github.com/doxygen/doxygen/commit/f7a05140593d854955151e4286205ef1f908e07b">view</a>]</li> +<li>Improved sorting performance for directories and files [<a href="https://github.com/doxygen/doxygen/commit/5475bf2e9a0f1517567186b47595b8dad2b6b3a3">view</a>]</li> +<li>Include command show line number (e.g. LaTeX) [<a href="https://github.com/doxygen/doxygen/commit/a4bde1e1e71a24d6c714377be4265e95deb1acf3">view</a>]</li> +<li>Initialization of python variables and type determination [<a href="https://github.com/doxygen/doxygen/commit/46ba7769c4a0600c47f3de6871815398bab7ca91">view</a>]</li> +<li>Introducing commands includedoc and snippetdoc [<a href="https://github.com/doxygen/doxygen/commit/ba848363081c44c9aa9e91b193054983f562e90c">view</a>]</li> +<li>Latex page numbering [<a href="https://github.com/doxygen/doxygen/commit/044f2c49882815f58c88b12a0086ad71dd97f071">view</a>]</li> +<li>Minor build fixes [<a href="https://github.com/doxygen/doxygen/commit/5a7a5477cd60ea7cc10b8132862a4928af788028">view</a>]</li> +<li>Minor correction for BUILD.txt [<a href="https://github.com/doxygen/doxygen/commit/89ef13dbb6c8ac81a9c118f4f031c45cdc66e3a3">view</a>]</li> +<li>Minor performance improvement sorting directories [<a href="https://github.com/doxygen/doxygen/commit/67827956351f78516a7c48df366dcf521c51c6eb">view</a>]</li> +<li>Minor update to the installation instructions [<a href="https://github.com/doxygen/doxygen/commit/840d3d18a172edaf92f7780340b1aee4198846fe">view</a>]</li> +<li>Missing semicolon in navtree.css [<a href="https://github.com/doxygen/doxygen/commit/360987c61462c185942e5055a345dd777920216a">view</a>]</li> +<li>Modified (readability) layout for member title in HTML and LaTex [<a href="https://github.com/doxygen/doxygen/commit/a2ae382198092537b6b5c85f9c7e5615046d3c78">view</a>]</li> +<li>Optimized use of convertNameToFile to improve performance [<a href="https://github.com/doxygen/doxygen/commit/d168f8bfef6aac5a71eccad36dced78d55765ae1">view</a>]</li> +<li>PDF generation stops when image with caption is included in a table. [<a href="https://github.com/doxygen/doxygen/commit/1d77a4ed407aaa24eae53f501d1a5ce38b352504">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/7b0b7ef746ae15df3894847f5b43a29ae20c9599">view</a>]</li> +<li>Parse more than 1 size indiction in defaultHandleTitleAndSize [<a href="https://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="https://github.com/doxygen/doxygen/commit/ed875603dc42d3a5ebbcfd89540b1f7ecf472ece">view</a>]</li> +<li>Python strip code comments [<a href="https://github.com/doxygen/doxygen/commit/a19feec4a7864dc17fcb570330ae2f7b9a5c6e45">view</a>]</li> +<li>Reimplemented node renumbering for dot graph to improve performance [<a href="https://github.com/doxygen/doxygen/commit/fb66cae35cd59d1026fe3c6de46ae3a2ed6f9f91">view</a>]</li> +<li>Remove unused variables [<a href="https://github.com/doxygen/doxygen/commit/aa61a4b33e2dd5c0f4809dd23f4561bd225270f9">view</a>] +, [<a href="https://github.com/doxygen/doxygen/commit/e698e53d2c04833143e5ab60f0983e3c683cf85d">view</a>]</li> +<li>Removed ambiguity in the XML schema definition [<a href="https://github.com/doxygen/doxygen/commit/13946338f9e5fcdb6dca7f8e4c2429ca000455fb">view</a>]</li> +<li>Revert #291 [<a href="https://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="https://github.com/doxygen/doxygen/commit/e70b45fa4398450b588122f9d36b1ed514fc336a">view</a>]</li> +<li>Sorting in latex index and missing \@ in index [<a href="https://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="https://github.com/doxygen/doxygen/commit/2f6f48567cb48d21361237a7905e27744e0acf91">view</a>]</li> +<li>Style fixes and added numbering to overloaded members [<a href="https://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="https://github.com/doxygen/doxygen/commit/7f7f7273f816335d556668b86aa99d05f7f09992">view</a>]</li> +<li>Unified display of enum values across output formats and languages [<a href="https://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="https://github.com/doxygen/doxygen/commit/4d2e203a55a2af8f15a3933b86201e6e9b6901b3">view</a>]</li> +<li>Update LICENSE file to latest from FSF [<a href="https://github.com/doxygen/doxygen/commit/48eb44a00b4b805fda0da82620d7efb135116d23">view</a>]</li> +<li>Update copyright year in docs [<a href="https://github.com/doxygen/doxygen/commit/b721f6e1707f8cc446c0d7f9956e6d4aa9f17bc9">view</a>]</li> +<li>Updated README.md to include code docs [<a href="https://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="https://github.com/doxygen/doxygen/commit/64597bbe46169c08b591a8714f48d314c5341cc2">view</a>]</li> +<li>Warnings from CLANG compiler [<a href="https://github.com/doxygen/doxygen/commit/fdfb027f346c30d6cd209b366e6cb879fb11cbcb">view</a>]</li> +<li>fix ninja build error [<a href="https://github.com/doxygen/doxygen/commit/c4cdfdf65073824d7badb38a1f535310b93d50a9">view</a>]</li> +<li>fixed rtf subsection [<a href="https://github.com/doxygen/doxygen/commit/17bd813313cf073a437001f2fa550f286458586e">view</a>]</li> +<li>mangen.h: remove italic in brief member descriptions [<a href="https://github.com/doxygen/doxygen/commit/5716f0aee08bfc9daf7ab7e22566e5acc51446d0">view</a>]</li> +<li>reimplemented removeRedundantWhiteSpace() to improve performance [<a href="https://github.com/doxygen/doxygen/commit/00ee930a1d73e11885197102c54fd4c8141127da">view</a>]</li> +<li>sqlite3gen: defnname -> defname [<a href="https://github.com/doxygen/doxygen/commit/79a53cc464ef814adf6b64d45a15fee6676f15d6">view</a>]</li> +<li>sqlite3gen: export proper memberdef refid [<a href="https://github.com/doxygen/doxygen/commit/918cf6871359da9d14dd6d3e7c4d00d6ca9a496e">view</a>]</li> +<li>sqlite3gen: insert xrefs using integer refids [<a href="https://github.com/doxygen/doxygen/commit/bac76c1957de71e3e0bddc23ccd46b7b2537c8a1">view</a>]</li> +<li>sqlite3gen: stripFromPath on all calls to insertFile [<a href="https://github.com/doxygen/doxygen/commit/87222afcfe6089899c8ded60b23692fd40997856">view</a>]</li> +<li>sqlite3gen: stripWhitespace on bitfield's text [<a href="https://github.com/doxygen/doxygen/commit/6f4561608adaf8230c2fa015770dfeeab5ce3ba8">view</a>]</li> +<li>sqlite3gen: sync with xmlgen [<a href="https://github.com/doxygen/doxygen/commit/8208b2d5514a3c29659ae967da544adc21585212">view</a>]</li> +<li>sqlite3gen: use the refid stored in the refids table [<a href="https://github.com/doxygen/doxygen/commit/9b02db93e7e78aedc0a0ca7fd2701c81dc153487">view</a>]</li> </ul> <p> \endhtmlonly @@ -359,153 +760,153 @@ <a name="1.8.11"></a> </p> <ul> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=149792">149792</a> - Mainpage title has wrong style in RTF [<a href="http://github.com/doxygen/doxygen/commit/021dfd44f2dbeeaac1b9aff95ddc2a3eae173eb4">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/83f23a4f7f7d1351ef89a4e54db6628a9d582dc5">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=333106">333106</a> - $line param [<a href="http://github.com/doxygen/doxygen/commit/993972cd242527ddf929756141a68cccfc8ecef9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=361814">361814</a> - python: tuple assignment not recognized as variable initialization [<a href="http://github.com/doxygen/doxygen/commit/015955e0badb6082a1e553392acaeb6890734c31">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=485701">485701</a> - Fixes angle brackets (< and >) not escaped in HTML formula alt text [<a href="http://github.com/doxygen/doxygen/commit/64adce8b82c332b3855cdfaaa71afc984ffc4ca9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=578720">578720</a> - [Python] Add pyw as a valid extension [<a href="http://github.com/doxygen/doxygen/commit/5924acd279f82d8db7ddb33a6ec67937084d7c31">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593642">593642</a> - Python: STRIP_CODE_COMMENTS Doesn't work within the source code [<a href="http://github.com/doxygen/doxygen/commit/4cad0c9ac3492dd504104b15c9a03ef903950e15">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595186">595186</a> - Python ignores \private tag [<a href="http://github.com/doxygen/doxygen/commit/8782107300b24ac5501d8a5ada9be0859a0ee432">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606104">606104</a> - Deprecated list: Wrong prefix '<globalScope>::' for global functions [<a href="http://github.com/doxygen/doxygen/commit/a5288aca31ccecb78b561b4f382fe6c559bea9f9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629249">629249</a> - Incorrect "References" and "Referenced by" [<a href="http://github.com/doxygen/doxygen/commit/43c415708be4c2d4065ecda9870d361b0beb0f09">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641036">641036</a> - python script with #!/usr/bin/python are not documented correctly [<a href="http://github.com/doxygen/doxygen/commit/322d09de48c07cf7258825e3e7733d5d994e70cf">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646002">646002</a> - htmlonly content appears in generated XML output [<a href="http://github.com/doxygen/doxygen/commit/02ce4f0b2b58ef32dd783b359daf7cc01079462a">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/6004d659c1ca280acc6588351176be63b55faf70">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=648865">648865</a> - PYTHON: stops processing the file after encountering \"""" [<a href="http://github.com/doxygen/doxygen/commit/59fdba0dd1e3765a2f53b222fdc9455114f720b1">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661814">661814</a> - writeMemberNavIndex template calls static fixSpaces [<a href="http://github.com/doxygen/doxygen/commit/69d5ffaa68210a6e63a618ef304c63462f6e1fac">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682373">682373</a> - Math does not work in LaTeX with custom header and footer. [<a href="http://github.com/doxygen/doxygen/commit/c713984bf6a4c9e8c2ea393b304682ce4a56358f">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731509">731509</a> - Markdown backticks not processed within Markdown links. [<a href="http://github.com/doxygen/doxygen/commit/205f7335bca570e87afc0df07bd355848c7af2e3">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=732356">732356</a> - doxygen's \param command is confused by some python default values [<a href="http://github.com/doxygen/doxygen/commit/6447c90acb51807d272ce2f24a94574a413d36e0">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735152">735152</a> - Python: Allow undocumented "cls" parameter for class methods [<a href="http://github.com/doxygen/doxygen/commit/0a5dfb77a7d0dfaac2baf8f3e61014a29ba2883b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742715">742715</a> - Unnamed structs gives: QGDict::hashAsciiKey: Invalid null key [<a href="http://github.com/doxygen/doxygen/commit/17b66265ace3418413b5cfab0335b4378e9c176b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=744938">744938</a> - PATCH: add option to build latex without timestamps [<a href="http://github.com/doxygen/doxygen/commit/9ef2dc156c37da7fb736c39c3c3fa5074e4d1829">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=745659">745659</a> - The table in classes.html has no class attribute [<a href="http://github.com/doxygen/doxygen/commit/0b4b2d76e4cc8fcb85d9b3ad7252e676e5a1d784">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746162">746162</a> - formulas creating invalid HTML code [<a href="http://github.com/doxygen/doxygen/commit/d5905871951cde51c6dcaa01d745de2f884ce9a9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746361">746361</a> - Doxygen thinks C++ class is Objective-C [<a href="http://github.com/doxygen/doxygen/commit/8da86f8adfb826f13321c7d163431f9671ba20b7">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751300">751300</a> - Doxygen don't support longer key in bibtex [<a href="http://github.com/doxygen/doxygen/commit/b0fc11e4a891e51bb4d982730efecddac2ef807e">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751321">751321</a> - \cite still rejects valid BibTeX keys [<a href="http://github.com/doxygen/doxygen/commit/b1601548308c8a6ec586a406155d24f80d75aafd">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751755">751755</a> - using plantuml cause a popup "openwith" windows when calling java.exe [<a href="http://github.com/doxygen/doxygen/commit/51ee1b0633fbfa935da08c8a13f70da6fc1c074d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751984">751984</a> - PATCH: Honour SOURCE_DATE_EPOCH environment variable for reproducible output [<a href="http://github.com/doxygen/doxygen/commit/b31266c1076c6284116f17241d9e8aa048f88e60">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752657">752657</a> - XML not documenting a class in python [<a href="http://github.com/doxygen/doxygen/commit/288afe7d4fe0953f5717b0ac85f805f78d96afa4">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752658">752658</a> - XML empty <argsstring/> in python [<a href="http://github.com/doxygen/doxygen/commit/a1b3f7b1157b8e7b392bfcd6c6452c664bf5a7c2">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752712">752712</a> - last entry missing in a @name group of typedefs [<a href="http://github.com/doxygen/doxygen/commit/21d14b3c7697f8807065070f5850259b1b6550e4">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752845">752845</a> - Non-alphanumeric characters in Markdown links don't work properly [<a href="http://github.com/doxygen/doxygen/commit/e89eb77b14810649c679dc7d377ddb4e6a942d82">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=753500">753500</a> - $file when using @name is wrong [<a href="http://github.com/doxygen/doxygen/commit/790887ea3f63c051954a4cd49f044fa4f536867d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=753909">753909</a> - Copy and paste of code fragment from CHM merges all pasted text into single line [<a href="http://github.com/doxygen/doxygen/commit/663544cc0caf9109ea10c33f38b1e07e7a01a575">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=754130">754130</a> - class="current" not applied to <li> for module tab within 'group__*.html' module html files [<a href="http://github.com/doxygen/doxygen/commit/0e2e8916f81892c891a33c5435024776ca0f570f">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=754184">754184</a> - \bug paragraph doesn't end with a new sectioning command [<a href="http://github.com/doxygen/doxygen/commit/13e2b18c93df1351c4e91d13a7fe224b4841fa73">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=754606">754606</a> - Double anchors when using groups [<a href="http://github.com/doxygen/doxygen/commit/e44780a7579ca865cc52801e920b1d20d2a3b438">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755080">755080</a> - xrefitem link to list incorrect when using SHORT_NAMES [<a href="http://github.com/doxygen/doxygen/commit/af5c5b37c5464afb6a2df71edf6f9e82ece75187">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755293">755293</a> - Tree view pane overlaps with content tabs [<a href="http://github.com/doxygen/doxygen/commit/8fc243491cbae2442c1e07faca99a8f6dc6f2e19">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755783">755783</a> - RTF output has incomplete "References" and "Referenced by" sections [<a href="http://github.com/doxygen/doxygen/commit/6184c70c515941212380006a2e6c879e1663daec">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755786">755786</a> - fatal: Cannot open 'graph_legend': No such file or directory [<a href="http://github.com/doxygen/doxygen/commit/08cf278fb80ffb7844b4339458cf4ad03453e827">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755939">755939</a> - Warning refers to incorrect line for undocumented member function (C++) [<a href="http://github.com/doxygen/doxygen/commit/a112c70c7a5d590286e0fad1382b9bb3fd86118b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=756241">756241</a> - Race condition in parallel DOT runs [<a href="http://github.com/doxygen/doxygen/commit/f196c9f1d69238a814ff3152103f3bd310efdf0d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=756604">756604</a> - Unable to prevent a numbered list [<a href="http://github.com/doxygen/doxygen/commit/3fbb1b66bd5303fa789a36317694bd77eb22ee19">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/5487f855ad12d0b7f3ba70aab72fd2debedae16d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=756724">756724</a> - Inline markdown links don't support reference targets that contain ) [<a href="http://github.com/doxygen/doxygen/commit/59a42f974f15fa0154317900ffd9b82babd985ad">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=757300">757300</a> - Failed to document nested classes with "reference to array" parameters [<a href="http://github.com/doxygen/doxygen/commit/3bcef269a4fe5bfc1921d7ba934bc09c715eae9c">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=757621">757621</a> - unclosed tag, c# generics method with where [<a href="http://github.com/doxygen/doxygen/commit/1bb819f5b680d600f010761b21e44df2f5e35ccc">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=757812">757812</a> - Doxygen do not support comparison angle bracket in template [<a href="http://github.com/doxygen/doxygen/commit/f836266a4538153a1164642e168bb04c529a4d51">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=758132">758132</a> - Brief description of non documented functions [<a href="http://github.com/doxygen/doxygen/commit/7a2164d252a0cb5410ab13b0ca1611a8e94e3c99">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/1b402f49a0638dd0eec2a123462862c6d4c4084d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=758495">758495</a> - Bug in VHDL parser + other fixes [<a href="http://github.com/doxygen/doxygen/commit/4bef27771fec1892331df637dd6184abac36fd8f">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=758900">758900</a> - C++ templated member-function appears both as public and private [<a href="http://github.com/doxygen/doxygen/commit/bb4e403968dc1ac4deb3b47c0b79b4304f1be288">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759177">759177</a> - Markdown fenced code blocks not parsed properly in comment [<a href="http://github.com/doxygen/doxygen/commit/ae6311ea0855d576a7c4b589dd5f4b994a47fd6c">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759247">759247</a> - C++11 unified initializer for array with templates treated as function [<a href="http://github.com/doxygen/doxygen/commit/692544fb47407a3f2c5a5a5e4b80185428adda25">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759281">759281</a> - Doxygen parser confused by C++11 attributes [<a href="http://github.com/doxygen/doxygen/commit/6c005b1e9458430a77bfeba6d08deed4778ad71d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759381">759381</a> - unable to @ref or @link C++ templated operator overloads [<a href="http://github.com/doxygen/doxygen/commit/da09bff6dc9cad40c72b6a858728093cc41dff47">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759622">759622</a> - problems with charset using plantuml [<a href="http://github.com/doxygen/doxygen/commit/165498dc9ea33bc9991c5ab5234b5e51d74569d0">view</a>]</li> -<li>Actually using value of GROUP_NESTED_COMPOUNDS option [<a href="http://github.com/doxygen/doxygen/commit/3b314b5d856f6f7a25d512737e640a6b7b17c8d4">view</a>]</li> -<li>Add RPM build for Red Hat [<a href="http://github.com/doxygen/doxygen/commit/7f8f31cb8318e663f2ec145b63fb31278bdd7a76">view</a>]</li> -<li>Add WARN_AS_ERROR option to stop execution at first warning (equivalent of compilers' -Werror option) [<a href="http://github.com/doxygen/doxygen/commit/38277f1da56c212c9b33f774de412edef1156544">view</a>]</li> -<li>Add examples to LaTeX / PDF doxygen manual [<a href="http://github.com/doxygen/doxygen/commit/3a236fd01dc23d2d979e06d848f61b002cb4e6ee">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/5e11f885eea694c2ecfeae6ff5774b66eea312e4">view</a>]</li> -<li>Add mathjax support to template & context. [<a href="http://github.com/doxygen/doxygen/commit/56987af3987f40ac77e70cd39ebbdac3702c1ce2">view</a>]</li> -<li>Add support for "value" attribute in FORTRAN scanner [<a href="http://github.com/doxygen/doxygen/commit/6dacbd9b22bdd6cd1a8c3e9b5ec8c2f7d15977b8">view</a>]</li> -<li>Added documentation for creating tables [<a href="http://github.com/doxygen/doxygen/commit/23faa449843eeb4c9e40e650df8844abec024bb7">view</a>]</li> -<li>Added javascript search engine data to the template context [<a href="http://github.com/doxygen/doxygen/commit/6bb0d2908b4ca7908a8e655a5abcf7615a5f4c77">view</a>]</li> -<li>Added missing html resources to the html template file [<a href="http://github.com/doxygen/doxygen/commit/43a0883022f64539498b84220d487b16ffd49a7e">view</a>]</li> -<li>Added missing information to template version of the all members list [<a href="http://github.com/doxygen/doxygen/commit/f16c156065ac8bc6242870c2ae701252b5d4f9b2">view</a>]</li> -<li>Added support for directory dependency graphs to template engine [<a href="http://github.com/doxygen/doxygen/commit/abe254fbe2235f5b913653acd076d2acd579d5e1">view</a>]</li> -<li>Adding compilation options for flex/lex and bison/yacc [<a href="http://github.com/doxygen/doxygen/commit/beb2ff6c39fefbd6aaeecd5de9827d1b1947740b">view</a>]</li> -<li>Adjusted used option for CLANG usage with CMake in documentation [<a href="http://github.com/doxygen/doxygen/commit/82063c0601b9f7b11c1774a1a42e13295c486467">view</a>]</li> -<li>Alignment in LaTeX parameter table [<a href="http://github.com/doxygen/doxygen/commit/a0880ff1c41a1c57bc92c1ccf99cf750064e2995">view</a>]</li> -<li>Avoid using Resource::data as string, as it is not null terminated. [<a href="http://github.com/doxygen/doxygen/commit/15a87a623791bf407b3076960cdd1133c8973357">view</a>]</li> -<li>Better handling of implicit statement in source code browser [<a href="http://github.com/doxygen/doxygen/commit/404468ac5484d54e47129ce2a00b3ad6e1c2c72a">view</a>]</li> -<li>Bug 149792 - Mainpage title has wrong style in RTF [<a href="http://github.com/doxygen/doxygen/commit/077aeb768767e62407abb4759d44671619bc62fd">view</a>]</li> -<li>Bump version so that the GIT repo represents the version for the "next" release [<a href="http://github.com/doxygen/doxygen/commit/42c376cdb41db392bd025611ccfcaddb49d05e92">view</a>]</li> -<li>Cmake tries to remove directory refman.tex instead of file refman.tex [<a href="http://github.com/doxygen/doxygen/commit/63094c8bb34a2e02e8490860660303d849e4a984">view</a>]</li> -<li>Copy user EXTRA_FILES at the end to overrule files generated by default by doxygen [<a href="http://github.com/doxygen/doxygen/commit/82f08138ad08fa5b8906c162283c4df0e9819d83">view</a>]</li> -<li>Correct / set types for python variables [<a href="http://github.com/doxygen/doxygen/commit/c47920b217491fc861cdac73d44ab4f93d08423e">view</a>]</li> -<li>Correcting print format error in config.l [<a href="http://github.com/doxygen/doxygen/commit/9947c11284542a74c56e52b55be032350c6bbc3e">view</a>]</li> -<li>DO NOT hardcode x86-64 architecture. [<a href="http://github.com/doxygen/doxygen/commit/031780293d2838da2643b46878061598ebb56822">view</a>]</li> -<li>Don't show a console when launching doxywizard on Windows. [<a href="http://github.com/doxygen/doxygen/commit/942efcb758977fe95fafc473813528085b56e4ee">view</a>]</li> -<li>Fix computeCommonDirPrefix sometimes not finding the correct prefix [<a href="http://github.com/doxygen/doxygen/commit/c6bf96520bcff56d3fd67d4277c05b8db9ac2128">view</a>]</li> -<li>Fix error documentation of in flex debug script [<a href="http://github.com/doxygen/doxygen/commit/09c4e990e4e214900e613343fb9bfbbb08f1bc53">view</a>]</li> -<li>Fix for broken link in the manual [<a href="http://github.com/doxygen/doxygen/commit/355370151b61f79633b3867634d76eaf8bacce54">view</a>]</li> -<li>Fix hexChar for inputs 0 <= i < 10 [<a href="http://github.com/doxygen/doxygen/commit/327422d131ed5e6ddf280043b5a56a6fb92d3bbc">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/62da4521880a03b8a92887539eaf76ccad2ee770">view</a>]</li> -<li>Fix spelling in doc/commands.doc (descriptionm) [<a href="http://github.com/doxygen/doxygen/commit/bd7da008fac074202e3265787907434fbfb40e71">view</a>]</li> -<li>Fix typo in function name [<a href="http://github.com/doxygen/doxygen/commit/ace0af42e330a96ad691b2d9a08dd3ff4abb2629">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/b890f40d195b9dc5db12aaa398707de138093c66">view</a>]</li> -<li>Fixed a couple of small memory leaks [<a href="http://github.com/doxygen/doxygen/commit/85ddfc814f33943199928447b4627d05b0920b99">view</a>]</li> -<li>Fixed a number of memory leaks in the template engine [<a href="http://github.com/doxygen/doxygen/commit/d14bcd1f8f5bd4a2034bae842000630f4e098eb6">view</a>]</li> -<li>Fixed compiler warning for MacOSX [<a href="http://github.com/doxygen/doxygen/commit/0aa27346b8728f6698dd2b363959e89d02e03ff6">view</a>]</li> -<li>Fixed link issue for MacOSX 10.11 [<a href="http://github.com/doxygen/doxygen/commit/0918a19225daedfbd5e23388124a5de3860d5420">view</a>]</li> -<li>Fixed minor typos in comments [<a href="http://github.com/doxygen/doxygen/commit/29c500434d30cd4d9c20f6b295475ed42dba2930">view</a>]</li> -<li>Fixed preprocessor macros for flex version check [<a href="http://github.com/doxygen/doxygen/commit/a8c73cdbe37cc53c398002d20e94037552a8fb55">view</a>]</li> -<li>Fixed problem with latex and PDF bookmarks [<a href="http://github.com/doxygen/doxygen/commit/499ecaedf1ee1222535be27f77050ee633595685">view</a>]</li> -<li>Fixed various issues found by PVS-Studio. [<a href="http://github.com/doxygen/doxygen/commit/48ced3ea8071b3141216482e2821e10250910947">view</a>]</li> -<li>Fixes bug 485701: Angle brackets (< and >) not escaped in HTML formula alt text [<a href="http://github.com/doxygen/doxygen/commit/08aa01cb0ee9b2dd6403f753156d8b58d8e62145">view</a>]</li> -<li>Fixes to support nested tables again [<a href="http://github.com/doxygen/doxygen/commit/883989fced827524354297009fde396ca6264a31">view</a>]</li> -<li>Fortran module private variables and EXTRACT_PRIVATE = NO [<a href="http://github.com/doxygen/doxygen/commit/61820a08200ec62c754cacf8dd3a1121ce6dee69">view</a> and <a href="http://github.com/doxygen/doxygen/commit/8504fc3a06e3430242eab9ac1c1f20319112e6a9">view</a>]</li> -<li>Improved handling of <caption> in tables for LaTeX output. [<a href="http://github.com/doxygen/doxygen/commit/fa6585b2fc6847c2b242b226b163810c7a6366de">view</a>]</li> -<li>IncludeInfo class had uninitialized member variable [<a href="http://github.com/doxygen/doxygen/commit/76a9892b190efaeb3c764d824bd285ff3d2c57dc">view</a>]</li> -<li>Made paragraph spacing more flexible in the LaTeX output to prevent page overflows [<a href="http://github.com/doxygen/doxygen/commit/17b3b41e12e890187f6b7dcc98ed9e2451b14018">view</a>]</li> -<li>Made several improvements to the performance of template engine [<a href="http://github.com/doxygen/doxygen/commit/ded4e9a92670d0157cdcc5cbf7a4a1e3193e179a">view</a>]</li> -<li>Make doxywizard compatible with Qt5 [<a href="http://github.com/doxygen/doxygen/commit/333c7c44f1aa3c62f9401b190e45eaff15056d5c">view</a>]</li> -<li>Make list of default extensions consistent with language mapping list [<a href="http://github.com/doxygen/doxygen/commit/bf35f16863f067286260ad4b68ec4c0ae7febdf1">view</a>]</li> -<li>Markdown with @cond and @endcond [<a href="http://github.com/doxygen/doxygen/commit/c5a7911741850777b699a63ae5b7702e379a5ada">view</a>]</li> -<li>Markdown with @cond and @endcond [<a href="http://github.com/doxygen/doxygen/commit/dc26830396970d402ad42d20f1b99bd86f4a5961">view</a>]</li> -<li>Merge remote-tracking branch 'upstream/master' [<a href="http://github.com/doxygen/doxygen/commit/6aba65a4dfaec1aa1131e160ed252d0713403760">view</a>]</li> -<li>Minor change to pycode.l:codifyLines [<a href="http://github.com/doxygen/doxygen/commit/bbd71be14986e637af9958b2cc18d1d62743ba8e">view</a>]</li> -<li>Moved creation of inline class documentation to separate template file [<a href="http://github.com/doxygen/doxygen/commit/4bd50c9f0dc1d7b1413a6bda587b8a5999cd7a19">view</a>]</li> -<li>RTF improvement: Example section was merged with next function title [<a href="http://github.com/doxygen/doxygen/commit/ca617e1e1cd42ee0080c8c13ce3884c8671629dd">view</a>]</li> -<li>Remove obsolete py files [<a href="http://github.com/doxygen/doxygen/commit/183f36fe97cb95636f1947c2c4be61f7b78f87e0">view</a>]</li> -<li>Removed BOM marker from greek translator to avoid Visual C warnings [<a href="http://github.com/doxygen/doxygen/commit/9ee8f777f5a4b7a49e644c2da5247fa509038feb">view</a>]</li> -<li>Repaired breaking @include for LaTeX output [<a href="http://github.com/doxygen/doxygen/commit/ab861c197c596f78c7aea4f45c0e1252de10fc1f">view</a>]</li> -<li>Revert "Spelling correction for error message with USE_HTAGS usage" [<a href="http://github.com/doxygen/doxygen/commit/a888543ca5f3fd28121f7eea4dbd25898fa7be57">view</a>]</li> -<li>Revert using container-based infra as sudo is needed :-( [<a href="http://github.com/doxygen/doxygen/commit/f089c3fa4f47dc8bedd25d9d857d004525ee82c0">view</a>]</li> -<li>Reverted change that caused doxygen to return error code 2 when it produced a warning [<a href="http://github.com/doxygen/doxygen/commit/f9e6fe0bf3886be7e603083b3b200dbd60fbd529">view</a>]</li> -<li>Rework the generation of packages DEB/RPM/... (CPack) [<a href="http://github.com/doxygen/doxygen/commit/8c0c80e44e1e9cb1ce4e88a3e1d01b65536dc60c">view</a>]</li> -<li>Right alignment of in page table of contents [<a href="http://github.com/doxygen/doxygen/commit/a653f7499929f3f0a5b68614dec91242fbc0edf5">view</a>]</li> -<li>Small correction of errors in case of CSharp XML tags [<a href="http://github.com/doxygen/doxygen/commit/68dd27139e50e048f081549394e6fc6dc04fc699">view</a>]</li> -<li>Small documentation corrections [<a href="http://github.com/doxygen/doxygen/commit/564c8cd257e0dd1797d94633a0e92ddc5a496540">view</a>]</li> -<li>Spelling correction for error message with USE_HTAGS usage [<a href="http://github.com/doxygen/doxygen/commit/0d060c455207ab32092e5a7edcd5457bb00f4653">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/5cc45244002d1d7560233cfae01f9d5d735e1a3f">view</a>]</li> -<li>Started with generating LaTeX output via the template engine [<a href="http://github.com/doxygen/doxygen/commit/02a0c353a8947290a3191aead59db08dc84766ce">view</a>]</li> -<li>Stop when doxygen configuration file ("Doxyfile") cannot be read [<a href="http://github.com/doxygen/doxygen/commit/b8bd3d84590d9adee7084f066f0e3e8c75a99245">view</a>]</li> -<li>Support flex-2.6.0 [<a href="http://github.com/doxygen/doxygen/commit/8c51120ad55b440b738ef0b96f8169d84a7ae88a">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/cf936efb8ae99dd297b6afb9c6a06beb81f5b0fb">view</a>]</li> -<li>Support set in code highlighting [<a href="http://github.com/doxygen/doxygen/commit/1cbcce4ef3460f48ab9c8e9435eec21075dcc788">view</a>]</li> -<li>Template enhancements and various other small fixes [<a href="http://github.com/doxygen/doxygen/commit/e58fb0a46f73f37d16859f43fda1eb5ba4a15c5d">view</a>]</li> -<li>Title in case of USE_MDFILE_AS_MAINPAGE [<a href="http://github.com/doxygen/doxygen/commit/09251b805b3c9d96917fedebb3768945d7559b1e">view</a>]</li> -<li>Tooltip can still contain < and > signs [<a href="http://github.com/doxygen/doxygen/commit/1df28fe4b9a0187f8fa6ed077e4a81002fa50fda">view</a>]</li> -<li>Tweaked the htmlonly sections in the manual so it produces valid HTML output [<a href="http://github.com/doxygen/doxygen/commit/de03970396e6f7edec359e2b71f3d2aa9d6a6237">view</a>]</li> -<li>Undo _doxygen to libdoxygen target change [<a href="http://github.com/doxygen/doxygen/commit/940048580f2d61a137e7abbb67b3aed567bfe865">view</a>]</li> -<li>Updated instructions to toggle debugging flex code [<a href="http://github.com/doxygen/doxygen/commit/368f4f057be0ded4673be826c9a08cd771a023ce">view</a>]</li> -<li>Updated Italian translation and translator email address [<a href="http://github.com/doxygen/doxygen/commit/a9ad21b4e541d91c804ac39e393cc0c1db4f45f3">view</a>]</li> -<li>Updated the Greek translation [<a href="http://github.com/doxygen/doxygen/commit/4e0b7f0b9a2a04d0bb5e66871da6d7ffa786836e">view</a>]</li> -<li>Use CPack to generate rpm/deb packages [<a href="http://github.com/doxygen/doxygen/commit/ba6eb1478d24dc32d4e123951e2f62c75b4b88bd">view</a>]</li> -<li>Use STATIC libraries to prevent them being shared [<a href="http://github.com/doxygen/doxygen/commit/37a148f6e35523fd2bbbdbc37e6ed838684c6d90">view</a>]</li> -<li>Using tabu package for LaTeX tables [<a href="http://github.com/doxygen/doxygen/commit/647b6ac8669cd8ba1e8c60eeb3c2de961c7d6a1b">view</a>]</li> -<li>[Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755225">755225</a>] On Windows, generated layout is with UNIX EOL [<a href="http://github.com/doxygen/doxygen/commit/78a80001223af290c7c7321ad2d210fb3cd16f11">view</a>]</li> -<li>[Doxygen-users] plugin / filter not behaving as expected [<a href="http://github.com/doxygen/doxygen/commit/0c7f182016c7c2604a484367738e76cb40c0541b">view</a>]</li> -<li>add spaces like "Doyxgen"CN_SPC->"Doyxgen" CN_SPC [<a href="http://github.com/doxygen/doxygen/commit/35d1aa8bf9208302601fa96462e246c98aa0b0e5">view</a>]</li> -<li>allow building with custom iconv on Windows [<a href="http://github.com/doxygen/doxygen/commit/3d684f6d123abdbf630bb19bc6095cc9d69efb68">view</a>]</li> -<li>doc: generate doxygen's documentation. [<a href="http://github.com/doxygen/doxygen/commit/3c4a1ea2ee56f2604c2277f13737d53b3a0b0353">view</a>]</li> -<li>doc: put man pages under share/man/man1 [<a href="http://github.com/doxygen/doxygen/commit/95d28153779810dc95afafa38ed838f32516a1f4">view</a>]</li> -<li>docparser: warn when finding a documented empty return type [<a href="http://github.com/doxygen/doxygen/commit/10989e2dade3bb35a421787c5315d2630d665842">view</a>]</li> -<li>docs: add examples as a dependency of docs [<a href="http://github.com/doxygen/doxygen/commit/ec5fde6913935fbe2015220259b611a17a437de3">view</a>]</li> -<li>doxyapp and CLANG linking [<a href="http://github.com/doxygen/doxygen/commit/a58a2cafbc136f7821b9313bd6c1413eaab3e868">view</a>]</li> -<li>fixed for travis ci config file [<a href="http://github.com/doxygen/doxygen/commit/ecbb77b40892df8740476023545769ffbda6fd6f">view</a>]</li> -<li>libpng warning: iCCP: known incorrect sRGB profile [<a href="http://github.com/doxygen/doxygen/commit/c82ac124812dd2f9a5e8b36fcdcf7daf20cfbdda">view</a>]</li> -<li>rename build target _doxygen to libdoxygen [<a href="http://github.com/doxygen/doxygen/commit/4116648d3c62aee54c385644a4fe754ee7a4261d">view</a>]</li> -<li>run_translator.cmake is no longer used [<a href="http://github.com/doxygen/doxygen/commit/45e153f2238d0fa031d147cfe207e52b913845eb">view</a>]</li> -<li>runtests: Simplify dictionary usage [<a href="http://github.com/doxygen/doxygen/commit/95d99a4c857d7d5208d8faf974b01354a798eba4">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/1204">1204</a> - Mainpage title has wrong style in RTF [<a href="https://github.com/doxygen/doxygen/commit/021dfd44f2dbeeaac1b9aff95ddc2a3eae173eb4">view</a> and [<a href="https://github.com/doxygen/doxygen/commit/83f23a4f7f7d1351ef89a4e54db6628a9d582dc5">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2059">2059</a> - $line param [<a href="https://github.com/doxygen/doxygen/commit/993972cd242527ddf929756141a68cccfc8ecef9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2258">2258</a> - python: tuple assignment not recognized as variable initialization [<a href="https://github.com/doxygen/doxygen/commit/015955e0badb6082a1e553392acaeb6890734c31">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2653">2653</a> - Fixes angle brackets (< and >) not escaped in HTML formula alt text [<a href="https://github.com/doxygen/doxygen/commit/64adce8b82c332b3855cdfaaa71afc984ffc4ca9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3354">3354</a> - [Python] Add pyw as a valid extension [<a href="https://github.com/doxygen/doxygen/commit/5924acd279f82d8db7ddb33a6ec67937084d7c31">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3499">3499</a> - Python: STRIP_CODE_COMMENTS Doesn't work within the source code [<a href="https://github.com/doxygen/doxygen/commit/4cad0c9ac3492dd504104b15c9a03ef903950e15">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3515">3515</a> - Python ignores \private tag [<a href="https://github.com/doxygen/doxygen/commit/8782107300b24ac5501d8a5ada9be0859a0ee432">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3621">3621</a> - Deprecated list: Wrong prefix '<globalScope>::' for global functions [<a href="https://github.com/doxygen/doxygen/commit/a5288aca31ccecb78b561b4f382fe6c559bea9f9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3935">3935</a> - Incorrect "References" and "Referenced by" [<a href="https://github.com/doxygen/doxygen/commit/43c415708be4c2d4065ecda9870d361b0beb0f09">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4129">4129</a> - python script with #!/usr/bin/python are not documented correctly [<a href="https://github.com/doxygen/doxygen/commit/322d09de48c07cf7258825e3e7733d5d994e70cf">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4214">4214</a> - htmlonly content appears in generated XML output [<a href="https://github.com/doxygen/doxygen/commit/02ce4f0b2b58ef32dd783b359daf7cc01079462a">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/6004d659c1ca280acc6588351176be63b55faf70">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4249">4249</a> - PYTHON: stops processing the file after encountering \"""" [<a href="https://github.com/doxygen/doxygen/commit/59fdba0dd1e3765a2f53b222fdc9455114f720b1">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4433">4433</a> - writeMemberNavIndex template calls static fixSpaces [<a href="https://github.com/doxygen/doxygen/commit/69d5ffaa68210a6e63a618ef304c63462f6e1fac">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4856">4856</a> - Math does not work in LaTeX with custom header and footer. [<a href="https://github.com/doxygen/doxygen/commit/c713984bf6a4c9e8c2ea393b304682ce4a56358f">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5503">5503</a> - Markdown backticks not processed within Markdown links. [<a href="https://github.com/doxygen/doxygen/commit/205f7335bca570e87afc0df07bd355848c7af2e3">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5510">5510</a> - doxygen's \param command is confused by some python default values [<a href="https://github.com/doxygen/doxygen/commit/6447c90acb51807d272ce2f24a94574a413d36e0">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5556">5556</a> - Python: Allow undocumented "cls" parameter for class methods [<a href="https://github.com/doxygen/doxygen/commit/0a5dfb77a7d0dfaac2baf8f3e61014a29ba2883b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5715">5715</a> - Unnamed structs gives: QGDict::hashAsciiKey: Invalid null key [<a href="https://github.com/doxygen/doxygen/commit/17b66265ace3418413b5cfab0335b4378e9c176b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5747">5747</a> - PATCH: add option to build latex without timestamps [<a href="https://github.com/doxygen/doxygen/commit/9ef2dc156c37da7fb736c39c3c3fa5074e4d1829">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5755">5755</a> - The table in classes.html has no class attribute [<a href="https://github.com/doxygen/doxygen/commit/0b4b2d76e4cc8fcb85d9b3ad7252e676e5a1d784">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5760">5760</a> - formulas creating invalid HTML code [<a href="https://github.com/doxygen/doxygen/commit/d5905871951cde51c6dcaa01d745de2f884ce9a9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5763">5763</a> - Doxygen thinks C++ class is Objective-C [<a href="https://github.com/doxygen/doxygen/commit/8da86f8adfb826f13321c7d163431f9671ba20b7">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5808">5808</a> - Doxygen don't support longer key in bibtex [<a href="https://github.com/doxygen/doxygen/commit/b0fc11e4a891e51bb4d982730efecddac2ef807e">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5809">5809</a> - \cite still rejects valid BibTeX keys [<a href="https://github.com/doxygen/doxygen/commit/b1601548308c8a6ec586a406155d24f80d75aafd">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5821">5821</a> - using plantuml cause a popup "openwith" windows when calling java.exe [<a href="https://github.com/doxygen/doxygen/commit/51ee1b0633fbfa935da08c8a13f70da6fc1c074d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5826">5826</a> - PATCH: Honour SOURCE_DATE_EPOCH environment variable for reproducible output [<a href="https://github.com/doxygen/doxygen/commit/b31266c1076c6284116f17241d9e8aa048f88e60">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5830">5830</a> - XML not documenting a class in python [<a href="https://github.com/doxygen/doxygen/commit/288afe7d4fe0953f5717b0ac85f805f78d96afa4">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5831">5831</a> - XML empty <argsstring/> in python [<a href="https://github.com/doxygen/doxygen/commit/a1b3f7b1157b8e7b392bfcd6c6452c664bf5a7c2">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="https://github.com/doxygen/doxygen/commit/21d14b3c7697f8807065070f5850259b1b6550e4">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5833">5833</a> - Non-alphanumeric characters in Markdown links don't work properly [<a href="https://github.com/doxygen/doxygen/commit/e89eb77b14810649c679dc7d377ddb4e6a942d82">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5839">5839</a> - $file when using @name is wrong [<a href="https://github.com/doxygen/doxygen/commit/790887ea3f63c051954a4cd49f044fa4f536867d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5845">5845</a> - Copy and paste of code fragment from CHM merges all pasted text into single line [<a href="https://github.com/doxygen/doxygen/commit/663544cc0caf9109ea10c33f38b1e07e7a01a575">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5847">5847</a> - class="current" not applied to <li> for module tab within 'group__*.html' module html files [<a href="https://github.com/doxygen/doxygen/commit/0e2e8916f81892c891a33c5435024776ca0f570f">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5848">5848</a> - \bug paragraph doesn't end with a new sectioning command [<a href="https://github.com/doxygen/doxygen/commit/13e2b18c93df1351c4e91d13a7fe224b4841fa73">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5859">5859</a> - Double anchors when using groups [<a href="https://github.com/doxygen/doxygen/commit/e44780a7579ca865cc52801e920b1d20d2a3b438">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5869">5869</a> - xrefitem link to list incorrect when using SHORT_NAMES [<a href="https://github.com/doxygen/doxygen/commit/af5c5b37c5464afb6a2df71edf6f9e82ece75187">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5873">5873</a> - Tree view pane overlaps with content tabs [<a href="https://github.com/doxygen/doxygen/commit/8fc243491cbae2442c1e07faca99a8f6dc6f2e19">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5877">5877</a> - RTF output has incomplete "References" and "Referenced by" sections [<a href="https://github.com/doxygen/doxygen/commit/6184c70c515941212380006a2e6c879e1663daec">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5878">5878</a> - fatal: Cannot open 'graph_legend': No such file or directory [<a href="https://github.com/doxygen/doxygen/commit/08cf278fb80ffb7844b4339458cf4ad03453e827">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5879">5879</a> - Warning refers to incorrect line for undocumented member function (C++) [<a href="https://github.com/doxygen/doxygen/commit/a112c70c7a5d590286e0fad1382b9bb3fd86118b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5883">5883</a> - Race condition in parallel DOT runs [<a href="https://github.com/doxygen/doxygen/commit/f196c9f1d69238a814ff3152103f3bd310efdf0d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5885">5885</a> - Unable to prevent a numbered list [<a href="https://github.com/doxygen/doxygen/commit/3fbb1b66bd5303fa789a36317694bd77eb22ee19">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/5487f855ad12d0b7f3ba70aab72fd2debedae16d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5888">5888</a> - Inline markdown links don't support reference targets that contain ) [<a href="https://github.com/doxygen/doxygen/commit/59a42f974f15fa0154317900ffd9b82babd985ad">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5890">5890</a> - Failed to document nested classes with "reference to array" parameters [<a href="https://github.com/doxygen/doxygen/commit/3bcef269a4fe5bfc1921d7ba934bc09c715eae9c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5893">5893</a> - unclosed tag, c# generics method with where [<a href="https://github.com/doxygen/doxygen/commit/1bb819f5b680d600f010761b21e44df2f5e35ccc">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5894">5894</a> - Doxygen do not support comparison angle bracket in template [<a href="https://github.com/doxygen/doxygen/commit/f836266a4538153a1164642e168bb04c529a4d51">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5897">5897</a> - Brief description of non documented functions [<a href="https://github.com/doxygen/doxygen/commit/7a2164d252a0cb5410ab13b0ca1611a8e94e3c99">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/1b402f49a0638dd0eec2a123462862c6d4c4084d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5898">5898</a> - Bug in VHDL parser + other fixes [<a href="https://github.com/doxygen/doxygen/commit/4bef27771fec1892331df637dd6184abac36fd8f">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5900">5900</a> - C++ templated member-function appears both as public and private [<a href="https://github.com/doxygen/doxygen/commit/bb4e403968dc1ac4deb3b47c0b79b4304f1be288">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5904">5904</a> - Markdown fenced code blocks not parsed properly in comment [<a href="https://github.com/doxygen/doxygen/commit/ae6311ea0855d576a7c4b589dd5f4b994a47fd6c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5910">5910</a> - C++11 unified initializer for array with templates treated as function [<a href="https://github.com/doxygen/doxygen/commit/692544fb47407a3f2c5a5a5e4b80185428adda25">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5913">5913</a> - Doxygen parser confused by C++11 attributes [<a href="https://github.com/doxygen/doxygen/commit/6c005b1e9458430a77bfeba6d08deed4778ad71d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5916">5916</a> - unable to @ref or @link C++ templated operator overloads [<a href="https://github.com/doxygen/doxygen/commit/da09bff6dc9cad40c72b6a858728093cc41dff47">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5919">5919</a> - problems with charset using plantuml [<a href="https://github.com/doxygen/doxygen/commit/165498dc9ea33bc9991c5ab5234b5e51d74569d0">view</a>]</li> +<li>Actually using value of GROUP_NESTED_COMPOUNDS option [<a href="https://github.com/doxygen/doxygen/commit/3b314b5d856f6f7a25d512737e640a6b7b17c8d4">view</a>]</li> +<li>Add RPM build for Red Hat [<a href="https://github.com/doxygen/doxygen/commit/7f8f31cb8318e663f2ec145b63fb31278bdd7a76">view</a>]</li> +<li>Add WARN_AS_ERROR option to stop execution at first warning (equivalent of compilers' -Werror option) [<a href="https://github.com/doxygen/doxygen/commit/38277f1da56c212c9b33f774de412edef1156544">view</a>]</li> +<li>Add examples to LaTeX / PDF doxygen manual [<a href="https://github.com/doxygen/doxygen/commit/3a236fd01dc23d2d979e06d848f61b002cb4e6ee">view</a> and [<a href="https://github.com/doxygen/doxygen/commit/5e11f885eea694c2ecfeae6ff5774b66eea312e4">view</a>]</li> +<li>Add mathjax support to template & context. [<a href="https://github.com/doxygen/doxygen/commit/56987af3987f40ac77e70cd39ebbdac3702c1ce2">view</a>]</li> +<li>Add support for "value" attribute in FORTRAN scanner [<a href="https://github.com/doxygen/doxygen/commit/6dacbd9b22bdd6cd1a8c3e9b5ec8c2f7d15977b8">view</a>]</li> +<li>Added documentation for creating tables [<a href="https://github.com/doxygen/doxygen/commit/23faa449843eeb4c9e40e650df8844abec024bb7">view</a>]</li> +<li>Added javascript search engine data to the template context [<a href="https://github.com/doxygen/doxygen/commit/6bb0d2908b4ca7908a8e655a5abcf7615a5f4c77">view</a>]</li> +<li>Added missing html resources to the html template file [<a href="https://github.com/doxygen/doxygen/commit/43a0883022f64539498b84220d487b16ffd49a7e">view</a>]</li> +<li>Added missing information to template version of the all members list [<a href="https://github.com/doxygen/doxygen/commit/f16c156065ac8bc6242870c2ae701252b5d4f9b2">view</a>]</li> +<li>Added support for directory dependency graphs to template engine [<a href="https://github.com/doxygen/doxygen/commit/abe254fbe2235f5b913653acd076d2acd579d5e1">view</a>]</li> +<li>Adding compilation options for flex/lex and bison/yacc [<a href="https://github.com/doxygen/doxygen/commit/beb2ff6c39fefbd6aaeecd5de9827d1b1947740b">view</a>]</li> +<li>Adjusted used option for CLANG usage with CMake in documentation [<a href="https://github.com/doxygen/doxygen/commit/82063c0601b9f7b11c1774a1a42e13295c486467">view</a>]</li> +<li>Alignment in LaTeX parameter table [<a href="https://github.com/doxygen/doxygen/commit/a0880ff1c41a1c57bc92c1ccf99cf750064e2995">view</a>]</li> +<li>Avoid using Resource::data as string, as it is not null terminated. [<a href="https://github.com/doxygen/doxygen/commit/15a87a623791bf407b3076960cdd1133c8973357">view</a>]</li> +<li>Better handling of implicit statement in source code browser [<a href="https://github.com/doxygen/doxygen/commit/404468ac5484d54e47129ce2a00b3ad6e1c2c72a">view</a>]</li> +<li>Bug 149792 - Mainpage title has wrong style in RTF [<a href="https://github.com/doxygen/doxygen/commit/077aeb768767e62407abb4759d44671619bc62fd">view</a>]</li> +<li>Bump version so that the GIT repo represents the version for the "next" release [<a href="https://github.com/doxygen/doxygen/commit/42c376cdb41db392bd025611ccfcaddb49d05e92">view</a>]</li> +<li>Cmake tries to remove directory refman.tex instead of file refman.tex [<a href="https://github.com/doxygen/doxygen/commit/63094c8bb34a2e02e8490860660303d849e4a984">view</a>]</li> +<li>Copy user EXTRA_FILES at the end to overrule files generated by default by doxygen [<a href="https://github.com/doxygen/doxygen/commit/82f08138ad08fa5b8906c162283c4df0e9819d83">view</a>]</li> +<li>Correct / set types for python variables [<a href="https://github.com/doxygen/doxygen/commit/c47920b217491fc861cdac73d44ab4f93d08423e">view</a>]</li> +<li>Correcting print format error in config.l [<a href="https://github.com/doxygen/doxygen/commit/9947c11284542a74c56e52b55be032350c6bbc3e">view</a>]</li> +<li>DO NOT hardcode x86-64 architecture. [<a href="https://github.com/doxygen/doxygen/commit/031780293d2838da2643b46878061598ebb56822">view</a>]</li> +<li>Don't show a console when launching doxywizard on Windows. [<a href="https://github.com/doxygen/doxygen/commit/942efcb758977fe95fafc473813528085b56e4ee">view</a>]</li> +<li>Fix computeCommonDirPrefix sometimes not finding the correct prefix [<a href="https://github.com/doxygen/doxygen/commit/c6bf96520bcff56d3fd67d4277c05b8db9ac2128">view</a>]</li> +<li>Fix error documentation of in flex debug script [<a href="https://github.com/doxygen/doxygen/commit/09c4e990e4e214900e613343fb9bfbbb08f1bc53">view</a>]</li> +<li>Fix for broken link in the manual [<a href="https://github.com/doxygen/doxygen/commit/355370151b61f79633b3867634d76eaf8bacce54">view</a>]</li> +<li>Fix hexChar for inputs 0 <= i < 10 [<a href="https://github.com/doxygen/doxygen/commit/327422d131ed5e6ddf280043b5a56a6fb92d3bbc">view</a> and [<a href="https://github.com/doxygen/doxygen/commit/62da4521880a03b8a92887539eaf76ccad2ee770">view</a>]</li> +<li>Fix spelling in doc/commands.doc (descriptionm) [<a href="https://github.com/doxygen/doxygen/commit/bd7da008fac074202e3265787907434fbfb40e71">view</a>]</li> +<li>Fix typo in function name [<a href="https://github.com/doxygen/doxygen/commit/ace0af42e330a96ad691b2d9a08dd3ff4abb2629">view</a> and [<a href="https://github.com/doxygen/doxygen/commit/b890f40d195b9dc5db12aaa398707de138093c66">view</a>]</li> +<li>Fixed a couple of small memory leaks [<a href="https://github.com/doxygen/doxygen/commit/85ddfc814f33943199928447b4627d05b0920b99">view</a>]</li> +<li>Fixed a number of memory leaks in the template engine [<a href="https://github.com/doxygen/doxygen/commit/d14bcd1f8f5bd4a2034bae842000630f4e098eb6">view</a>]</li> +<li>Fixed compiler warning for MacOSX [<a href="https://github.com/doxygen/doxygen/commit/0aa27346b8728f6698dd2b363959e89d02e03ff6">view</a>]</li> +<li>Fixed link issue for MacOSX 10.11 [<a href="https://github.com/doxygen/doxygen/commit/0918a19225daedfbd5e23388124a5de3860d5420">view</a>]</li> +<li>Fixed minor typos in comments [<a href="https://github.com/doxygen/doxygen/commit/29c500434d30cd4d9c20f6b295475ed42dba2930">view</a>]</li> +<li>Fixed preprocessor macros for flex version check [<a href="https://github.com/doxygen/doxygen/commit/a8c73cdbe37cc53c398002d20e94037552a8fb55">view</a>]</li> +<li>Fixed problem with latex and PDF bookmarks [<a href="https://github.com/doxygen/doxygen/commit/499ecaedf1ee1222535be27f77050ee633595685">view</a>]</li> +<li>Fixed various issues found by PVS-Studio. [<a href="https://github.com/doxygen/doxygen/commit/48ced3ea8071b3141216482e2821e10250910947">view</a>]</li> +<li>Fixes bug 485701: Angle brackets (< and >) not escaped in HTML formula alt text [<a href="https://github.com/doxygen/doxygen/commit/08aa01cb0ee9b2dd6403f753156d8b58d8e62145">view</a>]</li> +<li>Fixes to support nested tables again [<a href="https://github.com/doxygen/doxygen/commit/883989fced827524354297009fde396ca6264a31">view</a>]</li> +<li>Fortran module private variables and EXTRACT_PRIVATE = NO [<a href="https://github.com/doxygen/doxygen/commit/61820a08200ec62c754cacf8dd3a1121ce6dee69">view</a> and <a href="https://github.com/doxygen/doxygen/commit/8504fc3a06e3430242eab9ac1c1f20319112e6a9">view</a>]</li> +<li>Improved handling of <caption> in tables for LaTeX output. [<a href="https://github.com/doxygen/doxygen/commit/fa6585b2fc6847c2b242b226b163810c7a6366de">view</a>]</li> +<li>IncludeInfo class had uninitialized member variable [<a href="https://github.com/doxygen/doxygen/commit/76a9892b190efaeb3c764d824bd285ff3d2c57dc">view</a>]</li> +<li>Made paragraph spacing more flexible in the LaTeX output to prevent page overflows [<a href="https://github.com/doxygen/doxygen/commit/17b3b41e12e890187f6b7dcc98ed9e2451b14018">view</a>]</li> +<li>Made several improvements to the performance of template engine [<a href="https://github.com/doxygen/doxygen/commit/ded4e9a92670d0157cdcc5cbf7a4a1e3193e179a">view</a>]</li> +<li>Make doxywizard compatible with Qt5 [<a href="https://github.com/doxygen/doxygen/commit/333c7c44f1aa3c62f9401b190e45eaff15056d5c">view</a>]</li> +<li>Make list of default extensions consistent with language mapping list [<a href="https://github.com/doxygen/doxygen/commit/bf35f16863f067286260ad4b68ec4c0ae7febdf1">view</a>]</li> +<li>Markdown with @cond and @endcond [<a href="https://github.com/doxygen/doxygen/commit/c5a7911741850777b699a63ae5b7702e379a5ada">view</a>]</li> +<li>Markdown with @cond and @endcond [<a href="https://github.com/doxygen/doxygen/commit/dc26830396970d402ad42d20f1b99bd86f4a5961">view</a>]</li> +<li>Merge remote-tracking branch 'upstream/master' [<a href="https://github.com/doxygen/doxygen/commit/6aba65a4dfaec1aa1131e160ed252d0713403760">view</a>]</li> +<li>Minor change to pycode.l:codifyLines [<a href="https://github.com/doxygen/doxygen/commit/bbd71be14986e637af9958b2cc18d1d62743ba8e">view</a>]</li> +<li>Moved creation of inline class documentation to separate template file [<a href="https://github.com/doxygen/doxygen/commit/4bd50c9f0dc1d7b1413a6bda587b8a5999cd7a19">view</a>]</li> +<li>RTF improvement: Example section was merged with next function title [<a href="https://github.com/doxygen/doxygen/commit/ca617e1e1cd42ee0080c8c13ce3884c8671629dd">view</a>]</li> +<li>Remove obsolete py files [<a href="https://github.com/doxygen/doxygen/commit/183f36fe97cb95636f1947c2c4be61f7b78f87e0">view</a>]</li> +<li>Removed BOM marker from greek translator to avoid Visual C warnings [<a href="https://github.com/doxygen/doxygen/commit/9ee8f777f5a4b7a49e644c2da5247fa509038feb">view</a>]</li> +<li>Repaired breaking @include for LaTeX output [<a href="https://github.com/doxygen/doxygen/commit/ab861c197c596f78c7aea4f45c0e1252de10fc1f">view</a>]</li> +<li>Revert "Spelling correction for error message with USE_HTAGS usage" [<a href="https://github.com/doxygen/doxygen/commit/a888543ca5f3fd28121f7eea4dbd25898fa7be57">view</a>]</li> +<li>Revert using container-based infra as sudo is needed :-( [<a href="https://github.com/doxygen/doxygen/commit/f089c3fa4f47dc8bedd25d9d857d004525ee82c0">view</a>]</li> +<li>Reverted change that caused doxygen to return error code 2 when it produced a warning [<a href="https://github.com/doxygen/doxygen/commit/f9e6fe0bf3886be7e603083b3b200dbd60fbd529">view</a>]</li> +<li>Rework the generation of packages DEB/RPM/... (CPack) [<a href="https://github.com/doxygen/doxygen/commit/8c0c80e44e1e9cb1ce4e88a3e1d01b65536dc60c">view</a>]</li> +<li>Right alignment of in page table of contents [<a href="https://github.com/doxygen/doxygen/commit/a653f7499929f3f0a5b68614dec91242fbc0edf5">view</a>]</li> +<li>Small correction of errors in case of CSharp XML tags [<a href="https://github.com/doxygen/doxygen/commit/68dd27139e50e048f081549394e6fc6dc04fc699">view</a>]</li> +<li>Small documentation corrections [<a href="https://github.com/doxygen/doxygen/commit/564c8cd257e0dd1797d94633a0e92ddc5a496540">view</a>]</li> +<li>Spelling correction for error message with USE_HTAGS usage [<a href="https://github.com/doxygen/doxygen/commit/0d060c455207ab32092e5a7edcd5457bb00f4653">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/5cc45244002d1d7560233cfae01f9d5d735e1a3f">view</a>]</li> +<li>Started with generating LaTeX output via the template engine [<a href="https://github.com/doxygen/doxygen/commit/02a0c353a8947290a3191aead59db08dc84766ce">view</a>]</li> +<li>Stop when doxygen configuration file ("Doxyfile") cannot be read [<a href="https://github.com/doxygen/doxygen/commit/b8bd3d84590d9adee7084f066f0e3e8c75a99245">view</a>]</li> +<li>Support flex-2.6.0 [<a href="https://github.com/doxygen/doxygen/commit/8c51120ad55b440b738ef0b96f8169d84a7ae88a">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/cf936efb8ae99dd297b6afb9c6a06beb81f5b0fb">view</a>]</li> +<li>Support set in code highlighting [<a href="https://github.com/doxygen/doxygen/commit/1cbcce4ef3460f48ab9c8e9435eec21075dcc788">view</a>]</li> +<li>Template enhancements and various other small fixes [<a href="https://github.com/doxygen/doxygen/commit/e58fb0a46f73f37d16859f43fda1eb5ba4a15c5d">view</a>]</li> +<li>Title in case of USE_MDFILE_AS_MAINPAGE [<a href="https://github.com/doxygen/doxygen/commit/09251b805b3c9d96917fedebb3768945d7559b1e">view</a>]</li> +<li>Tooltip can still contain < and > signs [<a href="https://github.com/doxygen/doxygen/commit/1df28fe4b9a0187f8fa6ed077e4a81002fa50fda">view</a>]</li> +<li>Tweaked the htmlonly sections in the manual so it produces valid HTML output [<a href="https://github.com/doxygen/doxygen/commit/de03970396e6f7edec359e2b71f3d2aa9d6a6237">view</a>]</li> +<li>Undo _doxygen to libdoxygen target change [<a href="https://github.com/doxygen/doxygen/commit/940048580f2d61a137e7abbb67b3aed567bfe865">view</a>]</li> +<li>Updated instructions to toggle debugging flex code [<a href="https://github.com/doxygen/doxygen/commit/368f4f057be0ded4673be826c9a08cd771a023ce">view</a>]</li> +<li>Updated Italian translation and translator email address [<a href="https://github.com/doxygen/doxygen/commit/a9ad21b4e541d91c804ac39e393cc0c1db4f45f3">view</a>]</li> +<li>Updated the Greek translation [<a href="https://github.com/doxygen/doxygen/commit/4e0b7f0b9a2a04d0bb5e66871da6d7ffa786836e">view</a>]</li> +<li>Use CPack to generate rpm/deb packages [<a href="https://github.com/doxygen/doxygen/commit/ba6eb1478d24dc32d4e123951e2f62c75b4b88bd">view</a>]</li> +<li>Use STATIC libraries to prevent them being shared [<a href="https://github.com/doxygen/doxygen/commit/37a148f6e35523fd2bbbdbc37e6ed838684c6d90">view</a>]</li> +<li>Using tabu package for LaTeX tables [<a href="https://github.com/doxygen/doxygen/commit/647b6ac8669cd8ba1e8c60eeb3c2de961c7d6a1b">view</a>]</li> +<li>[Bug <a href="https://github.com/doxygen/doxygen/issues/5872">5872</a>] On Windows, generated layout is with UNIX EOL [<a href="https://github.com/doxygen/doxygen/commit/78a80001223af290c7c7321ad2d210fb3cd16f11">view</a>]</li> +<li>[Doxygen-users] plugin / filter not behaving as expected [<a href="https://github.com/doxygen/doxygen/commit/0c7f182016c7c2604a484367738e76cb40c0541b">view</a>]</li> +<li>add spaces like "Doyxgen"CN_SPC->"Doyxgen" CN_SPC [<a href="https://github.com/doxygen/doxygen/commit/35d1aa8bf9208302601fa96462e246c98aa0b0e5">view</a>]</li> +<li>allow building with custom iconv on Windows [<a href="https://github.com/doxygen/doxygen/commit/3d684f6d123abdbf630bb19bc6095cc9d69efb68">view</a>]</li> +<li>doc: generate doxygen's documentation. [<a href="https://github.com/doxygen/doxygen/commit/3c4a1ea2ee56f2604c2277f13737d53b3a0b0353">view</a>]</li> +<li>doc: put man pages under share/man/man1 [<a href="https://github.com/doxygen/doxygen/commit/95d28153779810dc95afafa38ed838f32516a1f4">view</a>]</li> +<li>docparser: warn when finding a documented empty return type [<a href="https://github.com/doxygen/doxygen/commit/10989e2dade3bb35a421787c5315d2630d665842">view</a>]</li> +<li>docs: add examples as a dependency of docs [<a href="https://github.com/doxygen/doxygen/commit/ec5fde6913935fbe2015220259b611a17a437de3">view</a>]</li> +<li>doxyapp and CLANG linking [<a href="https://github.com/doxygen/doxygen/commit/a58a2cafbc136f7821b9313bd6c1413eaab3e868">view</a>]</li> +<li>fixed for travis ci config file [<a href="https://github.com/doxygen/doxygen/commit/ecbb77b40892df8740476023545769ffbda6fd6f">view</a>]</li> +<li>libpng warning: iCCP: known incorrect sRGB profile [<a href="https://github.com/doxygen/doxygen/commit/c82ac124812dd2f9a5e8b36fcdcf7daf20cfbdda">view</a>]</li> +<li>rename build target _doxygen to libdoxygen [<a href="https://github.com/doxygen/doxygen/commit/4116648d3c62aee54c385644a4fe754ee7a4261d">view</a>]</li> +<li>run_translator.cmake is no longer used [<a href="https://github.com/doxygen/doxygen/commit/45e153f2238d0fa031d147cfe207e52b913845eb">view</a>]</li> +<li>runtests: Simplify dictionary usage [<a href="https://github.com/doxygen/doxygen/commit/95d99a4c857d7d5208d8faf974b01354a798eba4">view</a>]</li> </ul> <p> \endhtmlonly @@ -516,150 +917,150 @@ <a name="1.8.10"></a> </p> <ul> -<li>change the build system to use cmake [<a href="http://github.com/doxygen/doxygen/commit/2e099b1950eee2c3a0d5d8ae4b25575caeb938b1">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/ba9bb02abf6f6922a83beb2092e7bc270e6f25c1">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/635d8cf30e702bdf83fe5c96452f8f863d57bdee">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/51ee91560a9cbaac41cec536dcdeb3e4c32f139a">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/e775357ae71ecbf02dc93913a923567f31b03681">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/a0cd6a8e0c19a82e9662f96734c7ba21726794d0">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/0dc4eda500e803a65a10445719c97d7e523897da">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/22c0d75d45354979392db5db4e3195570c394e44">view</a>]</li> -<li>Add support for basic XML syntax highlighting. [<a href="http://github.com/doxygen/doxygen/commit/a418518921ba7a99c7221ba7f40d2e791cb207c4">view</a>]</li> -<li>Added documentation for ``` style fenced code block and more robust parsing [<a href="http://github.com/doxygen/doxygen/commit/39ba42c3b21d08ec606eee18ee8b64c67ec6a42a">view</a>]</li> -<li>Added function arguments to the LaTeX toc [<a href="http://github.com/doxygen/doxygen/commit/f5e70723391bacc2d68c19d367ab414e70f786b4">view</a>]</li> -<li>Added missing files and build instructions [<a href="http://github.com/doxygen/doxygen/commit/39228176c052fd293382dc9bc9b4b69b2a6af277">view</a>]</li> -<li>Added missing libraries for building doxysearch on Windows [<a href="http://github.com/doxygen/doxygen/commit/84d94779e76681b63cdcbc362bbe0341cd39064d">view</a>]</li> -<li>Added support for language codes [<a href="http://github.com/doxygen/doxygen/commit/eae07d978b524c787daeab911ca087b47a964577">view</a>]</li> -<li>Added type constraint relations for Java generics to dot graphs and XML output [<a href="http://github.com/doxygen/doxygen/commit/080a465b1321ff93c05ce398cd18a577e0ebae4b">view</a>]</li> -<li>Adding commands \hidecallgraph and \hidecallergraph [<a href="http://github.com/doxygen/doxygen/commit/073e9482a516c24a3d045da049941bfd432f3354">view</a>]</li> -<li>Adjust test script for longer version number [<a href="http://github.com/doxygen/doxygen/commit/c7622971ee485279e8da7634207340ce18b69aaa">view</a>]</li> -<li>Adjusted version in configure script [<a href="http://github.com/doxygen/doxygen/commit/cbd3fa183815191ac5f172a2bac62991642c0b5e">view</a>]</li> -<li>Alignment of project name [<a href="http://github.com/doxygen/doxygen/commit/e7b356d2cb9320a363ac024d39b468e98b223b90">view</a>]</li> -<li>Allow selection of specific translators to compile in at build time [<a href="http://github.com/doxygen/doxygen/commit/faef77a87cecd703e3629a35d2e22efb07e682a0">view</a>]</li> -<li>Based on the report of Peter D. Barnes in the doxygen forum (http://doxygen.10944.n7.nabble.com/doxygen-1-8-9-1-upgrade-errors-td6990.html) [<a href="http://github.com/doxygen/doxygen/commit/9771b807cd776b37f6538dec085442218a5b6a09">view</a>]</li> -<li>Better error message in case of IDL inconsistency [<a href="http://github.com/doxygen/doxygen/commit/a7eef85a89d8772b7ab97a4ba378cc7e78c988cc">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=659590">659590</a> - EXTRA_PACKAGES can't handle package options [<a href="http://github.com/doxygen/doxygen/commit/1c47dd436358ffc7bc76901cddc559b2d8ce233d">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/ad53cbab6474e11692f2ca1018a821d042df28e6">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739680">739680</a> - Using HTML entities in PROJECT_NAME [<a href="http://github.com/doxygen/doxygen/commit/8e44571521391403e8d85f893acb926e021e926b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742095">742095</a> - Missing documentation after nested C++11 unified initializer [<a href="http://github.com/doxygen/doxygen/commit/c1789f2e5d8421d6028c836ab66afecacff284ef">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742151">742151</a> - Bogus warning: citelist: Unexpected new line character [<a href="http://github.com/doxygen/doxygen/commit/5c321cbb6359bc1bb875729c08beba2edc084500">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742230">742230</a> - @todo paragraphs incorrectly placed in rtf output [<a href="http://github.com/doxygen/doxygen/commit/600d5859d7bcb94b08ef656fd427914766ae9afe">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742235">742235</a> - Bogus message with addtogroup [<a href="http://github.com/doxygen/doxygen/commit/b75af9180ae53f7c7abb94ccf906333169247785">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742408">742408</a> - Configuring doxyfile to only output docbook produces erroneous warning [<a href="http://github.com/doxygen/doxygen/commit/05fcf8decc25bd2f1a2e7867ee8e5d9da1f08933">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742427">742427</a> - latex compilation: \backmatter incompatible with COMPACT_LATEX=YES [<a href="http://github.com/doxygen/doxygen/commit/c9067c5bb9a1868e0963dc210cf3b7152c4aa79a">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742445">742445</a> - Wrong icons in TOC of CHM help [<a href="http://github.com/doxygen/doxygen/commit/8c97e0cd63bcf942ee5b43c9471055a4ea27551c">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742899">742899</a> - <CAPTION> inside <TABLE> no longer works for LaTex output [<a href="http://github.com/doxygen/doxygen/commit/0599f92d06ff433446f34136ffe2f3d65d6bd109">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=743604">743604</a> - Duplicate anchors from tagfiles [<a href="http://github.com/doxygen/doxygen/commit/1f21c23c57c91ba6901c0de38bb236f7246e88c9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=743605">743605</a> - Tagfile anchors not generated for enumeration values [<a href="http://github.com/doxygen/doxygen/commit/1d4f37cb13a75ca8bdc49be3558438104e7eef19">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=743675">743675</a> - Non-ascii characters are not emphasised [<a href="http://github.com/doxygen/doxygen/commit/8f67d4f63efd45b0d38502bdf68987d7fc1e92e9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=744762">744762</a> - Using TAGFILES prevents symbol extraction [<a href="http://github.com/doxygen/doxygen/commit/a735498be5a572236755cc3da65bf4774cbac25c">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=745439">745439</a> - PATCH: please consider making doxygen output byte for byte identical between individual runs by default [<a href="http://github.com/doxygen/doxygen/commit/3f2e8a3067712b025623e4420e6eb161febfd42b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=745481">745481</a> - Doxygen generates bad "More..." file links for functions within a namespace [<a href="http://github.com/doxygen/doxygen/commit/ea202be55d68af33917658e3fec169da3a7fa7a8">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=745870">745870</a> - [PATCH] QT4's qmake is titled differently on Fedora 21 [<a href="http://github.com/doxygen/doxygen/commit/3bd3ad9f8f4d010e42f0ba8eeab229f44b1ecb1c">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/a883f65ab94973d4c7948623186159f978517851">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746226">746226</a> - last enum member not documented [<a href="http://github.com/doxygen/doxygen/commit/50a329c056a2676608f30321a3207ff17ab20abb">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746417">746417</a> - Nested list in C# XML comments closes outer list prematurely [<a href="http://github.com/doxygen/doxygen/commit/2c679e7d39144dadef2e9fd25772f0e41586e18b">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/7a0522fafde300f36c3d5264f46c1f70cf35b7b9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746614">746614</a> - Bogus warning regarding nested comments [<a href="http://github.com/doxygen/doxygen/commit/e4c0036962d8fa0ea9c1e38dbdb5e91168201f22">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746619">746619</a> - Bogus warnings in case of anonymous namespace and @todo [<a href="http://github.com/doxygen/doxygen/commit/298ab30b2a2aa0936f4683c9366afd44c00adc60">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746734">746734</a> - Don't warn about missing documentation for deleted functions. [<a href="http://github.com/doxygen/doxygen/commit/796d6585be58d1c9112422a919f49d1998dc672c">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/ac576bd974ac27bc1f395e8ae6c77b19f800b6db">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=747111">747111</a> - Table of content incorrect with escaped symbols [<a href="http://github.com/doxygen/doxygen/commit/5cdf62661c88b5f0c135337da4d6e58581aad037">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=747780">747780</a> - man output should escape minus signs [<a href="http://github.com/doxygen/doxygen/commit/3608a668b3892eaa4f7b2e4b29b833ede24ceee7">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=748208">748208</a> - Bug #313527 regression - Enum in bitfield is not parsed properly. [<a href="http://github.com/doxygen/doxygen/commit/528bb8054ca362843630ec261ca6e6990a206081">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/7b2d77abb73288bdd48ca04720fd6779e0bf94c2">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=750016">750016</a> - FILE_PATTERNS ignores arbitrary extensions [<a href="http://github.com/doxygen/doxygen/commit/52cb086da66533332962f2bf9cb35772e980c092">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751455">751455</a> - class scoped enum documentation appearing at group level instead of class level [<a href="http://github.com/doxygen/doxygen/commit/e4a9d06d7871f24dd6e37ecac6addae729e6d721">view</a>]</li> -<li>Build fixes for windows build [<a href="http://github.com/doxygen/doxygen/commit/5446770855a8286092abdd91d9069cb3191c209d">view</a>]</li> -<li>Bump copyright year [<a href="http://github.com/doxygen/doxygen/commit/e11b48785323017bf1d81e91e8133d7f3ba1f243">view</a>]</li> -<li>Bump version in configure script [<a href="http://github.com/doxygen/doxygen/commit/97342f92e111d7aa3e423a128379a6018820ce6c">view</a>]</li> -<li>Cleanup & adapt travis config [<a href="http://github.com/doxygen/doxygen/commit/5f67c67323bff27751ba07c417ba99180fa0d762">view</a>]</li> -<li>Consistency in handling HTML and LaTeX in respect to header and footer [<a href="http://github.com/doxygen/doxygen/commit/be5cc75ffc2e0a95ecbf0ce8d918b070c276d3e5">view</a>]</li> -<li>Correct string buffer sizes for RTF output, such that the string is always correctly sized. [<a href="http://github.com/doxygen/doxygen/commit/bc8e705cf90cecdff8a247264c249ffed1d2af4a">view</a>]</li> -<li>Crash in case of non generic interface in Fortran [<a href="http://github.com/doxygen/doxygen/commit/7d3a2abf0137c5257eeb0a8e0f76381b79f1e7bb">view</a>]</li> -<li>Documentation HTML Header, Footer, and Stylesheet changes [<a href="http://github.com/doxygen/doxygen/commit/1dded5c92a13f9db60fc630cbe5f2cc5ad9bede0">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/478207365d7f09f0e676a76f654502c084806e4e">view</a>]</li> -<li>Documenting RESULT variable of Fortran FUNCTION [<a href="http://github.com/doxygen/doxygen/commit/21f9e87db8085fb1b5e0a9a9a25dee159b3fd324">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/4d52beec3760244d959ab4d5528aea1acba505e7">view</a>]</li> -<li>Doxygen LaTeX / PDF links point to page 1 [<a href="http://github.com/doxygen/doxygen/commit/e34913dcbe0bee2c3e21d6e21b2bcc6970003a5c">view</a>]</li> -<li>Enable relative paths referenced source files [<a href="http://github.com/doxygen/doxygen/commit/ed178335e8c123b58c4fee24766bceae0fc80aa2">view</a>]</li> -<li>Escape "@" in names as it is not allowed in XML / Docbook names (coming from anon namespaces) [<a href="http://github.com/doxygen/doxygen/commit/65c35c435ae93d5f39c3ddec93008b2f544544ca">view</a>]</li> -<li>Fix for bug 746673. [<a href="http://github.com/doxygen/doxygen/commit/effbbcc72295f5843377ddce2794bcf6e7000322">view</a>]</li> -<li>Fix for building diagram example conditionally [<a href="http://github.com/doxygen/doxygen/commit/f415b624a6cf6b9e577ec6131a23cb4a0e830aaf">view</a>]</li> -<li>Fix for issue 744670 [<a href="http://github.com/doxygen/doxygen/commit/0d684381ac40574f6a948c56eb2da0445c3ee3bf">view</a>]</li> -<li>Fix for issue 744671 [<a href="http://github.com/doxygen/doxygen/commit/192f9e8bf78e10c9d97e08264b1c76c8aa4edf2b">view</a>]</li> -<li>Fix for rendering the template parameters of members of variadic template classes. [<a href="http://github.com/doxygen/doxygen/commit/32093bcca82c7d3a4df4670f52340033e9f16b62">view</a>]</li> -<li>Fix missing brief documentation for overload and specialization functions [<a href="http://github.com/doxygen/doxygen/commit/c604aef8a6465f38f8f04276194a66a4e044dc84">view</a>]</li> -<li>Fix nesting of XML tag "literallayout" for docbook output of enums. [<a href="http://github.com/doxygen/doxygen/commit/3abac31c525e6cf6898a1e8deb5c73f2a2ff5a8a">view</a>]</li> -<li>Fix parsing of ODL-style properties [<a href="http://github.com/doxygen/doxygen/commit/6a8bef8852eb22558b3559ebe96d9e06e6cadfa7">view</a>]</li> -<li>Fix potential null pointer dereference in src/classdef.cpp [<a href="http://github.com/doxygen/doxygen/commit/5743848928ffaeccaaef24dac051aaa9acf2c4b7">view</a>]</li> -<li>Fix potential null pointer dereference in src/context.cpp [<a href="http://github.com/doxygen/doxygen/commit/2690774f87b9fcb12b35153de82cde22248b3949">view</a>]</li> -<li>Fixed a couple of cases where sharing string data could lead to corruption [<a href="http://github.com/doxygen/doxygen/commit/312bef563a5be72f6423377247db1b80044bf711">view</a>]</li> -<li>Fixed code reachability bug found by coverity in translator_fi.h [<a href="http://github.com/doxygen/doxygen/commit/80d09775da9a99a3bc58704ffd055547c6b03043">view</a>]</li> -<li>Fixed compilation issue on Windows [<a href="http://github.com/doxygen/doxygen/commit/d75455eef7c91f11c2b9061d9a086ce93c4231b2">view</a>]</li> -<li>Fixed issue accessing uninitialized buffer under certain conditions. [<a href="http://github.com/doxygen/doxygen/commit/49f6c63aba4d77cd14fa205bee4bf427cefdaa44">view</a>]</li> -<li>Fixed potential crash while generating dot graphs [<a href="http://github.com/doxygen/doxygen/commit/50f82c94b9bf1ff982f9ddd8b9a88fb91d9e0bec">view</a>]</li> -<li>Fixed potential string buffer issue for dot graphs [<a href="http://github.com/doxygen/doxygen/commit/6b24aba8fce772d9e46e3174a655281eeb44ad84">view</a>]</li> -<li>Fixed regression due to buffer resizing while generating RTF. [<a href="http://github.com/doxygen/doxygen/commit/a1f2872ef098cfcc526002b9c9d533da6f2775b5">view</a>]</li> -<li>Fixed regression in argument processing [<a href="http://github.com/doxygen/doxygen/commit/ae8f618d140b4368045d286a682df3f6de7b2960">view</a>]</li> -<li>Fixed type in printdocvisitor.h [<a href="http://github.com/doxygen/doxygen/commit/c9465bd210d8250a5439f22bf564c187cd45e968">view</a>]</li> -<li>Fixed typos in comments. [<a href="http://github.com/doxygen/doxygen/commit/b82320a6f57519443c46e5e3044fef97b1f8f618">view</a>]</li> -<li>Fixes for showing type constraint relations [<a href="http://github.com/doxygen/doxygen/commit/95375152974fa7e0e4d4cec7007d942dd5e9615e">view</a>]</li> -<li>Fortran FUNCTION source code [<a href="http://github.com/doxygen/doxygen/commit/25a90990662449808c5ba58c243a7835d13ba750">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/e7a6a682137a82dbdf847b1879f320ece4f3642f">view</a>]</li> -<li>Fortran: code color GOTO as flow keyword. [<a href="http://github.com/doxygen/doxygen/commit/8090675790ad9265bcffdf07ab4d48fc8c037276">view</a>]</li> -<li>Fortran: fixed format position 73 and further is comment [<a href="http://github.com/doxygen/doxygen/commit/557ad21ce28d093044101eb8bee2c4df1621da7a">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/eb92c064b33bf9f303233210b9693215b0fb7f9d">view</a>]</li> -<li>Fortran: warning message about not documented module member [<a href="http://github.com/doxygen/doxygen/commit/dcdd35ce2a0cda024525298a9a20d6c746539e6d">view</a>]</li> -<li>Guarded debug prints against printing a NULL pointer. [<a href="http://github.com/doxygen/doxygen/commit/0831c71c05c9204839e187759f13303e64783730">view</a>]</li> -<li>HTML entity &deg; gives problems in LaTeX [<a href="http://github.com/doxygen/doxygen/commit/072383ed1c6fcfff7a7619d92ce3a8cb0b91fff9">view</a>]</li> -<li>Help message regarding layout file [<a href="http://github.com/doxygen/doxygen/commit/7569f42d95332a5948e9d35e94e88d56d11634a9">view</a>],[<a href="http://github.com/doxygen/doxygen/commit/ad0e5fe14dce093e3b00ca677849cacbc2d657b7">view</a>]</li> -<li>Internal debug option -d lex is not described [<a href="http://github.com/doxygen/doxygen/commit/00a91ae9fabe7783260c7c3fcdfec5b1ead49350">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/ebe3e8ec4a09edbb8a5b2dde88b6c479b03c0be9">view</a>]</li> -<li>Internal doxygen docs gives: warning: Unsupported xml/html tag <...> found [<a href="http://github.com/doxygen/doxygen/commit/e366acaf0c27ce43ec80a70c0667c27cd5ef9d29">view</a>]</li> -<li>Missing cross reference link [<a href="http://github.com/doxygen/doxygen/commit/213e680537303959f29b2424d40d74ecf66cb3f6">view</a>]</li> -<li>Patch fixing a typo in Pull Request 307 [<a href="http://github.com/doxygen/doxygen/commit/6913c67ff1f9f20a71333f78cacd87a9e0c7756f">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/eac0fd660bffe62ae29a190308bf21b21d49647b">view</a>]</li> -<li>Prevent example.tag from being regenerated [<a href="http://github.com/doxygen/doxygen/commit/d49604f814ceb22f81571d8ca99540e62cfa979a">view</a>]</li> -<li>Problem running tests under Windows [<a href="http://github.com/doxygen/doxygen/commit/9bd54df7ba7dd15783f5a9180c85a7137dcdbc08">view</a>]</li> -<li>Remove the new line after @startuml in generated pu file [<a href="http://github.com/doxygen/doxygen/commit/edf8dbbbc17e65e2eb97b5c9b4763a04969017fe">view</a>]</li> -<li>Remove unreachable code [<a href="http://github.com/doxygen/doxygen/commit/d3e7b06f3a82780083e27bb83360ed9496df9f8d">view</a>]</li> -<li>Remove unused local and static global variables [<a href="http://github.com/doxygen/doxygen/commit/d03e4c2ae1864c6f27a4341449ce97133aeb6847">view</a>]</li> -<li>Remove wrong </File> [<a href="http://github.com/doxygen/doxygen/commit/e8cef724a1f40896f9c6294d6f410e240b6365ee">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/efd55ae1787f8f7ec35761849dc7cfd3175f8b33">view</a>]</li> -<li>Removed OS version check for MACOSX (was not used anywhere) [<a href="http://github.com/doxygen/doxygen/commit/1e3e9f03e746d4ac46c9c7b1b80e7e3100ee42f0">view</a>]</li> -<li>Removed dbus XML parser, various refinements [<a href="http://github.com/doxygen/doxygen/commit/551012f2647c53d8532d638361011d003d5b81f3">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/bf4aee305879406d9057864ab7f8938e01ca8bd0">view</a>]</li> -<li>Removed old build files, added install targets and other options [<a href="http://github.com/doxygen/doxygen/commit/7bcf8e9a379ec0599160e5562f07b93f8fb9557a">view</a>]</li> -<li>Repair doxygen generate invalid styleSheetFile and extensionsFile of RTF [<a href="http://github.com/doxygen/doxygen/commit/0d208bc1c9a32718a93eb9911220ba72ad27fb9a">view</a>]</li> -<li>Replace to_c_cmd by resource compiler [<a href="http://github.com/doxygen/doxygen/commit/2e39e5c7c1427ac6b24c64b7ef01be8d5a20092b">view</a>]</li> -<li>Restore deleted file [<a href="http://github.com/doxygen/doxygen/commit/dfe93f9fde39167eae2aeeab929641a9c56cc916">view</a>]</li> -<li>Showing grey/gray in documentation [<a href="http://github.com/doxygen/doxygen/commit/320ebb35dd4a615a7a692d71de4587be9ce8b99b">view</a>]</li> -<li>Suggestion to use stripPrefix has been implemented for RESULT. For consistency also implemented for arguments. [<a href="http://github.com/doxygen/doxygen/commit/610bdb67c4db775debf26d85091383938d946f3d">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/6720a714461b9454c7cdbae7ceff7eb735feeb3b">view</a>]</li> -<li>Support diff that returns "No differences encountered" when comparing test results [<a href="http://github.com/doxygen/doxygen/commit/4716f426332d02eb6841c509658b8a709cce9318">view</a>]</li> -<li>Support generating index-color PNG files [<a href="http://github.com/doxygen/doxygen/commit/a09ffed2f603699955c18c19e0d3e782fb61d93f">view</a>]</li> -<li>Switched back to version 6.2 of JavaCC for VHDL parser generation. [<a href="http://github.com/doxygen/doxygen/commit/088896f27f460b6ac03c2d64df148e3617c1e519">view</a>]</li> -<li>Tcl: fix for extra line breaks in source browser introduced by commit 312bef5 [<a href="http://github.com/doxygen/doxygen/commit/3cc116ba2250e6946773ec22c6c7c6557773d28e">view</a>]</li> -<li>TranslatorSwedish updated [<a href="http://github.com/doxygen/doxygen/commit/eaa19e3a439a4652023b47b0cf47c7303484ef5d">view</a>]</li> -<li>Update of search from "endless search to 'Character search: criterion. [<a href="http://github.com/doxygen/doxygen/commit/a0820f29e60be1555b5b0c92a975bf334b6f5258">view</a>]</li> -<li>Update translator_cn.h [<a href="http://github.com/doxygen/doxygen/commit/a88d3549373990bfac09f936748577fc5c59d240">view</a>]</li> -<li>Updated changelog for 1.8.9.1 [<a href="http://github.com/doxygen/doxygen/commit/f8671a4520350fe38f986fdd199c2344452e7a01">view</a>]</li> -<li>Updated installation section of the manual [<a href="http://github.com/doxygen/doxygen/commit/db6a3ab2761a328e74fdccf243ff148af7623062">view</a>]</li> -<li>Various VHDL related fixes [<a href="http://github.com/doxygen/doxygen/commit/34b00c442308efe169cc89fad62588fdce1d84e8">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/3eed7a5c5b330736b508c722c9614c774a678ef1">view</a>], -[<a href="http://github.com/doxygen/doxygen/commit/530647f76a7660a406d102269dc041b00b0e3d4e">view</a>]</li> -<li>Various minor changes [<a href="http://github.com/doxygen/doxygen/commit/f63d9ed958d2c06717434e1a90e6417cf2d60f6b">view</a>]</li> -<li>Warning message multiple mainpages [<a href="http://github.com/doxygen/doxygen/commit/17fdd71a0f7a02e8b72eaf86d67bc142210a7059">view</a>]</li> -<li>Warnings without filename [<a href="http://github.com/doxygen/doxygen/commit/da3faf6b93fd3eb4e751d2c0cbd4ed9ceae7922b">view</a>]</li> -<li>add support for github flavored fenced code blocks [<a href="http://github.com/doxygen/doxygen/commit/288ea42fc27389160c20912003a7972e21195265">view</a>]</li> -<li>added HHC.exe own output to the debug output when extcmd flag enabled [<a href="http://github.com/doxygen/doxygen/commit/4438e24b478de1fd97ccc81a3a9f7651124e1c63">view</a>]</li> -<li>doc/translator.py -- minor updates [<a href="http://github.com/doxygen/doxygen/commit/1ccc93fd699b34b7a89acecf9e59a526a5972bb8">view</a>]</li> -<li>drop #include <unistd.h> [<a href="http://github.com/doxygen/doxygen/commit/1dd0cf03f5bf173fa4ac3bb8279d12fff1b98eb7">view</a>]</li> -<li>fix *.l for three backticks [<a href="http://github.com/doxygen/doxygen/commit/bb93db0d60fd4cd123dfc886ecd20167068db6ba">view</a>]</li> -<li>fix enum brief description in RTF output [<a href="http://github.com/doxygen/doxygen/commit/87429a2609b822d2b08ec17fb2a20464a5043c9e">view</a>]</li> -<li>fix for CHM TOC "Classes" entry to point to annotated file [<a href="http://github.com/doxygen/doxygen/commit/700a9ac3c177fdef25b9b00ed6bb5e0ea963d236">view</a>]</li> -<li>fix for src/translator_tw.h by Gary Lee (translation cleaned) [<a href="http://github.com/doxygen/doxygen/commit/d101790db5e64a64f4db0e46391bbb1b0dadc8b1">view</a>]</li> -<li>increase the size of l when result is modified [<a href="http://github.com/doxygen/doxygen/commit/dd0d738683029f80a42b6673e0b1b1228bebfce3">view</a>]</li> -<li>move layout_default.xml to templates/html/ [<a href="http://github.com/doxygen/doxygen/commit/45ebb6ff4846255ad7209e3bec7cd4fe0544ffd5">view</a>]</li> -<li>runtests.pl: mmn version has dash as separator [<a href="http://github.com/doxygen/doxygen/commit/f5efa2f383fe89b53bd8fc27b2116e8636417ebf">view</a>]</li> -<li>specify that doxygen searches files in INPUT tag [<a href="http://github.com/doxygen/doxygen/commit/0971dc7771be1b386a204c3d11515f7d0f5af427">view</a>]</li> -<li>sqlite3: add regexp searches to search.py [<a href="http://github.com/doxygen/doxygen/commit/13dd6d635e7ba2beb26a0d2ee8542ac63d1c7973">view</a>]</li> -<li>sqlite3: add schema comments [<a href="http://github.com/doxygen/doxygen/commit/ef5d48d93f5565ebca9aae4ba9d6633c32719ecc">view</a>]</li> -<li>sqlite3: fix constness [<a href="http://github.com/doxygen/doxygen/commit/90d89d8a2a2be931742c7291cd70e4a980035ae1">view</a>]</li> -<li>version.py pass configure file path as parameter [<a href="http://github.com/doxygen/doxygen/commit/75e8f4c80ab5c06a33eaaf7ec587ee35ed9c1b1a">view</a>]</li> -<li>xml: use STRIP_FROM_PATH on @file attributes. [<a href="http://github.com/doxygen/doxygen/commit/29ae707794042a97412eaa137fa7b30f2367294d">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/5a0379944f8bdf883fdb25e94e0cdb1e5d2f4366">view</a>]</li> +<li>change the build system to use cmake [<a href="https://github.com/doxygen/doxygen/commit/2e099b1950eee2c3a0d5d8ae4b25575caeb938b1">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/ba9bb02abf6f6922a83beb2092e7bc270e6f25c1">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/635d8cf30e702bdf83fe5c96452f8f863d57bdee">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/51ee91560a9cbaac41cec536dcdeb3e4c32f139a">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/e775357ae71ecbf02dc93913a923567f31b03681">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/a0cd6a8e0c19a82e9662f96734c7ba21726794d0">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/0dc4eda500e803a65a10445719c97d7e523897da">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/22c0d75d45354979392db5db4e3195570c394e44">view</a>]</li> +<li>Add support for basic XML syntax highlighting. [<a href="https://github.com/doxygen/doxygen/commit/a418518921ba7a99c7221ba7f40d2e791cb207c4">view</a>]</li> +<li>Added documentation for ``` style fenced code block and more robust parsing [<a href="https://github.com/doxygen/doxygen/commit/39ba42c3b21d08ec606eee18ee8b64c67ec6a42a">view</a>]</li> +<li>Added function arguments to the LaTeX toc [<a href="https://github.com/doxygen/doxygen/commit/f5e70723391bacc2d68c19d367ab414e70f786b4">view</a>]</li> +<li>Added missing files and build instructions [<a href="https://github.com/doxygen/doxygen/commit/39228176c052fd293382dc9bc9b4b69b2a6af277">view</a>]</li> +<li>Added missing libraries for building doxysearch on Windows [<a href="https://github.com/doxygen/doxygen/commit/84d94779e76681b63cdcbc362bbe0341cd39064d">view</a>]</li> +<li>Added support for language codes [<a href="https://github.com/doxygen/doxygen/commit/eae07d978b524c787daeab911ca087b47a964577">view</a>]</li> +<li>Added type constraint relations for Java generics to dot graphs and XML output [<a href="https://github.com/doxygen/doxygen/commit/080a465b1321ff93c05ce398cd18a577e0ebae4b">view</a>]</li> +<li>Adding commands \hidecallgraph and \hidecallergraph [<a href="https://github.com/doxygen/doxygen/commit/073e9482a516c24a3d045da049941bfd432f3354">view</a>]</li> +<li>Adjust test script for longer version number [<a href="https://github.com/doxygen/doxygen/commit/c7622971ee485279e8da7634207340ce18b69aaa">view</a>]</li> +<li>Adjusted version in configure script [<a href="https://github.com/doxygen/doxygen/commit/cbd3fa183815191ac5f172a2bac62991642c0b5e">view</a>]</li> +<li>Alignment of project name [<a href="https://github.com/doxygen/doxygen/commit/e7b356d2cb9320a363ac024d39b468e98b223b90">view</a>]</li> +<li>Allow selection of specific translators to compile in at build time [<a href="https://github.com/doxygen/doxygen/commit/faef77a87cecd703e3629a35d2e22efb07e682a0">view</a>]</li> +<li>Based on the report of Peter D. Barnes in the doxygen forum (http://doxygen.10944.n7.nabble.com/doxygen-1-8-9-1-upgrade-errors-td6990.html) [<a href="https://github.com/doxygen/doxygen/commit/9771b807cd776b37f6538dec085442218a5b6a09">view</a>]</li> +<li>Better error message in case of IDL inconsistency [<a href="https://github.com/doxygen/doxygen/commit/a7eef85a89d8772b7ab97a4ba378cc7e78c988cc">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4415">4415</a> - EXTRA_PACKAGES can't handle package options [<a href="https://github.com/doxygen/doxygen/commit/1c47dd436358ffc7bc76901cddc559b2d8ce233d">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/ad53cbab6474e11692f2ca1018a821d042df28e6">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5673">5673</a> - Using HTML entities in PROJECT_NAME [<a href="https://github.com/doxygen/doxygen/commit/8e44571521391403e8d85f893acb926e021e926b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5697">5697</a> - Missing documentation after nested C++11 unified initializer [<a href="https://github.com/doxygen/doxygen/commit/c1789f2e5d8421d6028c836ab66afecacff284ef">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5698">5698</a> - Bogus warning: citelist: Unexpected new line character [<a href="https://github.com/doxygen/doxygen/commit/5c321cbb6359bc1bb875729c08beba2edc084500">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5704">5704</a> - @todo paragraphs incorrectly placed in rtf output [<a href="https://github.com/doxygen/doxygen/commit/600d5859d7bcb94b08ef656fd427914766ae9afe">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5705">5705</a> - Bogus message with addtogroup [<a href="https://github.com/doxygen/doxygen/commit/b75af9180ae53f7c7abb94ccf906333169247785">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5707">5707</a> - Configuring doxyfile to only output docbook produces erroneous warning [<a href="https://github.com/doxygen/doxygen/commit/05fcf8decc25bd2f1a2e7867ee8e5d9da1f08933">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5709">5709</a> - latex compilation: \backmatter incompatible with COMPACT_LATEX=YES [<a href="https://github.com/doxygen/doxygen/commit/c9067c5bb9a1868e0963dc210cf3b7152c4aa79a">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5710">5710</a> - Wrong icons in TOC of CHM help [<a href="https://github.com/doxygen/doxygen/commit/8c97e0cd63bcf942ee5b43c9471055a4ea27551c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5720">5720</a> - <CAPTION> inside <TABLE> no longer works for LaTex output [<a href="https://github.com/doxygen/doxygen/commit/0599f92d06ff433446f34136ffe2f3d65d6bd109">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5726">5726</a> - Duplicate anchors from tagfiles [<a href="https://github.com/doxygen/doxygen/commit/1f21c23c57c91ba6901c0de38bb236f7246e88c9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5727">5727</a> - Tagfile anchors not generated for enumeration values [<a href="https://github.com/doxygen/doxygen/commit/1d4f37cb13a75ca8bdc49be3558438104e7eef19">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5728">5728</a> - Non-ascii characters are not emphasised [<a href="https://github.com/doxygen/doxygen/commit/8f67d4f63efd45b0d38502bdf68987d7fc1e92e9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5744">5744</a> - Using TAGFILES prevents symbol extraction [<a href="https://github.com/doxygen/doxygen/commit/a735498be5a572236755cc3da65bf4774cbac25c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5753">5753</a> - PATCH: please consider making doxygen output byte for byte identical between individual runs by default [<a href="https://github.com/doxygen/doxygen/commit/3f2e8a3067712b025623e4420e6eb161febfd42b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5754">5754</a> - Doxygen generates bad "More..." file links for functions within a namespace [<a href="https://github.com/doxygen/doxygen/commit/ea202be55d68af33917658e3fec169da3a7fa7a8">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5756">5756</a> - [PATCH] QT4's qmake is titled differently on Fedora 21 [<a href="https://github.com/doxygen/doxygen/commit/3bd3ad9f8f4d010e42f0ba8eeab229f44b1ecb1c">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/a883f65ab94973d4c7948623186159f978517851">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5761">5761</a> - last enum member not documented [<a href="https://github.com/doxygen/doxygen/commit/50a329c056a2676608f30321a3207ff17ab20abb">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5764">5764</a> - Nested list in C# XML comments closes outer list prematurely [<a href="https://github.com/doxygen/doxygen/commit/2c679e7d39144dadef2e9fd25772f0e41586e18b">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/7a0522fafde300f36c3d5264f46c1f70cf35b7b9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5768">5768</a> - Bogus warning regarding nested comments [<a href="https://github.com/doxygen/doxygen/commit/e4c0036962d8fa0ea9c1e38dbdb5e91168201f22">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5769">5769</a> - Bogus warnings in case of anonymous namespace and @todo [<a href="https://github.com/doxygen/doxygen/commit/298ab30b2a2aa0936f4683c9366afd44c00adc60">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5772">5772</a> - Don't warn about missing documentation for deleted functions. [<a href="https://github.com/doxygen/doxygen/commit/796d6585be58d1c9112422a919f49d1998dc672c">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/ac576bd974ac27bc1f395e8ae6c77b19f800b6db">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5774">5774</a> - Table of content incorrect with escaped symbols [<a href="https://github.com/doxygen/doxygen/commit/5cdf62661c88b5f0c135337da4d6e58581aad037">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5777">5777</a> - man output should escape minus signs [<a href="https://github.com/doxygen/doxygen/commit/3608a668b3892eaa4f7b2e4b29b833ede24ceee7">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5779">5779</a> - Bug #313527 regression - Enum in bitfield is not parsed properly. [<a href="https://github.com/doxygen/doxygen/commit/528bb8054ca362843630ec261ca6e6990a206081">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/7b2d77abb73288bdd48ca04720fd6779e0bf94c2">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5793">5793</a> - FILE_PATTERNS ignores arbitrary extensions [<a href="https://github.com/doxygen/doxygen/commit/52cb086da66533332962f2bf9cb35772e980c092">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5814">5814</a> - class scoped enum documentation appearing at group level instead of class level [<a href="https://github.com/doxygen/doxygen/commit/e4a9d06d7871f24dd6e37ecac6addae729e6d721">view</a>]</li> +<li>Build fixes for windows build [<a href="https://github.com/doxygen/doxygen/commit/5446770855a8286092abdd91d9069cb3191c209d">view</a>]</li> +<li>Bump copyright year [<a href="https://github.com/doxygen/doxygen/commit/e11b48785323017bf1d81e91e8133d7f3ba1f243">view</a>]</li> +<li>Bump version in configure script [<a href="https://github.com/doxygen/doxygen/commit/97342f92e111d7aa3e423a128379a6018820ce6c">view</a>]</li> +<li>Cleanup & adapt travis config [<a href="https://github.com/doxygen/doxygen/commit/5f67c67323bff27751ba07c417ba99180fa0d762">view</a>]</li> +<li>Consistency in handling HTML and LaTeX in respect to header and footer [<a href="https://github.com/doxygen/doxygen/commit/be5cc75ffc2e0a95ecbf0ce8d918b070c276d3e5">view</a>]</li> +<li>Correct string buffer sizes for RTF output, such that the string is always correctly sized. [<a href="https://github.com/doxygen/doxygen/commit/bc8e705cf90cecdff8a247264c249ffed1d2af4a">view</a>]</li> +<li>Crash in case of non generic interface in Fortran [<a href="https://github.com/doxygen/doxygen/commit/7d3a2abf0137c5257eeb0a8e0f76381b79f1e7bb">view</a>]</li> +<li>Documentation HTML Header, Footer, and Stylesheet changes [<a href="https://github.com/doxygen/doxygen/commit/1dded5c92a13f9db60fc630cbe5f2cc5ad9bede0">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/478207365d7f09f0e676a76f654502c084806e4e">view</a>]</li> +<li>Documenting RESULT variable of Fortran FUNCTION [<a href="https://github.com/doxygen/doxygen/commit/21f9e87db8085fb1b5e0a9a9a25dee159b3fd324">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/4d52beec3760244d959ab4d5528aea1acba505e7">view</a>]</li> +<li>Doxygen LaTeX / PDF links point to page 1 [<a href="https://github.com/doxygen/doxygen/commit/e34913dcbe0bee2c3e21d6e21b2bcc6970003a5c">view</a>]</li> +<li>Enable relative paths referenced source files [<a href="https://github.com/doxygen/doxygen/commit/ed178335e8c123b58c4fee24766bceae0fc80aa2">view</a>]</li> +<li>Escape "@" in names as it is not allowed in XML / Docbook names (coming from anon namespaces) [<a href="https://github.com/doxygen/doxygen/commit/65c35c435ae93d5f39c3ddec93008b2f544544ca">view</a>]</li> +<li>Fix for bug 746673. [<a href="https://github.com/doxygen/doxygen/commit/effbbcc72295f5843377ddce2794bcf6e7000322">view</a>]</li> +<li>Fix for building diagram example conditionally [<a href="https://github.com/doxygen/doxygen/commit/f415b624a6cf6b9e577ec6131a23cb4a0e830aaf">view</a>]</li> +<li>Fix for issue 744670 [<a href="https://github.com/doxygen/doxygen/commit/0d684381ac40574f6a948c56eb2da0445c3ee3bf">view</a>]</li> +<li>Fix for issue 744671 [<a href="https://github.com/doxygen/doxygen/commit/192f9e8bf78e10c9d97e08264b1c76c8aa4edf2b">view</a>]</li> +<li>Fix for rendering the template parameters of members of variadic template classes. [<a href="https://github.com/doxygen/doxygen/commit/32093bcca82c7d3a4df4670f52340033e9f16b62">view</a>]</li> +<li>Fix missing brief documentation for overload and specialization functions [<a href="https://github.com/doxygen/doxygen/commit/c604aef8a6465f38f8f04276194a66a4e044dc84">view</a>]</li> +<li>Fix nesting of XML tag "literallayout" for docbook output of enums. [<a href="https://github.com/doxygen/doxygen/commit/3abac31c525e6cf6898a1e8deb5c73f2a2ff5a8a">view</a>]</li> +<li>Fix parsing of ODL-style properties [<a href="https://github.com/doxygen/doxygen/commit/6a8bef8852eb22558b3559ebe96d9e06e6cadfa7">view</a>]</li> +<li>Fix potential null pointer dereference in src/classdef.cpp [<a href="https://github.com/doxygen/doxygen/commit/5743848928ffaeccaaef24dac051aaa9acf2c4b7">view</a>]</li> +<li>Fix potential null pointer dereference in src/context.cpp [<a href="https://github.com/doxygen/doxygen/commit/2690774f87b9fcb12b35153de82cde22248b3949">view</a>]</li> +<li>Fixed a couple of cases where sharing string data could lead to corruption [<a href="https://github.com/doxygen/doxygen/commit/312bef563a5be72f6423377247db1b80044bf711">view</a>]</li> +<li>Fixed code reachability bug found by coverity in translator_fi.h [<a href="https://github.com/doxygen/doxygen/commit/80d09775da9a99a3bc58704ffd055547c6b03043">view</a>]</li> +<li>Fixed compilation issue on Windows [<a href="https://github.com/doxygen/doxygen/commit/d75455eef7c91f11c2b9061d9a086ce93c4231b2">view</a>]</li> +<li>Fixed issue accessing uninitialized buffer under certain conditions. [<a href="https://github.com/doxygen/doxygen/commit/49f6c63aba4d77cd14fa205bee4bf427cefdaa44">view</a>]</li> +<li>Fixed potential crash while generating dot graphs [<a href="https://github.com/doxygen/doxygen/commit/50f82c94b9bf1ff982f9ddd8b9a88fb91d9e0bec">view</a>]</li> +<li>Fixed potential string buffer issue for dot graphs [<a href="https://github.com/doxygen/doxygen/commit/6b24aba8fce772d9e46e3174a655281eeb44ad84">view</a>]</li> +<li>Fixed regression due to buffer resizing while generating RTF. [<a href="https://github.com/doxygen/doxygen/commit/a1f2872ef098cfcc526002b9c9d533da6f2775b5">view</a>]</li> +<li>Fixed regression in argument processing [<a href="https://github.com/doxygen/doxygen/commit/ae8f618d140b4368045d286a682df3f6de7b2960">view</a>]</li> +<li>Fixed type in printdocvisitor.h [<a href="https://github.com/doxygen/doxygen/commit/c9465bd210d8250a5439f22bf564c187cd45e968">view</a>]</li> +<li>Fixed typos in comments. [<a href="https://github.com/doxygen/doxygen/commit/b82320a6f57519443c46e5e3044fef97b1f8f618">view</a>]</li> +<li>Fixes for showing type constraint relations [<a href="https://github.com/doxygen/doxygen/commit/95375152974fa7e0e4d4cec7007d942dd5e9615e">view</a>]</li> +<li>Fortran FUNCTION source code [<a href="https://github.com/doxygen/doxygen/commit/25a90990662449808c5ba58c243a7835d13ba750">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/e7a6a682137a82dbdf847b1879f320ece4f3642f">view</a>]</li> +<li>Fortran: code color GOTO as flow keyword. [<a href="https://github.com/doxygen/doxygen/commit/8090675790ad9265bcffdf07ab4d48fc8c037276">view</a>]</li> +<li>Fortran: fixed format position 73 and further is comment [<a href="https://github.com/doxygen/doxygen/commit/557ad21ce28d093044101eb8bee2c4df1621da7a">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/eb92c064b33bf9f303233210b9693215b0fb7f9d">view</a>]</li> +<li>Fortran: warning message about not documented module member [<a href="https://github.com/doxygen/doxygen/commit/dcdd35ce2a0cda024525298a9a20d6c746539e6d">view</a>]</li> +<li>Guarded debug prints against printing a NULL pointer. [<a href="https://github.com/doxygen/doxygen/commit/0831c71c05c9204839e187759f13303e64783730">view</a>]</li> +<li>HTML entity &deg; gives problems in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/072383ed1c6fcfff7a7619d92ce3a8cb0b91fff9">view</a>]</li> +<li>Help message regarding layout file [<a href="https://github.com/doxygen/doxygen/commit/7569f42d95332a5948e9d35e94e88d56d11634a9">view</a>],[<a href="https://github.com/doxygen/doxygen/commit/ad0e5fe14dce093e3b00ca677849cacbc2d657b7">view</a>]</li> +<li>Internal debug option -d lex is not described [<a href="https://github.com/doxygen/doxygen/commit/00a91ae9fabe7783260c7c3fcdfec5b1ead49350">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/ebe3e8ec4a09edbb8a5b2dde88b6c479b03c0be9">view</a>]</li> +<li>Internal doxygen docs gives: warning: Unsupported xml/html tag <...> found [<a href="https://github.com/doxygen/doxygen/commit/e366acaf0c27ce43ec80a70c0667c27cd5ef9d29">view</a>]</li> +<li>Missing cross reference link [<a href="https://github.com/doxygen/doxygen/commit/213e680537303959f29b2424d40d74ecf66cb3f6">view</a>]</li> +<li>Patch fixing a typo in Pull Request 307 [<a href="https://github.com/doxygen/doxygen/commit/6913c67ff1f9f20a71333f78cacd87a9e0c7756f">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/eac0fd660bffe62ae29a190308bf21b21d49647b">view</a>]</li> +<li>Prevent example.tag from being regenerated [<a href="https://github.com/doxygen/doxygen/commit/d49604f814ceb22f81571d8ca99540e62cfa979a">view</a>]</li> +<li>Problem running tests under Windows [<a href="https://github.com/doxygen/doxygen/commit/9bd54df7ba7dd15783f5a9180c85a7137dcdbc08">view</a>]</li> +<li>Remove the new line after @startuml in generated pu file [<a href="https://github.com/doxygen/doxygen/commit/edf8dbbbc17e65e2eb97b5c9b4763a04969017fe">view</a>]</li> +<li>Remove unreachable code [<a href="https://github.com/doxygen/doxygen/commit/d3e7b06f3a82780083e27bb83360ed9496df9f8d">view</a>]</li> +<li>Remove unused local and static global variables [<a href="https://github.com/doxygen/doxygen/commit/d03e4c2ae1864c6f27a4341449ce97133aeb6847">view</a>]</li> +<li>Remove wrong </File> [<a href="https://github.com/doxygen/doxygen/commit/e8cef724a1f40896f9c6294d6f410e240b6365ee">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/efd55ae1787f8f7ec35761849dc7cfd3175f8b33">view</a>]</li> +<li>Removed OS version check for MACOSX (was not used anywhere) [<a href="https://github.com/doxygen/doxygen/commit/1e3e9f03e746d4ac46c9c7b1b80e7e3100ee42f0">view</a>]</li> +<li>Removed dbus XML parser, various refinements [<a href="https://github.com/doxygen/doxygen/commit/551012f2647c53d8532d638361011d003d5b81f3">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/bf4aee305879406d9057864ab7f8938e01ca8bd0">view</a>]</li> +<li>Removed old build files, added install targets and other options [<a href="https://github.com/doxygen/doxygen/commit/7bcf8e9a379ec0599160e5562f07b93f8fb9557a">view</a>]</li> +<li>Repair doxygen generate invalid styleSheetFile and extensionsFile of RTF [<a href="https://github.com/doxygen/doxygen/commit/0d208bc1c9a32718a93eb9911220ba72ad27fb9a">view</a>]</li> +<li>Replace to_c_cmd by resource compiler [<a href="https://github.com/doxygen/doxygen/commit/2e39e5c7c1427ac6b24c64b7ef01be8d5a20092b">view</a>]</li> +<li>Restore deleted file [<a href="https://github.com/doxygen/doxygen/commit/dfe93f9fde39167eae2aeeab929641a9c56cc916">view</a>]</li> +<li>Showing grey/gray in documentation [<a href="https://github.com/doxygen/doxygen/commit/320ebb35dd4a615a7a692d71de4587be9ce8b99b">view</a>]</li> +<li>Suggestion to use stripPrefix has been implemented for RESULT. For consistency also implemented for arguments. [<a href="https://github.com/doxygen/doxygen/commit/610bdb67c4db775debf26d85091383938d946f3d">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/6720a714461b9454c7cdbae7ceff7eb735feeb3b">view</a>]</li> +<li>Support diff that returns "No differences encountered" when comparing test results [<a href="https://github.com/doxygen/doxygen/commit/4716f426332d02eb6841c509658b8a709cce9318">view</a>]</li> +<li>Support generating index-color PNG files [<a href="https://github.com/doxygen/doxygen/commit/a09ffed2f603699955c18c19e0d3e782fb61d93f">view</a>]</li> +<li>Switched back to version 6.2 of JavaCC for VHDL parser generation. [<a href="https://github.com/doxygen/doxygen/commit/088896f27f460b6ac03c2d64df148e3617c1e519">view</a>]</li> +<li>Tcl: fix for extra line breaks in source browser introduced by commit 312bef5 [<a href="https://github.com/doxygen/doxygen/commit/3cc116ba2250e6946773ec22c6c7c6557773d28e">view</a>]</li> +<li>TranslatorSwedish updated [<a href="https://github.com/doxygen/doxygen/commit/eaa19e3a439a4652023b47b0cf47c7303484ef5d">view</a>]</li> +<li>Update of search from "endless search to 'Character search: criterion. [<a href="https://github.com/doxygen/doxygen/commit/a0820f29e60be1555b5b0c92a975bf334b6f5258">view</a>]</li> +<li>Update translator_cn.h [<a href="https://github.com/doxygen/doxygen/commit/a88d3549373990bfac09f936748577fc5c59d240">view</a>]</li> +<li>Updated changelog for 1.8.9.1 [<a href="https://github.com/doxygen/doxygen/commit/f8671a4520350fe38f986fdd199c2344452e7a01">view</a>]</li> +<li>Updated installation section of the manual [<a href="https://github.com/doxygen/doxygen/commit/db6a3ab2761a328e74fdccf243ff148af7623062">view</a>]</li> +<li>Various VHDL related fixes [<a href="https://github.com/doxygen/doxygen/commit/34b00c442308efe169cc89fad62588fdce1d84e8">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/3eed7a5c5b330736b508c722c9614c774a678ef1">view</a>], +[<a href="https://github.com/doxygen/doxygen/commit/530647f76a7660a406d102269dc041b00b0e3d4e">view</a>]</li> +<li>Various minor changes [<a href="https://github.com/doxygen/doxygen/commit/f63d9ed958d2c06717434e1a90e6417cf2d60f6b">view</a>]</li> +<li>Warning message multiple mainpages [<a href="https://github.com/doxygen/doxygen/commit/17fdd71a0f7a02e8b72eaf86d67bc142210a7059">view</a>]</li> +<li>Warnings without filename [<a href="https://github.com/doxygen/doxygen/commit/da3faf6b93fd3eb4e751d2c0cbd4ed9ceae7922b">view</a>]</li> +<li>add support for github flavored fenced code blocks [<a href="https://github.com/doxygen/doxygen/commit/288ea42fc27389160c20912003a7972e21195265">view</a>]</li> +<li>added HHC.exe own output to the debug output when extcmd flag enabled [<a href="https://github.com/doxygen/doxygen/commit/4438e24b478de1fd97ccc81a3a9f7651124e1c63">view</a>]</li> +<li>doc/translator.py -- minor updates [<a href="https://github.com/doxygen/doxygen/commit/1ccc93fd699b34b7a89acecf9e59a526a5972bb8">view</a>]</li> +<li>drop #include <unistd.h> [<a href="https://github.com/doxygen/doxygen/commit/1dd0cf03f5bf173fa4ac3bb8279d12fff1b98eb7">view</a>]</li> +<li>fix *.l for three backticks [<a href="https://github.com/doxygen/doxygen/commit/bb93db0d60fd4cd123dfc886ecd20167068db6ba">view</a>]</li> +<li>fix enum brief description in RTF output [<a href="https://github.com/doxygen/doxygen/commit/87429a2609b822d2b08ec17fb2a20464a5043c9e">view</a>]</li> +<li>fix for CHM TOC "Classes" entry to point to annotated file [<a href="https://github.com/doxygen/doxygen/commit/700a9ac3c177fdef25b9b00ed6bb5e0ea963d236">view</a>]</li> +<li>fix for src/translator_tw.h by Gary Lee (translation cleaned) [<a href="https://github.com/doxygen/doxygen/commit/d101790db5e64a64f4db0e46391bbb1b0dadc8b1">view</a>]</li> +<li>increase the size of l when result is modified [<a href="https://github.com/doxygen/doxygen/commit/dd0d738683029f80a42b6673e0b1b1228bebfce3">view</a>]</li> +<li>move layout_default.xml to templates/html/ [<a href="https://github.com/doxygen/doxygen/commit/45ebb6ff4846255ad7209e3bec7cd4fe0544ffd5">view</a>]</li> +<li>runtests.pl: mmn version has dash as separator [<a href="https://github.com/doxygen/doxygen/commit/f5efa2f383fe89b53bd8fc27b2116e8636417ebf">view</a>]</li> +<li>specify that doxygen searches files in INPUT tag [<a href="https://github.com/doxygen/doxygen/commit/0971dc7771be1b386a204c3d11515f7d0f5af427">view</a>]</li> +<li>sqlite3: add regexp searches to search.py [<a href="https://github.com/doxygen/doxygen/commit/13dd6d635e7ba2beb26a0d2ee8542ac63d1c7973">view</a>]</li> +<li>sqlite3: add schema comments [<a href="https://github.com/doxygen/doxygen/commit/ef5d48d93f5565ebca9aae4ba9d6633c32719ecc">view</a>]</li> +<li>sqlite3: fix constness [<a href="https://github.com/doxygen/doxygen/commit/90d89d8a2a2be931742c7291cd70e4a980035ae1">view</a>]</li> +<li>version.py pass configure file path as parameter [<a href="https://github.com/doxygen/doxygen/commit/75e8f4c80ab5c06a33eaaf7ec587ee35ed9c1b1a">view</a>]</li> +<li>xml: use STRIP_FROM_PATH on @file attributes. [<a href="https://github.com/doxygen/doxygen/commit/29ae707794042a97412eaa137fa7b30f2367294d">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/5a0379944f8bdf883fdb25e94e0cdb1e5d2f4366">view</a>]</li> </ul> <p> \endhtmlonly @@ -670,21 +1071,21 @@ <a name="1.8.9.1"></a> </p> <ul> -<li>Fixed a couple of cases where sharing string data could lead to corruption [<a href="http://github.com/doxygen/doxygen/commit/312bef563a5be72f6423377247db1b80044bf711">view</a>]</li> -<li>Various VHDL related fixes [<a href="http://github.com/doxygen/doxygen/commit/34b00c442308efe169cc89fad62588fdce1d84e8">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742151">742151</a> - Bogus warning: citelist: Unexpected new line character [<a href="http://github.com/doxygen/doxygen/commit/5c321cbb6359bc1bb875729c08beba2edc084500">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742230">742230</a> - @todo paragraphs incorrectly placed in rtf output [<a href="http://github.com/doxygen/doxygen/commit/600d5859d7bcb94b08ef656fd427914766ae9afe">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742235">742235</a> - Bogus message with addtogroup [<a href="http://github.com/doxygen/doxygen/commit/b75af9180ae53f7c7abb94ccf906333169247785">view</a>]</li> -<li>Documentation HTML Header, Footer, and Stylesheet changes [<a href="http://github.com/doxygen/doxygen/commit/478207365d7f09f0e676a76f654502c084806e4e">view</a>]</li> -<li>Documenting RESULT variable of Fortran FUNCTION [<a href="http://github.com/doxygen/doxygen/commit/4d52beec3760244d959ab4d5528aea1acba505e7">view</a>]</li> -<li>Fix potential null pointer dereference in src/context.cpp [<a href="http://github.com/doxygen/doxygen/commit/2690774f87b9fcb12b35153de82cde22248b3949">view</a>]</li> -<li>Fixed compilation issue on Windows [<a href="http://github.com/doxygen/doxygen/commit/d75455eef7c91f11c2b9061d9a086ce93c4231b2">view</a>]</li> -<li>Fortran FUNCTION source code [<a href="http://github.com/doxygen/doxygen/commit/25a90990662449808c5ba58c243a7835d13ba750">view</a>]</li> -<li>Fortran: code color GOTO as flow keyword. [<a href="http://github.com/doxygen/doxygen/commit/8090675790ad9265bcffdf07ab4d48fc8c037276">view</a>]</li> -<li>Help message regarding layout file [<a href="http://github.com/doxygen/doxygen/commit/7569f42d95332a5948e9d35e94e88d56d11634a9">view</a>]</li> -<li>Remove unused local and static global variables [<a href="http://github.com/doxygen/doxygen/commit/d03e4c2ae1864c6f27a4341449ce97133aeb6847">view</a>]</li> -<li>Suggestion to use stripPrefix has been implemented for RESULT. For consistency also implemented for arguments. [<a href="http://github.com/doxygen/doxygen/commit/6720a714461b9454c7cdbae7ceff7eb735feeb3b">view</a>]</li> -<li>Switched back to version 6.2 of JavaCC for VHDL parser generation. [<a href="http://github.com/doxygen/doxygen/commit/088896f27f460b6ac03c2d64df148e3617c1e519">view</a>]</li> +<li>Fixed a couple of cases where sharing string data could lead to corruption [<a href="https://github.com/doxygen/doxygen/commit/312bef563a5be72f6423377247db1b80044bf711">view</a>]</li> +<li>Various VHDL related fixes [<a href="https://github.com/doxygen/doxygen/commit/34b00c442308efe169cc89fad62588fdce1d84e8">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5698">5698</a> - Bogus warning: citelist: Unexpected new line character [<a href="https://github.com/doxygen/doxygen/commit/5c321cbb6359bc1bb875729c08beba2edc084500">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5704">5704</a> - @todo paragraphs incorrectly placed in rtf output [<a href="https://github.com/doxygen/doxygen/commit/600d5859d7bcb94b08ef656fd427914766ae9afe">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5705">5705</a> - Bogus message with addtogroup [<a href="https://github.com/doxygen/doxygen/commit/b75af9180ae53f7c7abb94ccf906333169247785">view</a>]</li> +<li>Documentation HTML Header, Footer, and Stylesheet changes [<a href="https://github.com/doxygen/doxygen/commit/478207365d7f09f0e676a76f654502c084806e4e">view</a>]</li> +<li>Documenting RESULT variable of Fortran FUNCTION [<a href="https://github.com/doxygen/doxygen/commit/4d52beec3760244d959ab4d5528aea1acba505e7">view</a>]</li> +<li>Fix potential null pointer dereference in src/context.cpp [<a href="https://github.com/doxygen/doxygen/commit/2690774f87b9fcb12b35153de82cde22248b3949">view</a>]</li> +<li>Fixed compilation issue on Windows [<a href="https://github.com/doxygen/doxygen/commit/d75455eef7c91f11c2b9061d9a086ce93c4231b2">view</a>]</li> +<li>Fortran FUNCTION source code [<a href="https://github.com/doxygen/doxygen/commit/25a90990662449808c5ba58c243a7835d13ba750">view</a>]</li> +<li>Fortran: code color GOTO as flow keyword. [<a href="https://github.com/doxygen/doxygen/commit/8090675790ad9265bcffdf07ab4d48fc8c037276">view</a>]</li> +<li>Help message regarding layout file [<a href="https://github.com/doxygen/doxygen/commit/7569f42d95332a5948e9d35e94e88d56d11634a9">view</a>]</li> +<li>Remove unused local and static global variables [<a href="https://github.com/doxygen/doxygen/commit/d03e4c2ae1864c6f27a4341449ce97133aeb6847">view</a>]</li> +<li>Suggestion to use stripPrefix has been implemented for RESULT. For consistency also implemented for arguments. [<a href="https://github.com/doxygen/doxygen/commit/6720a714461b9454c7cdbae7ceff7eb735feeb3b">view</a>]</li> +<li>Switched back to version 6.2 of JavaCC for VHDL parser generation. [<a href="https://github.com/doxygen/doxygen/commit/088896f27f460b6ac03c2d64df148e3617c1e519">view</a>]</li> </ul> <p> \endhtmlonly @@ -695,87 +1096,87 @@ <a name="1.8.9"></a> </p> <ul> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634763">634763</a> - Fortran: external subroutine as dummy argument not recognized [<a href="http://github.com/doxygen/doxygen/commit/8f78eff7e8b2650f9a8364ff5c5b6925279e6b5a">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634763">634763</a> - Fortran: external subroutine as dummy argument not recognized [<a href="http://github.com/doxygen/doxygen/commit/fabd1194a2e3c2536dddc19945c568a690b17031">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=651859">651859</a> - Brief description misplaced in man page output [<a href="http://github.com/doxygen/doxygen/commit/379e3b959a9566571db3c799a8338dd4436881b2">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652276">652276</a> - Typedefs in manpages has too few linebreak possiblilities [<a href="http://github.com/doxygen/doxygen/commit/4bbcf71defb2e2be02494b7ff68d475d1a0438ac">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685597">685597</a> - C# <code> tag in an <example> tag does not render as expected. [<a href="http://github.com/doxygen/doxygen/commit/07d5f3f48a497993c525eab9a5ecc0429c317c98">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687576">687576</a> - Add support for LATEX_EXTRA_STYLESHEET [<a href="http://github.com/doxygen/doxygen/commit/fd91442bcc5a20ba298a024ee2cc375ec4f1714d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704090">704090</a> - Allow Class{T}.Method in cref to refer to a generic class in XML comments [<a href="http://github.com/doxygen/doxygen/commit/f9c9edba086f544b813ff036ea9209744da18c44">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722940">722940</a> - classes with same name in different namespace adding to same group [<a href="http://github.com/doxygen/doxygen/commit/73a5a4c48aec0c48353ecb8e5aa6d5ff02463132">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729063">729063</a> - Missing link for item inside the same namespace [<a href="http://github.com/doxygen/doxygen/commit/95aee340bddca0c09c79dc2f137a5ad01eb4fda8">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729236">729236</a> - Added HIDE_COMPOUND_REFERENCE config option [<a href="http://github.com/doxygen/doxygen/commit/415ae7021eeee278ad6c95be23e572dc18ff6a32">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735145">735145</a> - QHP toc broken if mainpage with PROJECT_NAME title has sections/subpages [<a href="http://github.com/doxygen/doxygen/commit/745955f576cbd7b5f7601c55937d9c42db8161e8">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735194">735194</a> - src/Makefile.libdoxycfg shouldn't be distributed [<a href="http://github.com/doxygen/doxygen/commit/45cfc44d3670bb9f72a0795d4a9bc07403a29d6d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735198">735198</a> - plantUML requires epstopdf for building PDF files [<a href="http://github.com/doxygen/doxygen/commit/52d216a87451c867c92691a4483cd85d3e5b906f">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735376">735376</a> - tag file: Unknown compound attribute `singleton' found! [<a href="http://github.com/doxygen/doxygen/commit/92eb236037e857f38eaf24238815641a48540792">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735441">735441</a> - Fix a resource leak in src/vhdldocgen.cpp [<a href="http://github.com/doxygen/doxygen/commit/22e44853813066e45b483b1b6633199b3d2bf509">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735462">735462</a> - There's no such thing as a private Q_PROPERTY [<a href="http://github.com/doxygen/doxygen/commit/ff7cc1c73c3d4b3449862055bd08b0f361e5b358">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735475">735475</a> - Same Expression in translator_kr.h [<a href="http://github.com/doxygen/doxygen/commit/32aa9f2a7898b5c43070a5cd0dec8bddcc6b8c39">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735477">735477</a> - Fix a potential null pointer dereference in src/memberdef.cpp [<a href="http://github.com/doxygen/doxygen/commit/7a268f59c0551953fe4e7dde0b1e3804d583a060">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735481">735481</a> - Mismatch in memory allocation/de-allocation function in vhdlparser/vhdlstring.h [<a href="http://github.com/doxygen/doxygen/commit/2038873ce0a9ec90efb28730b3dc787d3d03e964">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735482">735482</a> - Remove a not needed initialization of a local variable in src/mangen.cpp [<a href="http://github.com/doxygen/doxygen/commit/1e8a69902a2cbb3118e6de5959223b9c8d3a843a">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735483">735483</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://bugzilla.gnome.org/show_bug.cgi?id=735497">735497</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://bugzilla.gnome.org/show_bug.cgi?id=735499">735499</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://bugzilla.gnome.org/show_bug.cgi?id=735584">735584</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://bugzilla.gnome.org/show_bug.cgi?id=735587">735587</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://bugzilla.gnome.org/show_bug.cgi?id=735589">735589</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://bugzilla.gnome.org/show_bug.cgi?id=735590">735590</a> - Remove not needed pointer initialization in src/entry.cpp [<a href="http://github.com/doxygen/doxygen/commit/88832b15f1256846b1228ac411d270c6d092a50b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735591">735591</a> - Provide exit code in case generatePlantUMLOutput fails [<a href="http://github.com/doxygen/doxygen/commit/94ea18e60c50db14f25eda642be020fac5917b3c">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735620">735620</a> - Remove not needed variable caching in src/markdown.cpp [<a href="http://github.com/doxygen/doxygen/commit/d6c2464982e5b1c027cdde0400822c3b2fc7fd41">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735622">735622</a> - Do not cache inputSize in src/doxygen.cpp [<a href="http://github.com/doxygen/doxygen/commit/8f3e7fc892f07f32a2c6e0110dab58942f6c20a7">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735623">735623</a> - Expression is always false because 'else if' condition matches previous condition [<a href="http://github.com/doxygen/doxygen/commit/98a9b24cd6006b130dd1e56c32f684e159fee2a3">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735726">735726</a> - Fix missing break in switch case statement [<a href="http://github.com/doxygen/doxygen/commit/b59edd279f887e55b162ae1b1c7bce4b2ca29dab">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735745">735745</a> - Spurious ASSERT message [<a href="http://github.com/doxygen/doxygen/commit/fff03ab9adcbdf480929c6a10975cab469eaf17c">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735759">735759</a> - Broken man pages due to bad use of autoBreak [<a href="http://github.com/doxygen/doxygen/commit/6aa7f36ce924cf9dc59a951e5727b17c37d0345e">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735767">735767</a> - Fix potential copy and paste issue in vhdlparser/VhdlParser.cc [<a href="http://github.com/doxygen/doxygen/commit/9238e342bc8f1ce3e0aaa2944d77c33e4363cf48">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735924">735924</a> - [Patch] Documentation: Wrong link for \\diafile [<a href="http://github.com/doxygen/doxygen/commit/285221e3d287db083b9377cb5633650fb2a783a1">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735925">735925</a> - [Patch] DocBook: Possible name clash for generated image files [<a href="http://github.com/doxygen/doxygen/commit/8b39158436b740a78166f947de375b5486441c93">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735926">735926</a> - RTF output: \\diafile and \\mscfile do not work [<a href="http://github.com/doxygen/doxygen/commit/7cd2b1f27a03846a8f9bcd1e4489cbfebf56bfa2">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735929">735929</a> - Windows: Process exit code is ignored for processes launched using ShellExecuteEx() [<a href="http://github.com/doxygen/doxygen/commit/68aa8c2bd8a5e6a8ad7c46c725c8bb5e61896ba0">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735982">735982</a> - Fix potential allocation of huge memory amount due to type overflow in src/lodepng.cpp [<a href="http://github.com/doxygen/doxygen/commit/30870ef90f4a74e7c53a6856b10bcd2f16e4d1bd">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735985">735985</a> - Fix missing unchecked return value in src/dot.cpp [<a href="http://github.com/doxygen/doxygen/commit/be0c23efcb902891e91bed42ab2ac27a6f1460cb">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736018">736018</a> - Fix potential null pointer dereference in src/dbusxmlscanner.cpp [<a href="http://github.com/doxygen/doxygen/commit/46e83b44be0c0aa97ead5ee52e329154c1fb47bc">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736020">736020</a> - Fix identical code for different branches in src/translator_tw.h [<a href="http://github.com/doxygen/doxygen/commit/79dedb65ae1f9306b83a69058dbd2015ef7c3b94">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736022">736022</a> - Fix potential null pointer dereference in src/index.cpp [<a href="http://github.com/doxygen/doxygen/commit/68c063cbffc38c1528dd86232a8b8642fae26b1b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736023">736023</a> - Remove not needed variable initialization in src/cite.cpp [<a href="http://github.com/doxygen/doxygen/commit/23bc555e5483baa6c1a3d0c1ad346bb37348b31b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736027">736027</a> - Remove not needed local variable in src/doxygen.cpp [<a href="http://github.com/doxygen/doxygen/commit/561a996c68f796dccb36fb3eed6150fcc90e5634">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736029">736029</a> - Remove redundant if/else branch in src/lodepng.cpp [<a href="http://github.com/doxygen/doxygen/commit/3026131de3126298863d1a68fe0c747524e26e43">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736030">736030</a> - Remove redundant if/else branch in src/translator_lt.h [<a href="http://github.com/doxygen/doxygen/commit/e7b9f1d16ea2043be068c448676e368e9239314e">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736031">736031</a> - Cleanup redundant if/else branch in src/translator_kr.h [<a href="http://github.com/doxygen/doxygen/commit/3d1343d1c8876d0eb0352eafafe4aa90bc483adf">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736032">736032</a> - Cleanup redundant if/else branch in src/translator_sr.h [<a href="http://github.com/doxygen/doxygen/commit/192aa6590b6ceb264335a5b8a1aed6b6f8b0f350">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736033">736033</a> - Cleanup redundant if/else branch in src/translator_tw.h [<a href="http://github.com/doxygen/doxygen/commit/02b35985cda1a537c45071f1245b2c4a6dc4ffc6">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736034">736034</a> - Cleanup redundant if/else branch in src/translator_vi.h [<a href="http://github.com/doxygen/doxygen/commit/8e47b4bc5084cb00e5bdcdaa4c1bd048b48a4999">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736036">736036</a> - Remove redundant local variable initialization in qtools/qstring.cpp [<a href="http://github.com/doxygen/doxygen/commit/4afe088327ae6780c9c8a73b7b2d3994005f6cca">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736037">736037</a> - Fix wrong member variable initialization in src/define.cpp [<a href="http://github.com/doxygen/doxygen/commit/33daf7a7d9ab9b6c5454acd7a3cff7923d1c4c14">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736385">736385</a> - Fix potential null pointer dereference in src/util.cpp [<a href="http://github.com/doxygen/doxygen/commit/24b5b715929759a7836a3813ef93976b7cc10641">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736386">736386</a> - Fix another potential null pointer dereference in src/util.cpp [<a href="http://github.com/doxygen/doxygen/commit/bc95beac3eca3cda55430e0cde97ba826d3d7400">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736387">736387</a> - Fix a potential null pointer dereference in src/index.cpp [<a href="http://github.com/doxygen/doxygen/commit/c22be34fb79588fa04a9cf9c86438c8eb00d81fc">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736389">736389</a> - Fix a potential null pointer dereference in src/vhdldocgen.cpp [<a href="http://github.com/doxygen/doxygen/commit/7a22d83a1f9665863201ff0e717071e9b7d3a110">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=736992">736992</a> - Member functions omitted from tagfile [<a href="http://github.com/doxygen/doxygen/commit/b9ad9a03cf4febeb2aa10ddca22c1c9296c5223b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=737444">737444</a> - Java: Annotations with brackets prevent documentation [<a href="http://github.com/doxygen/doxygen/commit/e446e2e044d674ba3609619e3dd95eb340f15e09">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=737830">737830</a> - Invalid element name in footer part when GENERATE_TREEVIEW specified [<a href="http://github.com/doxygen/doxygen/commit/5cb961284e89f197406170389e8866bb9c94fe3a">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=738063">738063</a> - Fortran attribute contiguous not identified [<a href="http://github.com/doxygen/doxygen/commit/6da2e3fb28f6ed9f219c66d165ac4467fda36148">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=738167">738167</a> - Entity references in XML command attributes are incorrectly handled [<a href="http://github.com/doxygen/doxygen/commit/553a7bf7e1b7be2f602e0230ddfc7f882b009cf8">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=738173">738173</a> - Entity references in XML code command are incorrectly handled [<a href="http://github.com/doxygen/doxygen/commit/30216574cb189a92f27bb0e701ff31aa8cce6b83">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=738548">738548</a> - latex: dead links to source code [<a href="http://github.com/doxygen/doxygen/commit/b68a4abcfa22e68fd94487a8f2b48588eda5a1af">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=738574">738574</a> - &hellip; is replaced by \cdots rather than \dots in the LaTeX output [<a href="http://github.com/doxygen/doxygen/commit/9ac31f84bd25d320f861e9e194fe5df49f4b212b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739054">739054</a> - Python xml not outputting info of functions inside __init__.py [<a href="http://github.com/doxygen/doxygen/commit/d13908f65b6e745bab14dc610c9f9bc7908c55c5">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739056">739056</a> - Python xml - argsstring is empty, while HTML have arguments [<a href="http://github.com/doxygen/doxygen/commit/89eb624fec44c0f900d9035dfea950ceaf0ba76d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739209">739209</a> - Invalid warning about undocumented C++ function imported from tagfile [<a href="http://github.com/doxygen/doxygen/commit/f1c96033bcea28e3ff4528299459b39488831669">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739210">739210</a> - C++11 scoped enums with same name inside different classes are merged if using tagfile [<a href="http://github.com/doxygen/doxygen/commit/b4fd6ac51fad4f20116194816d4802f616739d1f">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739211">739211</a> - Cannot make explicit links to C++ const member functions [<a href="http://github.com/doxygen/doxygen/commit/ad5dfc39bee7a1b3de16f36bc3a20565aa6438fe">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739214">739214</a> - Cannot make unscoped link to C++ conversion operator [<a href="http://github.com/doxygen/doxygen/commit/9f477b87fc492221e1b7109d197fe468cd0ed23d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739462">739462</a> - Using "doxygen.css" for HTML_EXTRA_STYLESHEET fails silently [<a href="http://github.com/doxygen/doxygen/commit/5e962c90d3270612df7363e7cf6bf42646c94fbe">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=739863">739863</a> - Regression: Base classes incorrect when using CRTP with default template parameter [<a href="http://github.com/doxygen/doxygen/commit/200b828ead9f6bb5b2f6f99919837d5828a250e4">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=740218">740218</a> - Full scope needed when making link inside cross-referenced section [<a href="http://github.com/doxygen/doxygen/commit/c6e41226574c94a869ad0757b53027562ef189e1">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=740218">740218</a> - Full scope needed when making link inside cross-referenced section (fixed regression) [<a href="http://github.com/doxygen/doxygen/commit/60abada8b95cc1772996a264065904f408ed32ff">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=740446">740446</a> - invalid copydoc target does not result in warning [<a href="http://github.com/doxygen/doxygen/commit/738c0dd829b6e3ae74359a8d92d12b491fa71d1b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=741100">741100</a> - Latex to PDF hangs when using Markdown tables [<a href="http://github.com/doxygen/doxygen/commit/089771b5f3c3c3984ae6f352125a001788a62d29">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=741417">741417</a> - Crash when building gtkmm documentation [<a href="http://github.com/doxygen/doxygen/commit/050fce2b73d6e4455808ab86da2fddcf2f26e9b5">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=741778">741778</a> - \cite confused by labels ending with a dot (improved warning message) [<a href="http://github.com/doxygen/doxygen/commit/78fd02dc41384d81baddf17ff0bb3431267452fc">view</a>]</li> -<li>fix docbook output [<a href="http://github.com/doxygen/doxygen/commit/1a403d80160458091bab7c442e54f836c0b90bca">view</a>] +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4011">4011</a> - Fortran: external subroutine as dummy argument not recognized [<a href="https://github.com/doxygen/doxygen/commit/8f78eff7e8b2650f9a8364ff5c5b6925279e6b5a">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4011">4011</a> - Fortran: external subroutine as dummy argument not recognized [<a href="https://github.com/doxygen/doxygen/commit/fabd1194a2e3c2536dddc19945c568a690b17031">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4286">4286</a> - Brief description misplaced in man page output [<a href="https://github.com/doxygen/doxygen/commit/379e3b959a9566571db3c799a8338dd4436881b2">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4293">4293</a> - Typedefs in manpages has too few linebreak possiblilities [<a href="https://github.com/doxygen/doxygen/commit/4bbcf71defb2e2be02494b7ff68d475d1a0438ac">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4914">4914</a> - C# <code> tag in an <example> tag does not render as expected. [<a href="https://github.com/doxygen/doxygen/commit/07d5f3f48a497993c525eab9a5ecc0429c317c98">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4941">4941</a> - Add support for LATEX_EXTRA_STYLESHEET [<a href="https://github.com/doxygen/doxygen/commit/fd91442bcc5a20ba298a024ee2cc375ec4f1714d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5237">5237</a> - Allow Class{T}.Method in cref to refer to a generic class in XML comments [<a href="https://github.com/doxygen/doxygen/commit/f9c9edba086f544b813ff036ea9209744da18c44">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5418">5418</a> - classes with same name in different namespace adding to same group [<a href="https://github.com/doxygen/doxygen/commit/73a5a4c48aec0c48353ecb8e5aa6d5ff02463132">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5462">5462</a> - Missing link for item inside the same namespace [<a href="https://github.com/doxygen/doxygen/commit/95aee340bddca0c09c79dc2f137a5ad01eb4fda8">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5467">5467</a> - Added HIDE_COMPOUND_REFERENCE config option [<a href="https://github.com/doxygen/doxygen/commit/415ae7021eeee278ad6c95be23e572dc18ff6a32">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5554">5554</a> - QHP toc broken if mainpage with PROJECT_NAME title has sections/subpages [<a href="https://github.com/doxygen/doxygen/commit/745955f576cbd7b5f7601c55937d9c42db8161e8">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5558">5558</a> - src/Makefile.libdoxycfg shouldn't be distributed [<a href="https://github.com/doxygen/doxygen/commit/45cfc44d3670bb9f72a0795d4a9bc07403a29d6d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5559">5559</a> - plantUML requires epstopdf for building PDF files [<a href="https://github.com/doxygen/doxygen/commit/52d216a87451c867c92691a4483cd85d3e5b906f">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5560">5560</a> - tag file: Unknown compound attribute `singleton' found! [<a href="https://github.com/doxygen/doxygen/commit/92eb236037e857f38eaf24238815641a48540792">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5562">5562</a> - Fix a resource leak in src/vhdldocgen.cpp [<a href="https://github.com/doxygen/doxygen/commit/22e44853813066e45b483b1b6633199b3d2bf509">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5563">5563</a> - There's no such thing as a private Q_PROPERTY [<a href="https://github.com/doxygen/doxygen/commit/ff7cc1c73c3d4b3449862055bd08b0f361e5b358">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5564">5564</a> - Same Expression in translator_kr.h [<a href="https://github.com/doxygen/doxygen/commit/32aa9f2a7898b5c43070a5cd0dec8bddcc6b8c39">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5565">5565</a> - Fix a potential null pointer dereference in src/memberdef.cpp [<a href="https://github.com/doxygen/doxygen/commit/7a268f59c0551953fe4e7dde0b1e3804d583a060">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5567">5567</a> - Mismatch in memory allocation/de-allocation function in vhdlparser/vhdlstring.h [<a href="https://github.com/doxygen/doxygen/commit/2038873ce0a9ec90efb28730b3dc787d3d03e964">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5568">5568</a> - Remove a not needed initialization of a local variable in src/mangen.cpp [<a href="https://github.com/doxygen/doxygen/commit/1e8a69902a2cbb3118e6de5959223b9c8d3a843a">view</a>]</li> +<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="https://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="https://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="https://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 inside a (nested) comment in Markdown [<a href="https://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="https://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="https://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="https://github.com/doxygen/doxygen/commit/88832b15f1256846b1228ac411d270c6d092a50b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5576">5576</a> - Provide exit code in case generatePlantUMLOutput fails [<a href="https://github.com/doxygen/doxygen/commit/94ea18e60c50db14f25eda642be020fac5917b3c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5578">5578</a> - Remove not needed variable caching in src/markdown.cpp [<a href="https://github.com/doxygen/doxygen/commit/d6c2464982e5b1c027cdde0400822c3b2fc7fd41">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5580">5580</a> - Do not cache inputSize in src/doxygen.cpp [<a href="https://github.com/doxygen/doxygen/commit/8f3e7fc892f07f32a2c6e0110dab58942f6c20a7">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5581">5581</a> - Expression is always false because 'else if' condition matches previous condition [<a href="https://github.com/doxygen/doxygen/commit/98a9b24cd6006b130dd1e56c32f684e159fee2a3">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5583">5583</a> - Fix missing break in switch case statement [<a href="https://github.com/doxygen/doxygen/commit/b59edd279f887e55b162ae1b1c7bce4b2ca29dab">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5584">5584</a> - Spurious ASSERT message [<a href="https://github.com/doxygen/doxygen/commit/fff03ab9adcbdf480929c6a10975cab469eaf17c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5585">5585</a> - Broken man pages due to bad use of autoBreak [<a href="https://github.com/doxygen/doxygen/commit/6aa7f36ce924cf9dc59a951e5727b17c37d0345e">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5586">5586</a> - Fix potential copy and paste issue in vhdlparser/VhdlParser.cc [<a href="https://github.com/doxygen/doxygen/commit/9238e342bc8f1ce3e0aaa2944d77c33e4363cf48">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5587">5587</a> - [Patch] Documentation: Wrong link for \\diafile [<a href="https://github.com/doxygen/doxygen/commit/285221e3d287db083b9377cb5633650fb2a783a1">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5588">5588</a> - [Patch] DocBook: Possible name clash for generated image files [<a href="https://github.com/doxygen/doxygen/commit/8b39158436b740a78166f947de375b5486441c93">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5589">5589</a> - RTF output: \\diafile and \\mscfile do not work [<a href="https://github.com/doxygen/doxygen/commit/7cd2b1f27a03846a8f9bcd1e4489cbfebf56bfa2">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5590">5590</a> - Windows: Process exit code is ignored for processes launched using ShellExecuteEx() [<a href="https://github.com/doxygen/doxygen/commit/68aa8c2bd8a5e6a8ad7c46c725c8bb5e61896ba0">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5593">5593</a> - Fix potential allocation of huge memory amount due to type overflow in src/lodepng.cpp [<a href="https://github.com/doxygen/doxygen/commit/30870ef90f4a74e7c53a6856b10bcd2f16e4d1bd">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5594">5594</a> - Fix missing unchecked return value in src/dot.cpp [<a href="https://github.com/doxygen/doxygen/commit/be0c23efcb902891e91bed42ab2ac27a6f1460cb">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5595">5595</a> - Fix potential null pointer dereference in src/dbusxmlscanner.cpp [<a href="https://github.com/doxygen/doxygen/commit/46e83b44be0c0aa97ead5ee52e329154c1fb47bc">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5596">5596</a> - Fix identical code for different branches in src/translator_tw.h [<a href="https://github.com/doxygen/doxygen/commit/79dedb65ae1f9306b83a69058dbd2015ef7c3b94">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5597">5597</a> - Fix potential null pointer dereference in src/index.cpp [<a href="https://github.com/doxygen/doxygen/commit/68c063cbffc38c1528dd86232a8b8642fae26b1b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5598">5598</a> - Remove not needed variable initialization in src/cite.cpp [<a href="https://github.com/doxygen/doxygen/commit/23bc555e5483baa6c1a3d0c1ad346bb37348b31b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5599">5599</a> - Remove not needed local variable in src/doxygen.cpp [<a href="https://github.com/doxygen/doxygen/commit/561a996c68f796dccb36fb3eed6150fcc90e5634">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5600">5600</a> - Remove redundant if/else branch in src/lodepng.cpp [<a href="https://github.com/doxygen/doxygen/commit/3026131de3126298863d1a68fe0c747524e26e43">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5601">5601</a> - Remove redundant if/else branch in src/translator_lt.h [<a href="https://github.com/doxygen/doxygen/commit/e7b9f1d16ea2043be068c448676e368e9239314e">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5602">5602</a> - Cleanup redundant if/else branch in src/translator_kr.h [<a href="https://github.com/doxygen/doxygen/commit/3d1343d1c8876d0eb0352eafafe4aa90bc483adf">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5603">5603</a> - Cleanup redundant if/else branch in src/translator_sr.h [<a href="https://github.com/doxygen/doxygen/commit/192aa6590b6ceb264335a5b8a1aed6b6f8b0f350">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5604">5604</a> - Cleanup redundant if/else branch in src/translator_tw.h [<a href="https://github.com/doxygen/doxygen/commit/02b35985cda1a537c45071f1245b2c4a6dc4ffc6">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5605">5605</a> - Cleanup redundant if/else branch in src/translator_vi.h [<a href="https://github.com/doxygen/doxygen/commit/8e47b4bc5084cb00e5bdcdaa4c1bd048b48a4999">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5606">5606</a> - Remove redundant local variable initialization in qtools/qstring.cpp [<a href="https://github.com/doxygen/doxygen/commit/4afe088327ae6780c9c8a73b7b2d3994005f6cca">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5607">5607</a> - Fix wrong member variable initialization in src/define.cpp [<a href="https://github.com/doxygen/doxygen/commit/33daf7a7d9ab9b6c5454acd7a3cff7923d1c4c14">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5611">5611</a> - Fix potential null pointer dereference in src/util.cpp [<a href="https://github.com/doxygen/doxygen/commit/24b5b715929759a7836a3813ef93976b7cc10641">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5612">5612</a> - Fix another potential null pointer dereference in src/util.cpp [<a href="https://github.com/doxygen/doxygen/commit/bc95beac3eca3cda55430e0cde97ba826d3d7400">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5613">5613</a> - Fix a potential null pointer dereference in src/index.cpp [<a href="https://github.com/doxygen/doxygen/commit/c22be34fb79588fa04a9cf9c86438c8eb00d81fc">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5614">5614</a> - Fix a potential null pointer dereference in src/vhdldocgen.cpp [<a href="https://github.com/doxygen/doxygen/commit/7a22d83a1f9665863201ff0e717071e9b7d3a110">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5632">5632</a> - Member functions omitted from tagfile [<a href="https://github.com/doxygen/doxygen/commit/b9ad9a03cf4febeb2aa10ddca22c1c9296c5223b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5643">5643</a> - Java: Annotations with brackets prevent documentation [<a href="https://github.com/doxygen/doxygen/commit/e446e2e044d674ba3609619e3dd95eb340f15e09">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5647">5647</a> - Invalid element name in footer part when GENERATE_TREEVIEW specified [<a href="https://github.com/doxygen/doxygen/commit/5cb961284e89f197406170389e8866bb9c94fe3a">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5649">5649</a> - Fortran attribute contiguous not identified [<a href="https://github.com/doxygen/doxygen/commit/6da2e3fb28f6ed9f219c66d165ac4467fda36148">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5652">5652</a> - Entity references in XML command attributes are incorrectly handled [<a href="https://github.com/doxygen/doxygen/commit/553a7bf7e1b7be2f602e0230ddfc7f882b009cf8">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5653">5653</a> - Entity references in XML code command are incorrectly handled [<a href="https://github.com/doxygen/doxygen/commit/30216574cb189a92f27bb0e701ff31aa8cce6b83">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5656">5656</a> - latex: dead links to source code [<a href="https://github.com/doxygen/doxygen/commit/b68a4abcfa22e68fd94487a8f2b48588eda5a1af">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5657">5657</a> - &hellip; is replaced by \cdots rather than \dots in the LaTeX output [<a href="https://github.com/doxygen/doxygen/commit/9ac31f84bd25d320f861e9e194fe5df49f4b212b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5664">5664</a> - Python xml not outputting info of functions inside __init__.py [<a href="https://github.com/doxygen/doxygen/commit/d13908f65b6e745bab14dc610c9f9bc7908c55c5">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5665">5665</a> - Python xml - argsstring is empty, while HTML have arguments [<a href="https://github.com/doxygen/doxygen/commit/89eb624fec44c0f900d9035dfea950ceaf0ba76d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5667">5667</a> - Invalid warning about undocumented C++ function imported from tagfile [<a href="https://github.com/doxygen/doxygen/commit/f1c96033bcea28e3ff4528299459b39488831669">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5668">5668</a> - C++11 scoped enums with same name inside different classes are merged if using tagfile [<a href="https://github.com/doxygen/doxygen/commit/b4fd6ac51fad4f20116194816d4802f616739d1f">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5669">5669</a> - Cannot make explicit links to C++ const member functions [<a href="https://github.com/doxygen/doxygen/commit/ad5dfc39bee7a1b3de16f36bc3a20565aa6438fe">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5670">5670</a> - Cannot make unscoped link to C++ conversion operator [<a href="https://github.com/doxygen/doxygen/commit/9f477b87fc492221e1b7109d197fe468cd0ed23d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5671">5671</a> - Using "doxygen.css" for HTML_EXTRA_STYLESHEET fails silently [<a href="https://github.com/doxygen/doxygen/commit/5e962c90d3270612df7363e7cf6bf42646c94fbe">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5674">5674</a> - Regression: Base classes incorrect when using CRTP with default template parameter [<a href="https://github.com/doxygen/doxygen/commit/200b828ead9f6bb5b2f6f99919837d5828a250e4">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5678">5678</a> - Full scope needed when making link inside cross-referenced section [<a href="https://github.com/doxygen/doxygen/commit/c6e41226574c94a869ad0757b53027562ef189e1">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5678">5678</a> - Full scope needed when making link inside cross-referenced section (fixed regression) [<a href="https://github.com/doxygen/doxygen/commit/60abada8b95cc1772996a264065904f408ed32ff">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5680">5680</a> - invalid copydoc target does not result in warning [<a href="https://github.com/doxygen/doxygen/commit/738c0dd829b6e3ae74359a8d92d12b491fa71d1b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5686">5686</a> - Latex to PDF hangs when using Markdown tables [<a href="https://github.com/doxygen/doxygen/commit/089771b5f3c3c3984ae6f352125a001788a62d29">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5690">5690</a> - Crash when building gtkmm documentation [<a href="https://github.com/doxygen/doxygen/commit/050fce2b73d6e4455808ab86da2fddcf2f26e9b5">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5694">5694</a> - \cite confused by labels ending with a dot (improved warning message) [<a href="https://github.com/doxygen/doxygen/commit/78fd02dc41384d81baddf17ff0bb3431267452fc">view</a>]</li> +<li>fix docbook output [<a href="https://github.com/doxygen/doxygen/commit/1a403d80160458091bab7c442e54f836c0b90bca">view</a>] <ol><li>support other than english</li> <li>fix broken example link id</li> <li>fix incomplete TOC : no Classe etc.</li> @@ -783,89 +1184,88 @@ <li>Comply with REPEAT_BRIEF </li> <li>Do not output duplicated contents when detailed description is missing.</li> <li>set table colwidth for Param/RetVal</li> - </ol> -</li> -<li>Add missing escape in doxysearch.cpp when result contained a double quote [<a href="http://github.com/doxygen/doxygen/commit/08c9689157d7edc5d8e3369ef96f2ccd4b01c10c">view</a>]</li> -<li>Add source code possibility for RTF output [<a href="http://github.com/doxygen/doxygen/commit/05eb230757f6510d461bd14df3b190da46edd9dc">view</a>]</li> -<li>Added Coverity Scan Build Status to Readme [<a href="http://github.com/doxygen/doxygen/commit/394acb6a10dbef10cad3a0a3ff50a05d0efdea9e">view</a>]</li> -<li>Added clearer range checks for string class to help compiler [<a href="http://github.com/doxygen/doxygen/commit/869ff34828e20e3ec318384d7b0dbf91b6b2d24d">view</a>]</li> -<li>Added compilation support for MacOSX 10.10 (yosemite) [<a href="http://github.com/doxygen/doxygen/commit/151876a8321204bd2ec08ec6c4de38ba9fb2d034">view</a>]</li> -<li>Added faster reference counted string implementation with short string optimization [<a href="http://github.com/doxygen/doxygen/commit/9323ae470ad514586706dc8647501361fe208f36">view</a>]</li> -<li>Added graphical hierarchy support to template engine [<a href="http://github.com/doxygen/doxygen/commit/fe818bf8e3a154788a4a180068cfdfbbadd66ff6">view</a>]</li> -<li>Added guard to prevent (theoretical) out of bound access [<a href="http://github.com/doxygen/doxygen/commit/060a5cc121be5fd177b5d5c834f2b810dc58b9ec">view</a>]</li> -<li>Added language attribute to XML output for classes, namespaces, and files [<a href="http://github.com/doxygen/doxygen/commit/e986e0039de21791bd1fbb1f59b13f58c4a46324">view</a>]</li> -<li>Avoid a (theoretical) memory leak [<a href="http://github.com/doxygen/doxygen/commit/2937e44299a615628c27b0a0a7a95ffdf18249ef">view</a>]</li> -<li>Better handling of inline Fortran parameter documentation [<a href="http://github.com/doxygen/doxygen/commit/d5546cff5c82157f2dfddd0e1c4fdeeee8e501dd">view</a>]</li> -<li>Fixed bug for page numbers in the latex indices [<a href="http://github.com/doxygen/doxygen/commit/37ea04c317f9e1e8a09e5944b8c6c2c2ef35b1f6">view</a>]</li> -<li>Compilation fixes for Windows for new string implementation. [<a href="http://github.com/doxygen/doxygen/commit/a31c9fffec6b5145ac8509d77da826d2e196ed1e">view</a>]</li> -<li>Convert FORTRAN modules to namespaces [<a href="http://github.com/doxygen/doxygen/commit/be933bfacadaca98aaf4713746201b1fc21177de">view</a>]</li> -<li>Create an easy possibility to take a snippet from the current file. [<a href="http://github.com/doxygen/doxygen/commit/f8ceac63bdb52cf395207258c98ff0bcba35870a">view</a>]</li> -<li>Debian Bug 762272: segfault with cyclic subgroups [<a href="http://github.com/doxygen/doxygen/commit/c83db38ea83499be19d9ff242bfa22ae534ee80c">view</a>]</li> -<li>Disabled enter/exit printing for doctokenizer (produced too much noise) [<a href="http://github.com/doxygen/doxygen/commit/0b615342f0a24fbf02cc9fa94550cf34d230425b">view</a>]</li> -<li>Empty entry in \tableofcontents in case e.g. section without description. [<a href="http://github.com/doxygen/doxygen/commit/d2acdcf3b1bbd4d3079cf6c4ff5de6ba6716fd06">view</a>]</li> -<li>Extra empty line in source fragments [<a href="http://github.com/doxygen/doxygen/commit/79b40a437092bccb6589cdb29c0059a4797b771d">view</a>]</li> -<li>Fix bug with C++11 static_assert [<a href="http://github.com/doxygen/doxygen/commit/7c257bb57562b015b094f109851d914ef232ae2a">view</a>]</li> -<li>Fix bug: language switch command "\~" failed to detect language id which contains '-' [<a href="http://github.com/doxygen/doxygen/commit/a4cf65dea1371721f07c63c2bb5f9e5085b2618a">view</a>]</li> -<li>Fix for https://bugzilla.gnome.org/show_bug.cgi?id=651850 [<a href="http://github.com/doxygen/doxygen/commit/e1aa7af27eded7afdf81b688015421d3b3467b2b">view</a>]</li> -<li>Fix for the second issue in bz 651848 [<a href="http://github.com/doxygen/doxygen/commit/bcd3fbf59f9199470d51938486fecda05006da61">view</a>]</li> -<li>Fix potential crash when reading tag file which contained nested java classes using generics [<a href="http://github.com/doxygen/doxygen/commit/6d4044ad43ae1424a256eb1c26992301e7c64f4a">view</a>]</li> -<li>Fix rules for closing FORTRAN module and typedef scopes [<a href="http://github.com/doxygen/doxygen/commit/7ace28eb7bb5f42c3571e5b7be1ab954f4509e17">view</a>]</li> -<li>Fix to ignore the contents of \verbatim and friends while looking for sections [<a href="http://github.com/doxygen/doxygen/commit/cba0d89fafee3daef31469cbe1cdd24e68c7b56a">view</a>]</li> -<li>Fix to show relations between C#/Java generic classes [<a href="http://github.com/doxygen/doxygen/commit/9879fddbf8f91c57b258b8e788b5ed8a150a8331">view</a>]</li> -<li>Fixed a number of issues (resource leaks, uninitialized members, etc) found by coverity [<a href="http://github.com/doxygen/doxygen/commit/41887832b90698df95e8d222cdc0a541ae2f2284">view</a>]</li> -<li>Fixed bug in new QCString::sprintf for long string. [<a href="http://github.com/doxygen/doxygen/commit/0ec56b7aa2dd39e3cab71c2229d486161566e7f6">view</a>]</li> -<li>Fixed extension matching issue if path contained a dot. [<a href="http://github.com/doxygen/doxygen/commit/79ed06502c3abca083f2e231f09fc8101862fcf6">view</a>]</li> -<li>Fixed issue accessing uninitialized data when combining RTF output. [<a href="http://github.com/doxygen/doxygen/commit/e5076edf2c103d262a9e32d57fb40cfe210c9ddf">view</a>]</li> -<li>Fixed issue parsing @end directly followed by the end of the file [<a href="http://github.com/doxygen/doxygen/commit/fa239ea9a3bba27e4fff84629883ee400f674c1e">view</a>]</li> -<li>Fixed problem finding \enduml when using /// style comments. [<a href="http://github.com/doxygen/doxygen/commit/4df52916170bb81179697d0fa78c7d81fd95415f">view</a>]</li> -<li>Fixed refcounting bug in new string implementation [<a href="http://github.com/doxygen/doxygen/commit/a9dcbfe28625673f4d13bc5b3cde694c24062e19">view</a>]</li> -<li>Fixed several Coverity warnings [<a href="http://github.com/doxygen/doxygen/commit/9b7e4ffb6c5f7534e4ba11d5798b4eb74d4a2a70">view</a>]</li> -<li>Fixed to small memory leaks [<a href="http://github.com/doxygen/doxygen/commit/b55a5c91d49359f9bbf7c78d9f284be2092bcfaa">view</a>]</li> -<li>Fixed typos and formatting in Doxyfile (thanks to Armin Mueller) [<a href="http://github.com/doxygen/doxygen/commit/fdd1c3f1527b15f6b0a25c2d99748f6a8adc5fcf">view</a>]</li> -<li>Fixed typos in C/C++ comments. There are no functional changes. [<a href="http://github.com/doxygen/doxygen/commit/458fb1738f4e59586460daa2a1e3ad2e730306c4">view</a>]</li> -<li>Fixed typos in comments. [<a href="http://github.com/doxygen/doxygen/commit/8ff67ad01abfe97b43de0ef1799c8b798d725ab9">view</a>]</li> -<li>Fixed typos in comments. No functional changes. [<a href="http://github.com/doxygen/doxygen/commit/6920d3ec6db21cec32086249a48875cbac957470">view</a>]</li> -<li>Fortran code color END (regression pull request 259) [<a href="http://github.com/doxygen/doxygen/commit/0ccda478e35eb420d644b6c39923f9c020e69c13">view</a>]</li> -<li>Fortran color CALL as keyword [<a href="http://github.com/doxygen/doxygen/commit/d3a5f96d07db323ff97fb07766a809769506ef3a">view</a>]</li> -<li>Fortran color code of END [<a href="http://github.com/doxygen/doxygen/commit/1cfa914cbb4e41f15af1f08517af887d6b241f28">view</a>]</li> -<li>Fortran continuation character seen as begin of function call [<a href="http://github.com/doxygen/doxygen/commit/b2e9aa362540cae4487e48598fb7e80b8651752f">view</a>]</li> -<li>Generate error message in case bibtex generation fails [<a href="http://github.com/doxygen/doxygen/commit/f121923bde72ef68616224a3fa1c1fe27eeb385e">view</a>]</li> -<li>Improved main page rendering via template engine [<a href="http://github.com/doxygen/doxygen/commit/f8a86910e4cd1d98993bd6991eb1b1aff7a86b05">view</a>]</li> -<li>Initialized potentially uninitialized variable in markdown part [<a href="http://github.com/doxygen/doxygen/commit/c98afa68350ed5cbce5a24bee3b47069789cc411">view</a>]</li> -<li>Introduce new optimized string implementation (attempt 2) [<a href="http://github.com/doxygen/doxygen/commit/43edc14cd357dcb070402bccc5030507570c22a4">view</a>]</li> -<li>Introduced template directory for template and resource files and resource compiler & manager [<a href="http://github.com/doxygen/doxygen/commit/0fea3d4ca57187f271d7580ff16f32b7ab4657df">view</a>]</li> -<li>LaTeX problem with 2 consecutive single quotes [<a href="http://github.com/doxygen/doxygen/commit/0cb39b4cf9f1e89720cb19f58158b90ecf0b75ef">view</a>]</li> -<li>Last comment of \code{.f90} missing [<a href="http://github.com/doxygen/doxygen/commit/b9145da402cd49c4c4e888a31dc17612387b1321">view</a>]</li> -<li>Limit images sizes and make more uniform (LaTeX) [<a href="http://github.com/doxygen/doxygen/commit/329a4ddc036ac9dfe72b11d62cb4043bc8488c20">view</a>]</li> -<li>Package mathptmx gives discrepancy between pdf and HTML formulas [<a href="http://github.com/doxygen/doxygen/commit/418d7f076ffbb1aeaae5f689a5dd46977c456a98">view</a>]</li> -<li>Portuguese and Brazilian Portuguese translators updated to 1.8.5. [<a href="http://github.com/doxygen/doxygen/commit/7da215a553e19783de60341bd863264ea9393513">view</a>]</li> -<li>Prevent overly long terms from stopping the search indexer [<a href="http://github.com/doxygen/doxygen/commit/5d266c5d7f7b05dcfa8d3485bc43e268dd8fe90a">view</a>]</li> -<li>Problem in case of line termination (., a dot) direct after the \cite command [<a href="http://github.com/doxygen/doxygen/commit/f0338dbf3a8770a6120eab83b338e6e3c3427a0e">view</a>]</li> -<li>Regression class<T extends V> resulted in class<V> as the page title [<a href="http://github.com/doxygen/doxygen/commit/dec53d22986c8d2c44a30806a2c8ed03bbe24768">view</a>]</li> -<li>Remove bogus argument to avoid compiler warning [<a href="http://github.com/doxygen/doxygen/commit/5bebcfb4a077287c561d2be7b3510d13d4e44a55">view</a>]</li> -<li>Remove dependency of PlantUML on HAVE_DOT [<a href="http://github.com/doxygen/doxygen/commit/352bac2c21b69d4e33ec0056fe4d2b96fbe1b0b5">view</a>]</li> -<li>Remove extraneous 'README' to allow successful RPM creation [<a href="http://github.com/doxygen/doxygen/commit/fefce473f5cde9fe4db3a86544db2ba41eec8d74">view</a>]</li> -<li>Remove filtering rule when generating FORTRAN module links [<a href="http://github.com/doxygen/doxygen/commit/238b73322f87614f5753dc0fa6df6c450f81be5e">view</a>]</li> -<li>Remove redundant code [<a href="http://github.com/doxygen/doxygen/commit/d1ed20c4c9a04f7995b82f8628908e3c34fd054a">view</a>]</li> -<li>Removed bash specific construct from ./configure script to make it work on Solaris [<a href="http://github.com/doxygen/doxygen/commit/3ebc431569aa6566389f3f3fc00aae7b8a90e58b">view</a>]</li> -<li>Removed some comment statements. [<a href="http://github.com/doxygen/doxygen/commit/222753a906d42dab63708e074dd289e66dccf091">view</a>]</li> -<li>Revert "Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634763">634763</a> - Fortran: external subroutine as dummy argument not recognized" [<a href="http://github.com/doxygen/doxygen/commit/8c8120bc3efa6ffa74f5e8cfce9cd6e4cae3de3a">view</a>]</li> -<li>Reverted back to old string implementation. New one needs more work. [<a href="http://github.com/doxygen/doxygen/commit/7d933a9f99dacb83937534719103218470e2a5ab">view</a>]</li> -<li>Show tag file name instead of <unknown> for warnings pointing to symbols extracted from tag files. [<a href="http://github.com/doxygen/doxygen/commit/b4b4c9decfacdf77d58490fa2dd81e1e10fe2dd0">view</a>]</li> -<li>Show the parent-child type specialization relation in Java/C# generics inheritance diagrams [<a href="http://github.com/doxygen/doxygen/commit/7ee743004ac80914bdb66e3c7a8e5c39c0d5bf4a">view</a>]</li> -<li>Support charset option for PlantUML [<a href="http://github.com/doxygen/doxygen/commit/ed0da5fe85e17eb0f7071fff12e851e92c2d79e6">view</a>]</li> -<li>Support for INLINE_SOURCES in Fortran [<a href="http://github.com/doxygen/doxygen/commit/940a802a997609105e5be25f6ff576628a51fbda">view</a>]</li> -<li>Support plantuml !include statement [<a href="http://github.com/doxygen/doxygen/commit/bbb6bb217a2feb7b9b961037072f06ff1024a0ef">view</a>]</li> -<li>Support visible=no for main page tab. [<a href="http://github.com/doxygen/doxygen/commit/52df7ae7fb9ed9765b0faf922c69a1c57a5cfd69">view</a>]</li> -<li>Supporting linking for methods bound to FORTRAN classes in source definitions [<a href="http://github.com/doxygen/doxygen/commit/f704342b42b19a857ec42438542221836576287a">view</a>]</li> -<li>This is the patch attached to bz 651848 by Robin Gareus. [<a href="http://github.com/doxygen/doxygen/commit/f854e1d9f1a60a7e254dcc20a4e6db0aa9172b2c">view</a>]</li> -<li>Update README.md [<a href="http://github.com/doxygen/doxygen/commit/b3c44e52cf7226b16ebd576ad381c3ee343dfd7e">view</a>]</li> -<li>Updated configuration script and libdoxygen.pro.in to use llvm-config [<a href="http://github.com/doxygen/doxygen/commit/61e07f8ea2d0d2a2f001b1f657d3d5bbe44e7690">view</a>]</li> -<li>Use result of vsnprintf [<a href="http://github.com/doxygen/doxygen/commit/84a6f4155659f97d42290494bd21d51f55eda258">view</a>]</li> -<li>Use substitute() instead of QString conversion [<a href="http://github.com/doxygen/doxygen/commit/7a0f5e6d565db6192f8c22045d7988a0b4e4d8c3">view</a>]</li> -<li>Various VHDL fixes [<a href="http://github.com/doxygen/doxygen/commit/475b0c51847271b04cb0e58254bd7e420445250b">view</a>]</li> -<li>various fixes and restructuring [<a href="http://github.com/doxygen/doxygen/commit/223e7de6478019c8eebcfd87085fe22d3bfeec0e">view</a>]</li> -<li>Various latex problems [<a href="http://github.com/doxygen/doxygen/commit/fb4dad1e1d9774e92d1509d1c2d3f8cb341826a1">view</a>]</li> + </ol> </li> +<li>Add missing escape in doxysearch.cpp when result contained a double quote [<a href="https://github.com/doxygen/doxygen/commit/08c9689157d7edc5d8e3369ef96f2ccd4b01c10c">view</a>]</li> +<li>Add source code possibility for RTF output [<a href="https://github.com/doxygen/doxygen/commit/05eb230757f6510d461bd14df3b190da46edd9dc">view</a>]</li> +<li>Added Coverity Scan Build Status to Readme [<a href="https://github.com/doxygen/doxygen/commit/394acb6a10dbef10cad3a0a3ff50a05d0efdea9e">view</a>]</li> +<li>Added clearer range checks for string class to help compiler [<a href="https://github.com/doxygen/doxygen/commit/869ff34828e20e3ec318384d7b0dbf91b6b2d24d">view</a>]</li> +<li>Added compilation support for MacOSX 10.10 (yosemite) [<a href="https://github.com/doxygen/doxygen/commit/151876a8321204bd2ec08ec6c4de38ba9fb2d034">view</a>]</li> +<li>Added faster reference counted string implementation with short string optimization [<a href="https://github.com/doxygen/doxygen/commit/9323ae470ad514586706dc8647501361fe208f36">view</a>]</li> +<li>Added graphical hierarchy support to template engine [<a href="https://github.com/doxygen/doxygen/commit/fe818bf8e3a154788a4a180068cfdfbbadd66ff6">view</a>]</li> +<li>Added guard to prevent (theoretical) out of bound access [<a href="https://github.com/doxygen/doxygen/commit/060a5cc121be5fd177b5d5c834f2b810dc58b9ec">view</a>]</li> +<li>Added language attribute to XML output for classes, namespaces, and files [<a href="https://github.com/doxygen/doxygen/commit/e986e0039de21791bd1fbb1f59b13f58c4a46324">view</a>]</li> +<li>Avoid a (theoretical) memory leak [<a href="https://github.com/doxygen/doxygen/commit/2937e44299a615628c27b0a0a7a95ffdf18249ef">view</a>]</li> +<li>Better handling of inline Fortran parameter documentation [<a href="https://github.com/doxygen/doxygen/commit/d5546cff5c82157f2dfddd0e1c4fdeeee8e501dd">view</a>]</li> +<li>Fixed bug for page numbers in the latex indices [<a href="https://github.com/doxygen/doxygen/commit/37ea04c317f9e1e8a09e5944b8c6c2c2ef35b1f6">view</a>]</li> +<li>Compilation fixes for Windows for new string implementation. [<a href="https://github.com/doxygen/doxygen/commit/a31c9fffec6b5145ac8509d77da826d2e196ed1e">view</a>]</li> +<li>Convert FORTRAN modules to namespaces [<a href="https://github.com/doxygen/doxygen/commit/be933bfacadaca98aaf4713746201b1fc21177de">view</a>]</li> +<li>Create an easy possibility to take a snippet from the current file. [<a href="https://github.com/doxygen/doxygen/commit/f8ceac63bdb52cf395207258c98ff0bcba35870a">view</a>]</li> +<li>Debian Bug 762272: segfault with cyclic subgroups [<a href="https://github.com/doxygen/doxygen/commit/c83db38ea83499be19d9ff242bfa22ae534ee80c">view</a>]</li> +<li>Disabled enter/exit printing for doctokenizer (produced too much noise) [<a href="https://github.com/doxygen/doxygen/commit/0b615342f0a24fbf02cc9fa94550cf34d230425b">view</a>]</li> +<li>Empty entry in \tableofcontents in case e.g. section without description. [<a href="https://github.com/doxygen/doxygen/commit/d2acdcf3b1bbd4d3079cf6c4ff5de6ba6716fd06">view</a>]</li> +<li>Extra empty line in source fragments [<a href="https://github.com/doxygen/doxygen/commit/79b40a437092bccb6589cdb29c0059a4797b771d">view</a>]</li> +<li>Fix bug with C++11 static_assert [<a href="https://github.com/doxygen/doxygen/commit/7c257bb57562b015b094f109851d914ef232ae2a">view</a>]</li> +<li>Fix bug: language switch command "\~" failed to detect language id which contains '-' [<a href="https://github.com/doxygen/doxygen/commit/a4cf65dea1371721f07c63c2bb5f9e5085b2618a">view</a>]</li> +<li>Fix for <a href="https://github.com/doxygen/doxygen/issues/4285">4285</a> [<a href="https://github.com/doxygen/doxygen/commit/e1aa7af27eded7afdf81b688015421d3b3467b2b">view</a>]</li> +<li>Fix for the second issue in bz 651848 [<a href="https://github.com/doxygen/doxygen/commit/bcd3fbf59f9199470d51938486fecda05006da61">view</a>]</li> +<li>Fix potential crash when reading tag file which contained nested java classes using generics [<a href="https://github.com/doxygen/doxygen/commit/6d4044ad43ae1424a256eb1c26992301e7c64f4a">view</a>]</li> +<li>Fix rules for closing FORTRAN module and typedef scopes [<a href="https://github.com/doxygen/doxygen/commit/7ace28eb7bb5f42c3571e5b7be1ab954f4509e17">view</a>]</li> +<li>Fix to ignore the contents of \verbatim and friends while looking for sections [<a href="https://github.com/doxygen/doxygen/commit/cba0d89fafee3daef31469cbe1cdd24e68c7b56a">view</a>]</li> +<li>Fix to show relations between C#/Java generic classes [<a href="https://github.com/doxygen/doxygen/commit/9879fddbf8f91c57b258b8e788b5ed8a150a8331">view</a>]</li> +<li>Fixed a number of issues (resource leaks, uninitialized members, etc) found by coverity [<a href="https://github.com/doxygen/doxygen/commit/41887832b90698df95e8d222cdc0a541ae2f2284">view</a>]</li> +<li>Fixed bug in new QCString::sprintf for long string. [<a href="https://github.com/doxygen/doxygen/commit/0ec56b7aa2dd39e3cab71c2229d486161566e7f6">view</a>]</li> +<li>Fixed extension matching issue if path contained a dot. [<a href="https://github.com/doxygen/doxygen/commit/79ed06502c3abca083f2e231f09fc8101862fcf6">view</a>]</li> +<li>Fixed issue accessing uninitialized data when combining RTF output. [<a href="https://github.com/doxygen/doxygen/commit/e5076edf2c103d262a9e32d57fb40cfe210c9ddf">view</a>]</li> +<li>Fixed issue parsing @end directly followed by the end of the file [<a href="https://github.com/doxygen/doxygen/commit/fa239ea9a3bba27e4fff84629883ee400f674c1e">view</a>]</li> +<li>Fixed problem finding \enduml when using /// style comments. [<a href="https://github.com/doxygen/doxygen/commit/4df52916170bb81179697d0fa78c7d81fd95415f">view</a>]</li> +<li>Fixed refcounting bug in new string implementation [<a href="https://github.com/doxygen/doxygen/commit/a9dcbfe28625673f4d13bc5b3cde694c24062e19">view</a>]</li> +<li>Fixed several Coverity warnings [<a href="https://github.com/doxygen/doxygen/commit/9b7e4ffb6c5f7534e4ba11d5798b4eb74d4a2a70">view</a>]</li> +<li>Fixed to small memory leaks [<a href="https://github.com/doxygen/doxygen/commit/b55a5c91d49359f9bbf7c78d9f284be2092bcfaa">view</a>]</li> +<li>Fixed typos and formatting in Doxyfile (thanks to Armin Mueller) [<a href="https://github.com/doxygen/doxygen/commit/fdd1c3f1527b15f6b0a25c2d99748f6a8adc5fcf">view</a>]</li> +<li>Fixed typos in C/C++ comments. There are no functional changes. [<a href="https://github.com/doxygen/doxygen/commit/458fb1738f4e59586460daa2a1e3ad2e730306c4">view</a>]</li> +<li>Fixed typos in comments. [<a href="https://github.com/doxygen/doxygen/commit/8ff67ad01abfe97b43de0ef1799c8b798d725ab9">view</a>]</li> +<li>Fixed typos in comments. No functional changes. [<a href="https://github.com/doxygen/doxygen/commit/6920d3ec6db21cec32086249a48875cbac957470">view</a>]</li> +<li>Fortran code color END (regression pull request 259) [<a href="https://github.com/doxygen/doxygen/commit/0ccda478e35eb420d644b6c39923f9c020e69c13">view</a>]</li> +<li>Fortran color CALL as keyword [<a href="https://github.com/doxygen/doxygen/commit/d3a5f96d07db323ff97fb07766a809769506ef3a">view</a>]</li> +<li>Fortran color code of END [<a href="https://github.com/doxygen/doxygen/commit/1cfa914cbb4e41f15af1f08517af887d6b241f28">view</a>]</li> +<li>Fortran continuation character seen as begin of function call [<a href="https://github.com/doxygen/doxygen/commit/b2e9aa362540cae4487e48598fb7e80b8651752f">view</a>]</li> +<li>Generate error message in case bibtex generation fails [<a href="https://github.com/doxygen/doxygen/commit/f121923bde72ef68616224a3fa1c1fe27eeb385e">view</a>]</li> +<li>Improved main page rendering via template engine [<a href="https://github.com/doxygen/doxygen/commit/f8a86910e4cd1d98993bd6991eb1b1aff7a86b05">view</a>]</li> +<li>Initialized potentially uninitialized variable in markdown part [<a href="https://github.com/doxygen/doxygen/commit/c98afa68350ed5cbce5a24bee3b47069789cc411">view</a>]</li> +<li>Introduce new optimized string implementation (attempt 2) [<a href="https://github.com/doxygen/doxygen/commit/43edc14cd357dcb070402bccc5030507570c22a4">view</a>]</li> +<li>Introduced template directory for template and resource files and resource compiler & manager [<a href="https://github.com/doxygen/doxygen/commit/0fea3d4ca57187f271d7580ff16f32b7ab4657df">view</a>]</li> +<li>LaTeX problem with 2 consecutive single quotes [<a href="https://github.com/doxygen/doxygen/commit/0cb39b4cf9f1e89720cb19f58158b90ecf0b75ef">view</a>]</li> +<li>Last comment of \code{.f90} missing [<a href="https://github.com/doxygen/doxygen/commit/b9145da402cd49c4c4e888a31dc17612387b1321">view</a>]</li> +<li>Limit images sizes and make more uniform (LaTeX) [<a href="https://github.com/doxygen/doxygen/commit/329a4ddc036ac9dfe72b11d62cb4043bc8488c20">view</a>]</li> +<li>Package mathptmx gives discrepancy between pdf and HTML formulas [<a href="https://github.com/doxygen/doxygen/commit/418d7f076ffbb1aeaae5f689a5dd46977c456a98">view</a>]</li> +<li>Portuguese and Brazilian Portuguese translators updated to 1.8.5. [<a href="https://github.com/doxygen/doxygen/commit/7da215a553e19783de60341bd863264ea9393513">view</a>]</li> +<li>Prevent overly long terms from stopping the search indexer [<a href="https://github.com/doxygen/doxygen/commit/5d266c5d7f7b05dcfa8d3485bc43e268dd8fe90a">view</a>]</li> +<li>Problem in case of line termination (., a dot) direct after the \cite command [<a href="https://github.com/doxygen/doxygen/commit/f0338dbf3a8770a6120eab83b338e6e3c3427a0e">view</a>]</li> +<li>Regression class<T extends V> resulted in class<V> as the page title [<a href="https://github.com/doxygen/doxygen/commit/dec53d22986c8d2c44a30806a2c8ed03bbe24768">view</a>]</li> +<li>Remove bogus argument to avoid compiler warning [<a href="https://github.com/doxygen/doxygen/commit/5bebcfb4a077287c561d2be7b3510d13d4e44a55">view</a>]</li> +<li>Remove dependency of PlantUML on HAVE_DOT [<a href="https://github.com/doxygen/doxygen/commit/352bac2c21b69d4e33ec0056fe4d2b96fbe1b0b5">view</a>]</li> +<li>Remove extraneous 'README' to allow successful RPM creation [<a href="https://github.com/doxygen/doxygen/commit/fefce473f5cde9fe4db3a86544db2ba41eec8d74">view</a>]</li> +<li>Remove filtering rule when generating FORTRAN module links [<a href="https://github.com/doxygen/doxygen/commit/238b73322f87614f5753dc0fa6df6c450f81be5e">view</a>]</li> +<li>Remove redundant code [<a href="https://github.com/doxygen/doxygen/commit/d1ed20c4c9a04f7995b82f8628908e3c34fd054a">view</a>]</li> +<li>Removed bash specific construct from ./configure script to make it work on Solaris [<a href="https://github.com/doxygen/doxygen/commit/3ebc431569aa6566389f3f3fc00aae7b8a90e58b">view</a>]</li> +<li>Removed some comment statements. [<a href="https://github.com/doxygen/doxygen/commit/222753a906d42dab63708e074dd289e66dccf091">view</a>]</li> +<li>Revert "Bug <a href="https://github.com/doxygen/doxygen/issues/4011">4011</a> - Fortran: external subroutine as dummy argument not recognized" [<a href="https://github.com/doxygen/doxygen/commit/8c8120bc3efa6ffa74f5e8cfce9cd6e4cae3de3a">view</a>]</li> +<li>Reverted back to old string implementation. New one needs more work. [<a href="https://github.com/doxygen/doxygen/commit/7d933a9f99dacb83937534719103218470e2a5ab">view</a>]</li> +<li>Show tag file name instead of <unknown> for warnings pointing to symbols extracted from tag files. [<a href="https://github.com/doxygen/doxygen/commit/b4b4c9decfacdf77d58490fa2dd81e1e10fe2dd0">view</a>]</li> +<li>Show the parent-child type specialization relation in Java/C# generics inheritance diagrams [<a href="https://github.com/doxygen/doxygen/commit/7ee743004ac80914bdb66e3c7a8e5c39c0d5bf4a">view</a>]</li> +<li>Support charset option for PlantUML [<a href="https://github.com/doxygen/doxygen/commit/ed0da5fe85e17eb0f7071fff12e851e92c2d79e6">view</a>]</li> +<li>Support for INLINE_SOURCES in Fortran [<a href="https://github.com/doxygen/doxygen/commit/940a802a997609105e5be25f6ff576628a51fbda">view</a>]</li> +<li>Support plantuml !include statement [<a href="https://github.com/doxygen/doxygen/commit/bbb6bb217a2feb7b9b961037072f06ff1024a0ef">view</a>]</li> +<li>Support visible=no for main page tab. [<a href="https://github.com/doxygen/doxygen/commit/52df7ae7fb9ed9765b0faf922c69a1c57a5cfd69">view</a>]</li> +<li>Supporting linking for methods bound to FORTRAN classes in source definitions [<a href="https://github.com/doxygen/doxygen/commit/f704342b42b19a857ec42438542221836576287a">view</a>]</li> +<li>This is the patch attached to bz 651848 by Robin Gareus. [<a href="https://github.com/doxygen/doxygen/commit/f854e1d9f1a60a7e254dcc20a4e6db0aa9172b2c">view</a>]</li> +<li>Update README.md [<a href="https://github.com/doxygen/doxygen/commit/b3c44e52cf7226b16ebd576ad381c3ee343dfd7e">view</a>]</li> +<li>Updated configuration script and libdoxygen.pro.in to use llvm-config [<a href="https://github.com/doxygen/doxygen/commit/61e07f8ea2d0d2a2f001b1f657d3d5bbe44e7690">view</a>]</li> +<li>Use result of vsnprintf [<a href="https://github.com/doxygen/doxygen/commit/84a6f4155659f97d42290494bd21d51f55eda258">view</a>]</li> +<li>Use substitute() instead of QString conversion [<a href="https://github.com/doxygen/doxygen/commit/7a0f5e6d565db6192f8c22045d7988a0b4e4d8c3">view</a>]</li> +<li>Various VHDL fixes [<a href="https://github.com/doxygen/doxygen/commit/475b0c51847271b04cb0e58254bd7e420445250b">view</a>]</li> +<li>various fixes and restructuring [<a href="https://github.com/doxygen/doxygen/commit/223e7de6478019c8eebcfd87085fe22d3bfeec0e">view</a>]</li> +<li>Various latex problems [<a href="https://github.com/doxygen/doxygen/commit/fb4dad1e1d9774e92d1509d1c2d3f8cb341826a1">view</a>]</li> </ul> <p> \endhtmlonly @@ -876,132 +1276,132 @@ </p> <h3>New features</h3> <ul> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731947">731947</a> - Support for PlantUML [<a href="http://github.com/doxygen/doxygen/commit/7506404e646f1fcc5a26ca6fca91a7f65154f05a">view</a>]</li> -<li>Add BREAD_CRUMB_TRAIL. [<a href="http://github.com/doxygen/doxygen/commit/4074da5b83d37dd1c72c5df015fb2b41e7725a7e">view</a>]</li> -</ul> -<h3>Bug fixes</h3> -<ul> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=172072">172072</a> $title doesn't work in LateX header [<a href="http://github.com/doxygen/doxygen/commit/790000b90944646702ddd3a183ec166669c18f51">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583958">583958</a> Class diagrams and class hierarchy don't work for java generic classes [<a href="http://github.com/doxygen/doxygen/commit/c3ddf3331239fb3f41e502a8337eee786ceaad06">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589707">589707</a> Flex .rule file for Visual Studio build can't cope with spaces in filenames [<a href="http://github.com/doxygen/doxygen/commit/eb3ab2452d8a1ef7a85af7a03e1622c12b40400b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623299">623299</a> Fortran: quotation after define causes error [<a href="http://github.com/doxygen/doxygen/commit/f083109de116ee2c6e2a31a15ebc17d2dff008e0">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625601">625601</a> FORTRAN: recognition free versus fixed formatted code [<a href="http://github.com/doxygen/doxygen/commit/476d79d31a0534c3d7d07001c47c1212a73d10a5">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700510">700510</a> Bibliography duplicate filenames fails [<a href="http://github.com/doxygen/doxygen/commit/7779bf6d6206bc0f78c22100034c44bfdb7f1bc1">view</a>] and - [<a href="http://github.com/doxygen/doxygen/commit/da029a3c893df22536cb3635e597fd3f5b2a4862">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702584">702584</a> \cite rejects valid BibTeX keys [<a href="http://github.com/doxygen/doxygen/commit/06170de4a166bfad9342f3b957dda82b7fb266b2">view</a>] and - [<a href="http://github.com/doxygen/doxygen/commit/69df2f9d1deb87b79c79f9ea1bf20380ff9b71ad">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705503">705503</a> TCL: Documentation of oo::define is not working [<a href="http://github.com/doxygen/doxygen/commit/5ec66c2286d7cedbdbb0930fe0e293b050c91d24">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=727732">727732</a> Nested C structures/unions does not work with groups [<a href="http://github.com/doxygen/doxygen/commit/f4388dc4a62e183b7ca4457eba7cb978a35804c2">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728654">728654</a> configuration stops with settings.h missing [<a href="http://github.com/doxygen/doxygen/commit/fd4b42ec54cb8d6faf2b0f16e580f376e8cf6982">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728740">728740</a> XML Output: Doxygen doesn't escape & characters (included in a hyperlink) in <detaileddescription> [<a href="http://github.com/doxygen/doxygen/commit/cfde6cdd600b21bba6a2eb0ca0e7e208e014ccaf">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729017">729017</a> function object in member initializer causes documentation loss [<a href="http://github.com/doxygen/doxygen/commit/f4f3e381dba1bc5d46feea3c39e8f076e27463d1">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729427">729427</a> [PATCH] Propagate configure's perl to makefiles [<a href="http://github.com/doxygen/doxygen/commit/f1a692b019a30f7aa07e0fb3e11402d262af8026">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730418">730418</a> man page extension is incorrect [<a href="http://github.com/doxygen/doxygen/commit/f25d896d4da9b44c23f89bfdd0379fa97ab2c351">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730520">730520</a> No documentation generated for method-less C++ struct [<a href="http://github.com/doxygen/doxygen/commit/21178ab40160abf011fa084a10892b5b7821e44c">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730887">730887</a> [PATCH] Fix potential copy and paste error in inputstring.cpp [<a href="http://github.com/doxygen/doxygen/commit/6f5748e822b009cbe82cc1df8eea43e4769bc44b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730888">730888</a> [PATCH] Fix missing '&' in Boolean operation in qstring.cpp [<a href="http://github.com/doxygen/doxygen/commit/27f1e1e9316addcfd0bbc3321b5614ed14f7a1a5">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731238">731238</a> Dead links in html documentation when using tabs for indentation in c++ [<a href="http://github.com/doxygen/doxygen/commit/2cc3b18da39bde323c5739483e507a133e93ac22">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731363">731363</a> Callgraphs for C# only generated for methods inside the same class [<a href="http://github.com/doxygen/doxygen/commit/7edbf2b2e705eccc0d99cce86149228473bc7f3e">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731985">731985</a> Variadic macros failing to expand if trailing ... is empty [<a href="http://github.com/doxygen/doxygen/commit/070c35549da108695074239be3ab4268f3722261">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=732594">732594</a> Two entries for a single member in doxygen XML [<a href="http://github.com/doxygen/doxygen/commit/ed8ce3cf405204916f9832e26797cb15d1490fd1">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=732768">732768</a> nested html tables cause pdflatex to hang (1.8.4 and 1.8.6) [<a href="http://github.com/doxygen/doxygen/commit/3cb963061343aa5b3b8a044cdfa62848723a02ee">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733451">733451</a> volatile declaration on member functions is not handled as xml attribute [<a href="http://github.com/doxygen/doxygen/commit/97d12d058a7831adcc8c6f2cfe8c20ddd2ae5bc2">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733605">733605</a> Incorrect LaTeX generation for private union member in C++ [<a href="http://github.com/doxygen/doxygen/commit/a36ddbe0ee97c5ee248b7b391b4c30fd4b3c884b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733722">733722</a> XML Output invalid: XML_PROGRAMLISTING=YES copies Unicode form feed character (U+000C) to XML files [<a href="http://github.com/doxygen/doxygen/commit/b272b4b5077873457a0f6b517ac799f4a5f8c951">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733856">733856</a> segfault in QGListIterator while parsing fortran code [<a href="http://github.com/doxygen/doxygen/commit/aac81f8bfe8298aa0839bb2d7c70ea75149cdffb">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733938">733938</a> Explicit links using operator()() not generated. [<a href="http://github.com/doxygen/doxygen/commit/e913d55b2e5a8e37ebd1ffd8fec730886a45fbda">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734077">734077</a> no uniquely matching class member found for inline function definition where parameter argument names don't match [<a href="http://github.com/doxygen/doxygen/commit/6f0269ef3074bbc4bc16ad63a0e0a8f9b5f0ce31">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734099">734099</a> Add support for non-parsed language [<a href="http://github.com/doxygen/doxygen/commit/0dd59398b3f62288897c8c3405977a27a94fbfee">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734245">734245</a> Q_PROPERTY switches the member access from private to public [<a href="http://github.com/doxygen/doxygen/commit/392b48a25e4315528fbb11a5a1bfc9f2bca791c0">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734331">734331</a> Strong enum members listed in containing namespace [<a href="http://github.com/doxygen/doxygen/commit/4766fdba2ab196844a0bd5ec5e0b64d94df4a74f">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734704">734704</a> Sigsegv while generating XML output [<a href="http://github.com/doxygen/doxygen/commit/14f88af12bae98859eafe605ddb5f54029e44076">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734727">734727</a> GENERATE_TAGFILE no longer includes any @*section links [<a href="http://github.com/doxygen/doxygen/commit/7d9d4320f5d183c4e1ebc87a316589c36f0afeed">view</a>] and - [<a href="http://github.com/doxygen/doxygen/commit/8b279c9bc28c70405e61219a6c2b3c6dbc7426e6">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734828">734828</a> Request: disable building documentation if Python 2.6 or newer not available [<a href="http://github.com/doxygen/doxygen/commit/264ecc9eee1f2b74f0110120574056f0de42a3f9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735001">735001</a> No output for markdown pages with duplicate label title (different anchor) [<a href="http://github.com/doxygen/doxygen/commit/ebb2fe6d73b4aefc6dadab8eec45adc4ee0c9fd5">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735037">735037</a> QGDict::hashAsciiKey: Invalid null key [<a href="http://github.com/doxygen/doxygen/commit/def392bf8d0326733c20504dc36168093e087c95">view</a>]</li> -<li>Add FORTRAN 2003 keywords and commands [<a href="http://github.com/doxygen/doxygen/commit/4cbfaa8372beff4bd7070dd840924af8d96b0772">view</a>]</li> -<li>Add type option to FORTRAN select statements [<a href="http://github.com/doxygen/doxygen/commit/db289e2272bfc3b00452cbf7c2a30114fb8b7c58">view</a>]</li> -<li>Added build support for Python3+ and Python2.6+ [<a href="http://github.com/doxygen/doxygen/commit/98a54c576eec4feda606156ae591854311d9cd0e">view</a>]</li> -<li>Added class/procedure vardefs to FORTRAN code highlighting [<a href="http://github.com/doxygen/doxygen/commit/dbd1985de07ccd19caf57ffa36c88811048689a4">view</a>]</li> -<li>Added documentation for some missing HTML commands [<a href="http://github.com/doxygen/doxygen/commit/04c89e604877fa9a4aea160d971c782006872710">view</a>]</li> -<li>Added flatten, listsort and paginate filters [<a href="http://github.com/doxygen/doxygen/commit/edd056308d04d6f445a48e05105d4d9a0ece80a0">view</a>]</li> -<li>Added get filter, unified index properties [<a href="http://github.com/doxygen/doxygen/commit/7e3e890fedfb20e7018fadfa87ed97eef7f2b720">view</a>]</li> -<li>Added groupby filter and some more context info [<a href="http://github.com/doxygen/doxygen/commit/064992b0c901661b49de24ce1a1d9a06e9957a93">view</a>]</li> -<li>Added import keyword to FORTRAN code highlighting [<a href="http://github.com/doxygen/doxygen/commit/558697792cd062b93e8d7b7904fb9897e5f70750">view</a>]</li> -<li>Added lists for indices to template context [<a href="http://github.com/doxygen/doxygen/commit/2d35b9a7c0fe70fa894dc266dd0b5ddd54d4014e">view</a>]</li> -<li>Added mainpage to context and improved page tree [<a href="http://github.com/doxygen/doxygen/commit/2e837e0be05636923ef593c29299ff76c4590a09">view</a>]</li> -<li>Added member indexes to template context [<a href="http://github.com/doxygen/doxygen/commit/b850eb45e80b348cbe8629c354350b051f7ef2ec">view</a>]</li> -<li>Added missing links in changelog when multiple bug ids were on one line [<a href="http://github.com/doxygen/doxygen/commit/b752d01fe2de1668c0a247bc3955d7be6987d046">view</a>]</li> -<li>Added more missing links to the changelog [<a href="http://github.com/doxygen/doxygen/commit/0d50c30becc147918b091c02b41502829b8083a3">view</a>]</li> -<li>Added namespace info to the context [<a href="http://github.com/doxygen/doxygen/commit/a7c14ac74c43e6b372d866deeed77fe69e2a68e0">view</a>]</li> -<li>Addition of module data to context and alphaIndex filter [<a href="http://github.com/doxygen/doxygen/commit/e0c3517ff9369387e00dd596b094a4729cfe789c">view</a>]</li> -<li>Coded coloring of flow statements corrected (regression) [<a href="http://github.com/doxygen/doxygen/commit/ee7194bd73ee3a8142aee6ea59d2e5dc717b18de">view</a>]</li> -<li>Corrected copyright year [<a href="http://github.com/doxygen/doxygen/commit/7652fc8472ac83e26641fb737539e7c87725ed68">view</a>]</li> -<li>Correction of typing error [<a href="http://github.com/doxygen/doxygen/commit/81c99d10dbc41feab4a1aca220b27634ca0ff8cd">view</a>]</li> -<li>Disabled/fixed segments that produced doxygen warnings while running the test [<a href="http://github.com/doxygen/doxygen/commit/3a5e6ac7c6018a7a0da7acd830293da0fcb7a21c">view</a>]</li> -<li>Docbook output improvements [<a href="http://github.com/doxygen/doxygen/commit/12f5ee8a8c3a287f6bcfe81f79ff4332b3987c7e">view</a>]</li> -<li>Documentation generator: added support for C# property accessors visibility modifiers. [<a href="http://github.com/doxygen/doxygen/commit/54ac45bd9f535d13b2bf98e4d71b27b4590c3dc7">view</a>]</li> -<li>Doxywizard: make the Next button on the last page of the expert tab switch to the run tab [<a href="http://github.com/doxygen/doxygen/commit/2277e6e695d785d319cb52a8a8ead2982eac2afa">view</a>]</li> -<li>Doxywizard: make the Next button on the last page of the wizard switch to the run tab [<a href="http://github.com/doxygen/doxygen/commit/fbc60af2298c2668893e2f7045f66765f8e0c63f">view</a>]</li> -<li>Error linking 32-bit windows [<a href="http://github.com/doxygen/doxygen/commit/cce307d96a93515d46068cfdcf5e55c1944ae9e5">view</a>]</li> -<li>Fix FORTRAN code function scope test [<a href="http://github.com/doxygen/doxygen/commit/2030240bc18d32581479306e6fd86211e6f30c73">view</a>]</li> -<li>Fix after rebase from master [<a href="http://github.com/doxygen/doxygen/commit/57eee1777c18caa6d3215ec162da1fd9b2d14eb2">view</a>]</li> -<li>Fix description of USE_PDFLATEX [<a href="http://github.com/doxygen/doxygen/commit/c87cceafe203a11e4074b748469e993d13cd8fb3">view</a>]</li> -<li>Fix highlighting issues [<a href="http://github.com/doxygen/doxygen/commit/be0986e9ab7c1788e3650f1df7e7af70b68f28d8">view</a>]</li> -<li>Fix typo [<a href="http://github.com/doxygen/doxygen/commit/e32121ab1fb261464356ce2352c08930f942f805">view</a>]</li> -<li>Fix unnecessary rules for FORTRAN types [<a href="http://github.com/doxygen/doxygen/commit/1e6323e5bb04f49df9d00e82e5db3e8f301dbfc4">view</a>]</li> -<li>Fix warning about unused functions in qstring.cpp [<a href="http://github.com/doxygen/doxygen/commit/84064ac4db9e487ca4bff9b6c37eb72992050ee3">view</a>]</li> -<li>Fixed keyword type [<a href="http://github.com/doxygen/doxygen/commit/d8221cb7a73efc8f20068636c3d2fec84ce8cb8b">view</a>]</li> -<li>Fixed missing include for Linux [<a href="http://github.com/doxygen/doxygen/commit/88468313289c659088be9beece59a82206153ed8">view</a>]</li> -<li>Fixed test 021 [<a href="http://github.com/doxygen/doxygen/commit/c5c763056535216ccce4bed4892358bf5c8d1fd5">view</a>]</li> -<li>Fixed typo [<a href="http://github.com/doxygen/doxygen/commit/0bb9b762844a2f88043223a29182dd9e7e524cef">view</a>]</li> -<li>Fixed typo and used QString for directory [<a href="http://github.com/doxygen/doxygen/commit/5d00fa5862a1724bbe417e33d6c1a260607281ef">view</a>]</li> -<li>Fixed windows compile issue for is_neutral [<a href="http://github.com/doxygen/doxygen/commit/9278509cf82ed7b0ff37c39e4d6e97f5308f29de">view</a>]</li> -<li>Fixes for ./configure script on Solaris [<a href="http://github.com/doxygen/doxygen/commit/d234115b6f387ff723cb97a4d47b2bcca7f0bc6d">view</a>]</li> -<li>Fixes regression due to PR 169 [<a href="http://github.com/doxygen/doxygen/commit/56143a268898249a63bb0a443e09dc2c77ec9ce9">view</a>]</li> -<li>Language parser: added support for C# property accessors visibility modifiers. [<a href="http://github.com/doxygen/doxygen/commit/f5ff1b8e55b4dad074d2a73f1d003ff2991cf894">view</a>]</li> -<li>Made INSTALL file version and date independent [<a href="http://github.com/doxygen/doxygen/commit/1781094043eb5f8f7b0f0bbe5f720012346123a2">view</a>]</li> -<li>Made bread crumb trails enabled unconditionally [<a href="http://github.com/doxygen/doxygen/commit/c7c7d73c184ee2eebf65e83044cf1e325751cffa">view</a>]</li> -<li>Made setName() virtual so overloading works [<a href="http://github.com/doxygen/doxygen/commit/d1e39098f94487f544a068b7864aa8d1b1f345cd">view</a>]</li> -<li>Make index for faq [<a href="http://github.com/doxygen/doxygen/commit/38dfdcaba3e9130833cd7b695d5e20fec26f5c3f">view</a>]</li> -<li>Messages truncated in warnings file [<a href="http://github.com/doxygen/doxygen/commit/cc4f3b454cae7d3e9eaa44342bcbae1061f5e790">view</a>]</li> -<li>Minor fixes [<a href="http://github.com/doxygen/doxygen/commit/c31a81a85e0396fb276beefd06bb71c2819571ed">view</a>]</li> -<li>Minor fixes to the template context [<a href="http://github.com/doxygen/doxygen/commit/963e0adfd76e6a59ace5e7318f948632322b1e51">view</a>]</li> -<li>Missing word after \n command in doxygen rtf output, version 1.8.5 & up [<a href="http://github.com/doxygen/doxygen/commit/ea9f3b1d727b22973c0176b2564304fb160aa70b">view</a>]</li> -<li>More robust extraction of scope information from tag files [<a href="http://github.com/doxygen/doxygen/commit/6a60477b418e21dbadd3e62dc557a038e319581b">view</a>]</li> -<li>No warning in case cite definition is missing [<a href="http://github.com/doxygen/doxygen/commit/1f77638174f715f0f2bcf5b2e32ebb329d531f85">view</a>]</li> -<li>Preparations for release 1.8.8 [<a href="http://github.com/doxygen/doxygen/commit/f16be0113f8d47d4f04e69d0c45ccc4b24e3c426">view</a>]</li> -<li>Removed not implemented HTML commands from documentation [<a href="http://github.com/doxygen/doxygen/commit/8199b2d105313efd30367c7a03b57bf7a7d2180b">view</a>]</li> -<li>Removed unsupported HTML commands from the docs [<a href="http://github.com/doxygen/doxygen/commit/16ba4bd5744c2e5fbfabe95b27736b8ca8030390">view</a>]</li> -<li>Set deployment targets for MacOSX 10.5+ versions [<a href="http://github.com/doxygen/doxygen/commit/28f40b3aea1411488832205fae447f4652125cdc">view</a>]</li> -<li>Support multiple extra HTML stylesheets. [<a href="http://github.com/doxygen/doxygen/commit/595943c96860425f9086028b00e1e155e8ec434f">view</a>]</li> -<li>Tcl: add missing file that breaks test 057 [<a href="http://github.com/doxygen/doxygen/commit/73e7c340f555291d4264b2f83caacf59a5a3395f">view</a>]</li> -<li>Tcl: add test code for Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729092">729092</a> [<a href="http://github.com/doxygen/doxygen/commit/36ce0578065b95cf12b81e5a4edd95dea5707e22">view</a>]</li> -<li>Tcl: collect XRefs also if INLINE_SOURCES = no [<a href="http://github.com/doxygen/doxygen/commit/6245ef410358f332330195f9f2bfa458cfb6a2b8">view</a>]</li> -<li>Tcl: correct namespace resolution in case of INLINE_SOURCES = YES [<a href="http://github.com/doxygen/doxygen/commit/470143192d0c8cf90ad84a66226d48060cc713db">view</a>]</li> -<li>Tcl: recurse for [] [<a href="http://github.com/doxygen/doxygen/commit/9d315a987d7d0ea2f38809aa74e36c92281910df">view</a>]</li> -<li>Tcl: refactor similar code into tcl_codify_token function [<a href="http://github.com/doxygen/doxygen/commit/06bd53ac6acee5fb83d9f2b5ded1c55c8a069b29">view</a>]</li> -<li>Tcl: support eval/catch commands [<a href="http://github.com/doxygen/doxygen/commit/9d24b488add8b4c7c689f58a095184a6ed85e9f1">view</a>]</li> -<li>Tcl: support switch command [<a href="http://github.com/doxygen/doxygen/commit/2984dad86558b4a81e11ce07485057e3903a9304">view</a>]</li> -<li>Tcl: test 057 additionally tests mutual Xrefs for two files [<a href="http://github.com/doxygen/doxygen/commit/c6aaf0a4c35db27f968a7a6d0b9fa25b5b311bc3">view</a>]</li> -<li>Template context support for CREATE_SUBDIRS [<a href="http://github.com/doxygen/doxygen/commit/9282aab5ed2a0cca3858df6e62132f959e99edb5">view</a>]</li> -<li>Update dot.cpp [<a href="http://github.com/doxygen/doxygen/commit/a15c5c89f0b4f97d57474d9ea0e3166709d35534">view</a>]</li> -<li>Update latexgen.cpp [<a href="http://github.com/doxygen/doxygen/commit/1f877b09262f34e6bad6dbfaee4b04b4be03bd4c">view</a>]</li> -<li>Update test 058 because commit 9d315a9 fixes also Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729135">729135</a> [<a href="http://github.com/doxygen/doxygen/commit/3486bfc158008da1d69d420e57e7a10f1c0d69c3">view</a>]</li> -<li>Replaced the VHDL parser with the VHDL scanner from 1.7.5 to avoid potential licensing issues [<a href="http://github.com/doxygen/doxygen/commit/99433b3d2319916f11608c2c818fe35360256d9e">view</a>]</li> -<li>New VHDL parser implementation [<a href="http://github.com/doxygen/doxygen/commit/36122e49ed1d9e640b1ceca52536ec7c55e10474">view</a>]</li> -<li>Vhdl fixes [<a href="http://github.com/doxygen/doxygen/commit/3b8fea2f1f7f2e6a83a35626e6dec9d114a78c9e">view</a>]</li> -<li>\usepackage{fixltx2e} must come before use \usepackage{float} [<a href="http://github.com/doxygen/doxygen/commit/d8a36bbd404bc9c77689f42cc4bfde8ac393cd8c">view</a>]</li> -<li>cache anonymous into ClassDefImpl::isAnonymous [<a href="http://github.com/doxygen/doxygen/commit/34a5a051a8b91215ae4f93e5541d43c33aa887c1">view</a>]</li> -<li>changed append filter and added index and path attributes to node [<a href="http://github.com/doxygen/doxygen/commit/47bc520ac8c0dde310dcb1999c622c591b373ffc">view</a>]</li> -<li>doc/translator.py -- unification for Python 2.6+ and 3.3+ (not finished) [<a href="http://github.com/doxygen/doxygen/commit/8cac977ddfdc1c77546f5d766387f4a57710c8c0">view</a>]</li> -<li>doc/translator.py unified for Python 2.6+ and Python 3.0+ [<a href="http://github.com/doxygen/doxygen/commit/6212c2d2af12dd9d47459bdecdf79ad106060229">view</a>]</li> -<li>make.bat: change current directory [<a href="http://github.com/doxygen/doxygen/commit/fc386eb107958b4f3214aa2c0c6caf2a91c83177">view</a>] and - [<a href="http://github.com/doxygen/doxygen/commit/feb24c82002ced816bc72eb8f2a6a35c71e25ed7">view</a>]</li> -<li>removeRedundantWhiteSpace micro-optimization [<a href="http://github.com/doxygen/doxygen/commit/d4601735b582b903f1ccb144f59b2030a7797b05">view</a>]</li> -<li>resolves the error of unbalanced tags opened/closed in docbook output: parser error : Opening and ending tag mismatch: para line 358 and tbody [<a href="http://github.com/doxygen/doxygen/commit/d7b0858e079419bb7ea862e16946218a9352d5b5">view</a>]</li> -<li>winbuild/pack_the_distribution_for_windows.py minor updates [<a href="http://github.com/doxygen/doxygen/commit/6d969cab51f4c32784966a28b8b9d5fe2d5b2089">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5505">5505</a> - Support for PlantUML [<a href="https://github.com/doxygen/doxygen/commit/7506404e646f1fcc5a26ca6fca91a7f65154f05a">view</a>]</li> +<li>Add BREAD_CRUMB_TRAIL. [<a href="https://github.com/doxygen/doxygen/commit/4074da5b83d37dd1c72c5df015fb2b41e7725a7e">view</a>]</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/1527">1527</a> $title doesn't work in LateX header [<a href="https://github.com/doxygen/doxygen/commit/790000b90944646702ddd3a183ec166669c18f51">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3405">3405</a> Class diagrams and class hierarchy don't work for java generic classes [<a href="https://github.com/doxygen/doxygen/commit/c3ddf3331239fb3f41e502a8337eee786ceaad06">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3460">3460</a> Flex .rule file for Visual Studio build can't cope with spaces in filenames [<a href="https://github.com/doxygen/doxygen/commit/eb3ab2452d8a1ef7a85af7a03e1622c12b40400b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3834">3834</a> Fortran: quotation after define causes error [<a href="https://github.com/doxygen/doxygen/commit/f083109de116ee2c6e2a31a15ebc17d2dff008e0">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3879">3879</a> FORTRAN: recognition free versus fixed formatted code [<a href="https://github.com/doxygen/doxygen/commit/476d79d31a0534c3d7d07001c47c1212a73d10a5">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5182">5182</a> Bibliography duplicate filenames fails [<a href="https://github.com/doxygen/doxygen/commit/7779bf6d6206bc0f78c22100034c44bfdb7f1bc1">view</a>] and + [<a href="https://github.com/doxygen/doxygen/commit/da029a3c893df22536cb3635e597fd3f5b2a4862">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5215">5215</a> \cite rejects valid BibTeX keys [<a href="https://github.com/doxygen/doxygen/commit/06170de4a166bfad9342f3b957dda82b7fb266b2">view</a>] and + [<a href="https://github.com/doxygen/doxygen/commit/69df2f9d1deb87b79c79f9ea1bf20380ff9b71ad">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5259">5259</a> TCL: Documentation of oo::define is not working [<a href="https://github.com/doxygen/doxygen/commit/5ec66c2286d7cedbdbb0930fe0e293b050c91d24">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5445">5445</a> Nested C structures/unions does not work with groups [<a href="https://github.com/doxygen/doxygen/commit/f4388dc4a62e183b7ca4457eba7cb978a35804c2">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5459">5459</a> configuration stops with settings.h missing [<a href="https://github.com/doxygen/doxygen/commit/fd4b42ec54cb8d6faf2b0f16e580f376e8cf6982">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5460">5460</a> XML Output: Doxygen doesn't escape & characters (included in a hyperlink) in <detaileddescription> [<a href="https://github.com/doxygen/doxygen/commit/cfde6cdd600b21bba6a2eb0ca0e7e208e014ccaf">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5461">5461</a> function object in member initializer causes documentation loss [<a href="https://github.com/doxygen/doxygen/commit/f4f3e381dba1bc5d46feea3c39e8f076e27463d1">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5472">5472</a> [PATCH] Propagate configure's perl to makefiles [<a href="https://github.com/doxygen/doxygen/commit/f1a692b019a30f7aa07e0fb3e11402d262af8026">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5483">5483</a> man page extension is incorrect [<a href="https://github.com/doxygen/doxygen/commit/f25d896d4da9b44c23f89bfdd0379fa97ab2c351">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5486">5486</a> No documentation generated for method-less C++ struct [<a href="https://github.com/doxygen/doxygen/commit/21178ab40160abf011fa084a10892b5b7821e44c">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5493">5493</a> [PATCH] Fix potential copy and paste error in inputstring.cpp [<a href="https://github.com/doxygen/doxygen/commit/6f5748e822b009cbe82cc1df8eea43e4769bc44b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5494">5494</a> [PATCH] Fix missing '&' in Boolean operation in qstring.cpp [<a href="https://github.com/doxygen/doxygen/commit/27f1e1e9316addcfd0bbc3321b5614ed14f7a1a5">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5497">5497</a> Dead links in html documentation when using tabs for indentation in c++ [<a href="https://github.com/doxygen/doxygen/commit/2cc3b18da39bde323c5739483e507a133e93ac22">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5500">5500</a> Callgraphs for C# only generated for methods inside the same class [<a href="https://github.com/doxygen/doxygen/commit/7edbf2b2e705eccc0d99cce86149228473bc7f3e">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5506">5506</a> Variadic macros failing to expand if trailing ... is empty [<a href="https://github.com/doxygen/doxygen/commit/070c35549da108695074239be3ab4268f3722261">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5512">5512</a> Two entries for a single member in doxygen XML [<a href="https://github.com/doxygen/doxygen/commit/ed8ce3cf405204916f9832e26797cb15d1490fd1">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5514">5514</a> nested html tables cause pdflatex to hang (1.8.4 and 1.8.6) [<a href="https://github.com/doxygen/doxygen/commit/3cb963061343aa5b3b8a044cdfa62848723a02ee">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5521">5521</a> volatile declaration on member functions is not handled as xml attribute [<a href="https://github.com/doxygen/doxygen/commit/97d12d058a7831adcc8c6f2cfe8c20ddd2ae5bc2">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5524">5524</a> Incorrect LaTeX generation for private union member in C++ [<a href="https://github.com/doxygen/doxygen/commit/a36ddbe0ee97c5ee248b7b391b4c30fd4b3c884b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5526">5526</a> XML Output invalid: XML_PROGRAMLISTING=YES copies Unicode form feed character (U+000C) to XML files [<a href="https://github.com/doxygen/doxygen/commit/b272b4b5077873457a0f6b517ac799f4a5f8c951">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5528">5528</a> segfault in QGListIterator while parsing fortran code [<a href="https://github.com/doxygen/doxygen/commit/aac81f8bfe8298aa0839bb2d7c70ea75149cdffb">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5531">5531</a> Explicit links using operator()() not generated. [<a href="https://github.com/doxygen/doxygen/commit/e913d55b2e5a8e37ebd1ffd8fec730886a45fbda">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5534">5534</a> no uniquely matching class member found for inline function definition where parameter argument names don't match [<a href="https://github.com/doxygen/doxygen/commit/6f0269ef3074bbc4bc16ad63a0e0a8f9b5f0ce31">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5535">5535</a> Add support for non-parsed language [<a href="https://github.com/doxygen/doxygen/commit/0dd59398b3f62288897c8c3405977a27a94fbfee">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5537">5537</a> Q_PROPERTY switches the member access from private to public [<a href="https://github.com/doxygen/doxygen/commit/392b48a25e4315528fbb11a5a1bfc9f2bca791c0">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5540">5540</a> Strong enum members listed in containing namespace [<a href="https://github.com/doxygen/doxygen/commit/4766fdba2ab196844a0bd5ec5e0b64d94df4a74f">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5543">5543</a> Sigsegv while generating XML output [<a href="https://github.com/doxygen/doxygen/commit/14f88af12bae98859eafe605ddb5f54029e44076">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5544">5544</a> GENERATE_TAGFILE no longer includes any @*section links [<a href="https://github.com/doxygen/doxygen/commit/7d9d4320f5d183c4e1ebc87a316589c36f0afeed">view</a>] and + [<a href="https://github.com/doxygen/doxygen/commit/8b279c9bc28c70405e61219a6c2b3c6dbc7426e6">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5548">5548</a> Request: disable building documentation if Python 2.6 or newer not available [<a href="https://github.com/doxygen/doxygen/commit/264ecc9eee1f2b74f0110120574056f0de42a3f9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5550">5550</a> No output for markdown pages with duplicate label title (different anchor) [<a href="https://github.com/doxygen/doxygen/commit/ebb2fe6d73b4aefc6dadab8eec45adc4ee0c9fd5">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5551">5551</a> QGDict::hashAsciiKey: Invalid null key [<a href="https://github.com/doxygen/doxygen/commit/def392bf8d0326733c20504dc36168093e087c95">view</a>]</li> +<li>Add FORTRAN 2003 keywords and commands [<a href="https://github.com/doxygen/doxygen/commit/4cbfaa8372beff4bd7070dd840924af8d96b0772">view</a>]</li> +<li>Add type option to FORTRAN select statements [<a href="https://github.com/doxygen/doxygen/commit/db289e2272bfc3b00452cbf7c2a30114fb8b7c58">view</a>]</li> +<li>Added build support for Python3+ and Python2.6+ [<a href="https://github.com/doxygen/doxygen/commit/98a54c576eec4feda606156ae591854311d9cd0e">view</a>]</li> +<li>Added class/procedure vardefs to FORTRAN code highlighting [<a href="https://github.com/doxygen/doxygen/commit/dbd1985de07ccd19caf57ffa36c88811048689a4">view</a>]</li> +<li>Added documentation for some missing HTML commands [<a href="https://github.com/doxygen/doxygen/commit/04c89e604877fa9a4aea160d971c782006872710">view</a>]</li> +<li>Added flatten, listsort and paginate filters [<a href="https://github.com/doxygen/doxygen/commit/edd056308d04d6f445a48e05105d4d9a0ece80a0">view</a>]</li> +<li>Added get filter, unified index properties [<a href="https://github.com/doxygen/doxygen/commit/7e3e890fedfb20e7018fadfa87ed97eef7f2b720">view</a>]</li> +<li>Added groupby filter and some more context info [<a href="https://github.com/doxygen/doxygen/commit/064992b0c901661b49de24ce1a1d9a06e9957a93">view</a>]</li> +<li>Added import keyword to FORTRAN code highlighting [<a href="https://github.com/doxygen/doxygen/commit/558697792cd062b93e8d7b7904fb9897e5f70750">view</a>]</li> +<li>Added lists for indices to template context [<a href="https://github.com/doxygen/doxygen/commit/2d35b9a7c0fe70fa894dc266dd0b5ddd54d4014e">view</a>]</li> +<li>Added mainpage to context and improved page tree [<a href="https://github.com/doxygen/doxygen/commit/2e837e0be05636923ef593c29299ff76c4590a09">view</a>]</li> +<li>Added member indexes to template context [<a href="https://github.com/doxygen/doxygen/commit/b850eb45e80b348cbe8629c354350b051f7ef2ec">view</a>]</li> +<li>Added missing links in changelog when multiple bug ids were on one line [<a href="https://github.com/doxygen/doxygen/commit/b752d01fe2de1668c0a247bc3955d7be6987d046">view</a>]</li> +<li>Added more missing links to the changelog [<a href="https://github.com/doxygen/doxygen/commit/0d50c30becc147918b091c02b41502829b8083a3">view</a>]</li> +<li>Added namespace info to the context [<a href="https://github.com/doxygen/doxygen/commit/a7c14ac74c43e6b372d866deeed77fe69e2a68e0">view</a>]</li> +<li>Addition of module data to context and alphaIndex filter [<a href="https://github.com/doxygen/doxygen/commit/e0c3517ff9369387e00dd596b094a4729cfe789c">view</a>]</li> +<li>Coded coloring of flow statements corrected (regression) [<a href="https://github.com/doxygen/doxygen/commit/ee7194bd73ee3a8142aee6ea59d2e5dc717b18de">view</a>]</li> +<li>Corrected copyright year [<a href="https://github.com/doxygen/doxygen/commit/7652fc8472ac83e26641fb737539e7c87725ed68">view</a>]</li> +<li>Correction of typing error [<a href="https://github.com/doxygen/doxygen/commit/81c99d10dbc41feab4a1aca220b27634ca0ff8cd">view</a>]</li> +<li>Disabled/fixed segments that produced doxygen warnings while running the test [<a href="https://github.com/doxygen/doxygen/commit/3a5e6ac7c6018a7a0da7acd830293da0fcb7a21c">view</a>]</li> +<li>Docbook output improvements [<a href="https://github.com/doxygen/doxygen/commit/12f5ee8a8c3a287f6bcfe81f79ff4332b3987c7e">view</a>]</li> +<li>Documentation generator: added support for C# property accessors visibility modifiers. [<a href="https://github.com/doxygen/doxygen/commit/54ac45bd9f535d13b2bf98e4d71b27b4590c3dc7">view</a>]</li> +<li>Doxywizard: make the Next button on the last page of the expert tab switch to the run tab [<a href="https://github.com/doxygen/doxygen/commit/2277e6e695d785d319cb52a8a8ead2982eac2afa">view</a>]</li> +<li>Doxywizard: make the Next button on the last page of the wizard switch to the run tab [<a href="https://github.com/doxygen/doxygen/commit/fbc60af2298c2668893e2f7045f66765f8e0c63f">view</a>]</li> +<li>Error linking 32-bit windows [<a href="https://github.com/doxygen/doxygen/commit/cce307d96a93515d46068cfdcf5e55c1944ae9e5">view</a>]</li> +<li>Fix FORTRAN code function scope test [<a href="https://github.com/doxygen/doxygen/commit/2030240bc18d32581479306e6fd86211e6f30c73">view</a>]</li> +<li>Fix after rebase from master [<a href="https://github.com/doxygen/doxygen/commit/57eee1777c18caa6d3215ec162da1fd9b2d14eb2">view</a>]</li> +<li>Fix description of USE_PDFLATEX [<a href="https://github.com/doxygen/doxygen/commit/c87cceafe203a11e4074b748469e993d13cd8fb3">view</a>]</li> +<li>Fix highlighting issues [<a href="https://github.com/doxygen/doxygen/commit/be0986e9ab7c1788e3650f1df7e7af70b68f28d8">view</a>]</li> +<li>Fix typo [<a href="https://github.com/doxygen/doxygen/commit/e32121ab1fb261464356ce2352c08930f942f805">view</a>]</li> +<li>Fix unnecessary rules for FORTRAN types [<a href="https://github.com/doxygen/doxygen/commit/1e6323e5bb04f49df9d00e82e5db3e8f301dbfc4">view</a>]</li> +<li>Fix warning about unused functions in qstring.cpp [<a href="https://github.com/doxygen/doxygen/commit/84064ac4db9e487ca4bff9b6c37eb72992050ee3">view</a>]</li> +<li>Fixed keyword type [<a href="https://github.com/doxygen/doxygen/commit/d8221cb7a73efc8f20068636c3d2fec84ce8cb8b">view</a>]</li> +<li>Fixed missing include for Linux [<a href="https://github.com/doxygen/doxygen/commit/88468313289c659088be9beece59a82206153ed8">view</a>]</li> +<li>Fixed test 021 [<a href="https://github.com/doxygen/doxygen/commit/c5c763056535216ccce4bed4892358bf5c8d1fd5">view</a>]</li> +<li>Fixed typo [<a href="https://github.com/doxygen/doxygen/commit/0bb9b762844a2f88043223a29182dd9e7e524cef">view</a>]</li> +<li>Fixed typo and used QString for directory [<a href="https://github.com/doxygen/doxygen/commit/5d00fa5862a1724bbe417e33d6c1a260607281ef">view</a>]</li> +<li>Fixed windows compile issue for is_neutral [<a href="https://github.com/doxygen/doxygen/commit/9278509cf82ed7b0ff37c39e4d6e97f5308f29de">view</a>]</li> +<li>Fixes for ./configure script on Solaris [<a href="https://github.com/doxygen/doxygen/commit/d234115b6f387ff723cb97a4d47b2bcca7f0bc6d">view</a>]</li> +<li>Fixes regression due to PR 169 [<a href="https://github.com/doxygen/doxygen/commit/56143a268898249a63bb0a443e09dc2c77ec9ce9">view</a>]</li> +<li>Language parser: added support for C# property accessors visibility modifiers. [<a href="https://github.com/doxygen/doxygen/commit/f5ff1b8e55b4dad074d2a73f1d003ff2991cf894">view</a>]</li> +<li>Made INSTALL file version and date independent [<a href="https://github.com/doxygen/doxygen/commit/1781094043eb5f8f7b0f0bbe5f720012346123a2">view</a>]</li> +<li>Made bread crumb trails enabled unconditionally [<a href="https://github.com/doxygen/doxygen/commit/c7c7d73c184ee2eebf65e83044cf1e325751cffa">view</a>]</li> +<li>Made setName() virtual so overloading works [<a href="https://github.com/doxygen/doxygen/commit/d1e39098f94487f544a068b7864aa8d1b1f345cd">view</a>]</li> +<li>Make index for faq [<a href="https://github.com/doxygen/doxygen/commit/38dfdcaba3e9130833cd7b695d5e20fec26f5c3f">view</a>]</li> +<li>Messages truncated in warnings file [<a href="https://github.com/doxygen/doxygen/commit/cc4f3b454cae7d3e9eaa44342bcbae1061f5e790">view</a>]</li> +<li>Minor fixes [<a href="https://github.com/doxygen/doxygen/commit/c31a81a85e0396fb276beefd06bb71c2819571ed">view</a>]</li> +<li>Minor fixes to the template context [<a href="https://github.com/doxygen/doxygen/commit/963e0adfd76e6a59ace5e7318f948632322b1e51">view</a>]</li> +<li>Missing word after \n command in doxygen rtf output, version 1.8.5 & up [<a href="https://github.com/doxygen/doxygen/commit/ea9f3b1d727b22973c0176b2564304fb160aa70b">view</a>]</li> +<li>More robust extraction of scope information from tag files [<a href="https://github.com/doxygen/doxygen/commit/6a60477b418e21dbadd3e62dc557a038e319581b">view</a>]</li> +<li>No warning in case cite definition is missing [<a href="https://github.com/doxygen/doxygen/commit/1f77638174f715f0f2bcf5b2e32ebb329d531f85">view</a>]</li> +<li>Preparations for release 1.8.8 [<a href="https://github.com/doxygen/doxygen/commit/f16be0113f8d47d4f04e69d0c45ccc4b24e3c426">view</a>]</li> +<li>Removed not implemented HTML commands from documentation [<a href="https://github.com/doxygen/doxygen/commit/8199b2d105313efd30367c7a03b57bf7a7d2180b">view</a>]</li> +<li>Removed unsupported HTML commands from the docs [<a href="https://github.com/doxygen/doxygen/commit/16ba4bd5744c2e5fbfabe95b27736b8ca8030390">view</a>]</li> +<li>Set deployment targets for MacOSX 10.5+ versions [<a href="https://github.com/doxygen/doxygen/commit/28f40b3aea1411488832205fae447f4652125cdc">view</a>]</li> +<li>Support multiple extra HTML stylesheets. [<a href="https://github.com/doxygen/doxygen/commit/595943c96860425f9086028b00e1e155e8ec434f">view</a>]</li> +<li>Tcl: add missing file that breaks test 057 [<a href="https://github.com/doxygen/doxygen/commit/73e7c340f555291d4264b2f83caacf59a5a3395f">view</a>]</li> +<li>Tcl: add test code for Bug <a href="https://github.com/doxygen/doxygen/issues/5463">5463</a> [<a href="https://github.com/doxygen/doxygen/commit/36ce0578065b95cf12b81e5a4edd95dea5707e22">view</a>]</li> +<li>Tcl: collect XRefs also if INLINE_SOURCES = no [<a href="https://github.com/doxygen/doxygen/commit/6245ef410358f332330195f9f2bfa458cfb6a2b8">view</a>]</li> +<li>Tcl: correct namespace resolution in case of INLINE_SOURCES = YES [<a href="https://github.com/doxygen/doxygen/commit/470143192d0c8cf90ad84a66226d48060cc713db">view</a>]</li> +<li>Tcl: recurse for [] [<a href="https://github.com/doxygen/doxygen/commit/9d315a987d7d0ea2f38809aa74e36c92281910df">view</a>]</li> +<li>Tcl: refactor similar code into tcl_codify_token function [<a href="https://github.com/doxygen/doxygen/commit/06bd53ac6acee5fb83d9f2b5ded1c55c8a069b29">view</a>]</li> +<li>Tcl: support eval/catch commands [<a href="https://github.com/doxygen/doxygen/commit/9d24b488add8b4c7c689f58a095184a6ed85e9f1">view</a>]</li> +<li>Tcl: support switch command [<a href="https://github.com/doxygen/doxygen/commit/2984dad86558b4a81e11ce07485057e3903a9304">view</a>]</li> +<li>Tcl: test 057 additionally tests mutual Xrefs for two files [<a href="https://github.com/doxygen/doxygen/commit/c6aaf0a4c35db27f968a7a6d0b9fa25b5b311bc3">view</a>]</li> +<li>Template context support for CREATE_SUBDIRS [<a href="https://github.com/doxygen/doxygen/commit/9282aab5ed2a0cca3858df6e62132f959e99edb5">view</a>]</li> +<li>Update dot.cpp [<a href="https://github.com/doxygen/doxygen/commit/a15c5c89f0b4f97d57474d9ea0e3166709d35534">view</a>]</li> +<li>Update latexgen.cpp [<a href="https://github.com/doxygen/doxygen/commit/1f877b09262f34e6bad6dbfaee4b04b4be03bd4c">view</a>]</li> +<li>Update test 058 because commit 9d315a9 fixes also Bug <a href="https://github.com/doxygen/doxygen/issues/5464">5464</a> [<a href="https://github.com/doxygen/doxygen/commit/3486bfc158008da1d69d420e57e7a10f1c0d69c3">view</a>]</li> +<li>Replaced the VHDL parser with the VHDL scanner from 1.7.5 to avoid potential licensing issues [<a href="https://github.com/doxygen/doxygen/commit/99433b3d2319916f11608c2c818fe35360256d9e">view</a>]</li> +<li>New VHDL parser implementation [<a href="https://github.com/doxygen/doxygen/commit/36122e49ed1d9e640b1ceca52536ec7c55e10474">view</a>]</li> +<li>Vhdl fixes [<a href="https://github.com/doxygen/doxygen/commit/3b8fea2f1f7f2e6a83a35626e6dec9d114a78c9e">view</a>]</li> +<li>\usepackage{fixltx2e} must come before use \usepackage{float} [<a href="https://github.com/doxygen/doxygen/commit/d8a36bbd404bc9c77689f42cc4bfde8ac393cd8c">view</a>]</li> +<li>cache anonymous into ClassDefImpl::isAnonymous [<a href="https://github.com/doxygen/doxygen/commit/34a5a051a8b91215ae4f93e5541d43c33aa887c1">view</a>]</li> +<li>changed append filter and added index and path attributes to node [<a href="https://github.com/doxygen/doxygen/commit/47bc520ac8c0dde310dcb1999c622c591b373ffc">view</a>]</li> +<li>doc/translator.py -- unification for Python 2.6+ and 3.3+ (not finished) [<a href="https://github.com/doxygen/doxygen/commit/8cac977ddfdc1c77546f5d766387f4a57710c8c0">view</a>]</li> +<li>doc/translator.py unified for Python 2.6+ and Python 3.0+ [<a href="https://github.com/doxygen/doxygen/commit/6212c2d2af12dd9d47459bdecdf79ad106060229">view</a>]</li> +<li>make.bat: change current directory [<a href="https://github.com/doxygen/doxygen/commit/fc386eb107958b4f3214aa2c0c6caf2a91c83177">view</a>] and + [<a href="https://github.com/doxygen/doxygen/commit/feb24c82002ced816bc72eb8f2a6a35c71e25ed7">view</a>]</li> +<li>removeRedundantWhiteSpace micro-optimization [<a href="https://github.com/doxygen/doxygen/commit/d4601735b582b903f1ccb144f59b2030a7797b05">view</a>]</li> +<li>resolves the error of unbalanced tags opened/closed in docbook output: parser error : Opening and ending tag mismatch: para line 358 and tbody [<a href="https://github.com/doxygen/doxygen/commit/d7b0858e079419bb7ea862e16946218a9352d5b5">view</a>]</li> +<li>winbuild/pack_the_distribution_for_windows.py minor updates [<a href="https://github.com/doxygen/doxygen/commit/6d969cab51f4c32784966a28b8b9d5fe2d5b2089">view</a>]</li> </ul> <p> \endhtmlonly @@ -1012,169 +1412,169 @@ <a name="1.8.7"></a> </p> <ul> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=436885">436885</a> - c-source and h-source missing for latex [<a href="http://github.com/doxygen/doxygen/commit/d5d34325fb9bed776cf2b4facc0c341f701e780b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625601">625601</a> - FORTRAN: recognition free versus fixed formatted code [<a href="http://github.com/doxygen/doxygen/commit/2dec1060623165057628ee678eb3580351922408">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626172">626172</a> - Latex $projectname with "&" gets no escaped [<a href="http://github.com/doxygen/doxygen/commit/586b3b69238fb09d55a03c5d50fc1b7d3e65ed97">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643618">643618</a> - Fortran: variable with name "type" confuses doxygen [<a href="http://github.com/doxygen/doxygen/commit/17c5b6160d013d118296663e133cf8884c74a939">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674851">674851</a> - Percent to prevent auto-linking in page title is not removed for navpath [<a href="http://github.com/doxygen/doxygen/commit/5d44acc0a49bd7b990bfe649efa312f5f0bb594b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678436">678436</a> - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/7f4414b92a1c2147b073dd3cf58e0db7c8a88be6">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678436">678436</a> - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/de502ca71fc1c20ed93209f6a223c488eee38297">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683115">683115</a> - Command ignored when using umlauts in markdown and also C-comments in markdown didn't work properly [<a href="http://github.com/doxygen/doxygen/commit/b4b40f4c7ea57655d1264e8f72c754526e3a9209">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692985">692985</a> - Notes in xml output are not correctly separated [<a href="http://github.com/doxygen/doxygen/commit/bc61f00f142792dfbe97c361d9fecd3ea2850f5e">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705220">705220</a> - Enables using unicode (non ASCII) to name output files [<a href="http://github.com/doxygen/doxygen/commit/d5fb69739a1b2facf32a63ca94c12d097f8278cc">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705499">705499</a> - Nested namespace causes incorrect display when referenced via .tag file [<a href="http://github.com/doxygen/doxygen/commit/1bdbbc60982f2f61f4e0423c9fc8c4a24cfb2e94">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712251">712251</a> - Documentation for enumeration not generated [<a href="http://github.com/doxygen/doxygen/commit/1bb36723a522b371810606c2f6504d0374a7b027">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720691">720691</a> - Code coloring in case of file without extension [<a href="http://github.com/doxygen/doxygen/commit/45934e88fa961686c00be1ad272a088f4e7eac0b">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721032">721032</a> - Trouble with /cond /endcond [<a href="http://github.com/doxygen/doxygen/commit/2912829ca5bced897a2c063d1883b9cfd39d3bd9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721169">721169</a> - Wrong call graph in simple situation [<a href="http://github.com/doxygen/doxygen/commit/e12d6b506862c8ad843b7853bc1c9ceb5d0ccb4d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721302">721302</a> - [Latex/PDF] Merging brief and detailed description in file section [<a href="http://github.com/doxygen/doxygen/commit/a99c33838057acba20768ca32681e1f379f36ca0">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721462">721462</a> - Parsing problem with C++11 empty initializer lists [<a href="http://github.com/doxygen/doxygen/commit/1bfacc3b8e589907352eff923b7b3aa73cfc5138">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721618">721618</a> - Move constructors and move assignment operators of embedded classes of template classes cannot be matched. [<a href="http://github.com/doxygen/doxygen/commit/1d0c9b6fefb6c2e0a9a2b7a7ea3192ccace33710">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721878">721878</a> - Dia diagrams not displayed by Firefox [<a href="http://github.com/doxygen/doxygen/commit/5ea2f2a123e473d5964435369fd925d7f103b456">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722457">722457</a> - regression referencing namespaced type [<a href="http://github.com/doxygen/doxygen/commit/9b76c1a9bb7039962933aeef398bb7aa2f59c3a5">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722603">722603</a> - doxygen nested \if \endif sample not working [<a href="http://github.com/doxygen/doxygen/commit/cc78b12b0019fbcb17692b231d38ba75d0952201">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722619">722619</a> - doxygen 1.8.6 sorts the contents of a namespace by group within the Class List [<a href="http://github.com/doxygen/doxygen/commit/f9b80aff6d20524dd0838aff12033fe3df66ba98">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722711">722711</a> - Link refs with no title swallow an extra newline [<a href="http://github.com/doxygen/doxygen/commit/60ea06a68f2e355e34b61bf45babc6405bfbfe84">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722759">722759</a> - Documentation for derived classes no longer has an "Additional Inherited Members" section after upgrading doxygen from 1.8.3.1 to 1.8.6 [<a href="http://github.com/doxygen/doxygen/commit/0e9da9fb27147c5685088019afd428a0aaa901fa">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722786">722786</a> - configure --prefix=/opt/foo not accepted [<a href="http://github.com/doxygen/doxygen/commit/bc7e6301e2d1474592f6cd6cc07624852d1b5016">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722788">722788</a> - Command \| not working when last character in markdown table line [<a href="http://github.com/doxygen/doxygen/commit/8309fbd9e639eaf9e763e83ca7a228c659450a57">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=723299">723299</a> - Last line of code block lost if it is only one character and there is no text afterward [<a href="http://github.com/doxygen/doxygen/commit/4d1951ebb648bbc92464904305cafc7fc0dba557">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=723314">723314</a> - Doxygen crashes on incorrect end group /**< @} */ [<a href="http://github.com/doxygen/doxygen/commit/b4d5ef176eced8315523baea464cfda733ecb9aa">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=723516">723516</a> - star is not printed in \code environment [<a href="http://github.com/doxygen/doxygen/commit/0eaf1cd5d2eac57666b5ffea9e0f948b7a3e6b3a">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=724241">724241</a> - Internal inconsistency: namespace in IDL [<a href="http://github.com/doxygen/doxygen/commit/b0456fbefa864b33611f289818deeaaf791c17c9">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=724949">724949</a> - Server side (PHP) search broke in 1.8.3 [<a href="http://github.com/doxygen/doxygen/commit/1d2bb19e394850ecb37bea06ef4e5d15fe06e7b0">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726219">726219</a> - python3 import style causes doxygen to ignore some inheritances [<a href="http://github.com/doxygen/doxygen/commit/513ce9aafd05add9b5c1e67e843e540f8937cf63">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726294">726294</a> - Markdown Extra - fenced code block: '>' before tab width parsed as block quote [<a href="http://github.com/doxygen/doxygen/commit/3598e8fdf7ee61a281480fec09f63669710ac35d">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726469">726469</a> - Tilde sign in combination with <pre> and MARKDOWN_SUPPORT disabled [<a href="http://github.com/doxygen/doxygen/commit/721764a1b3c63c77ff0792beb6c37fbfee0f87bb">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726722">726722</a> - Blockquote followed by text inserts an extra paragraph [<a href="http://github.com/doxygen/doxygen/commit/518fccbbadba3136a29c895f3606f40fa220fe47">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726734">726734</a> - alignment of blockquotes in pdf [<a href="http://github.com/doxygen/doxygen/commit/9059295fd6e178804f2f2d95ffe3764645ecc026">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728077">728077</a> - Build fails when --with-libclang on Fedora [<a href="http://github.com/doxygen/doxygen/commit/837d63319a7b014412cb3cb2b5d27d2474a932c2">view</a>]</li> -<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728530">728530</a> - Crash on \addindex \term [<a href="http://github.com/doxygen/doxygen/commit/653a2a8b123b79835af9f684f8b92ef7f88712aa">view</a>]</li> -<li>A new files have been added but is not incorporated in the windows build part [<a href="http://github.com/doxygen/doxygen/commit/d9dd873e25fba968ddcbcc79d6643f5df669b626">view</a>]</li> -<li>Add docbook directory to be removed as well [<a href="http://github.com/doxygen/doxygen/commit/08ea10029e705a388ab14ee29544d496a203f23f">view</a>]</li> -<li>Add extra (documenattion) directories to ignore pattern [<a href="http://github.com/doxygen/doxygen/commit/db358b1f219fecf0d7df96d8c70b47b245471c66">view</a>]</li> -<li>Add index support to context [<a href="http://github.com/doxygen/doxygen/commit/12cd22f4c32ed8b92da7b5a03181aa6735018a5b">view</a>]</li> -<li>Add line numbers in case comment is not closed properly. [<a href="http://github.com/doxygen/doxygen/commit/b1d513b2ac65fe26ceec2fa494867713efa01cd5">view</a>]</li> -<li>Add template context for annotated class index [<a href="http://github.com/doxygen/doxygen/commit/9434ecb13e1f3e2901b78d3e41e7f1d7d9469434">view</a>]</li> -<li>Add validation of internal consistency to html entity mapper [<a href="http://github.com/doxygen/doxygen/commit/d96458ce99b92590a8fec0aba46c67b6816fa632">view</a>]</li> -<li>Add warning when encountering a nested comment start (/*) without matching end (*/). [<a href="http://github.com/doxygen/doxygen/commit/7f30d0afbeb9565bced1439f86ce9f862de5282e">view</a>]</li> -<li>Added \latexinclude command (thanks to Juan Zaratiegui for the patch) [<a href="http://github.com/doxygen/doxygen/commit/1134237afe25f86fcf7c7e2a76a3542eee8acc79">view</a>]</li> -<li>Added basic arithmetic operations to the template expressions, and made the expression lexer faster [<a href="http://github.com/doxygen/doxygen/commit/5af2b7c0aef5cd6a0dc6ceddcffba16f623d920a">view</a>]</li> -<li>Added dir tree nodes to the context [<a href="http://github.com/doxygen/doxygen/commit/762ee821bb0bef125d5406572963ce32c748e227">view</a>]</li> -<li>Added directory info to the context [<a href="http://github.com/doxygen/doxygen/commit/47adeb82d67208db88a4aaae5c3427291462611a">view</a>]</li> -<li>Added doc/config.doc to .gitignore [<a href="http://github.com/doxygen/doxygen/commit/fa400a0252d12db3ffd30eb083e5185f11264112">view</a>]</li> -<li>Added language update for Swedish (thanks to Björn Palmqvist) [<a href="http://github.com/doxygen/doxygen/commit/eec2140f577431915ed087727093c5bf381500ba">view</a>]</li> -<li>Added last and first attributes to index tree node [<a href="http://github.com/doxygen/doxygen/commit/ff5ec803a39b225e03edcd1bf2df3198dafcc16e">view</a>]</li> -<li>Added missing \+ command to build LaTeX manual [<a href="http://github.com/doxygen/doxygen/commit/c096119b0c0bfc567058538b6225ca26eb191a3a">view</a>]</li> -<li>Added new language maintainer for Swedish, removed generated file language.doc [<a href="http://github.com/doxygen/doxygen/commit/f3172cf19514fc05588878d3fabfffe479495cca">view</a>]</li> -<li>Added optional [block] option to \htmlonly [<a href="http://github.com/doxygen/doxygen/commit/842c816a31537e32cec376c85c0a4363f74d7a54">view</a>]</li> -<li>Added reference counting for all context objects [<a href="http://github.com/doxygen/doxygen/commit/ff00706a18b6e57419796ffd6f1448cb2ccb9436">view</a>]</li> -<li>Added stricter URL filtering to prevent DOM Based XSS when the tree view is enabled [<a href="http://github.com/doxygen/doxygen/commit/8ba739ad1ecde1036bfe2e364aee378e137f6dff">view</a>]</li> -<li>Added support for \-- and \--- to prevent interpretation as ndash and mdash [<a href="http://github.com/doxygen/doxygen/commit/385b87e08c23b1392d0e6d6fbdb6ef463fa28477">view</a>]</li> -<li>Added support for elif to the template language [<a href="http://github.com/doxygen/doxygen/commit/ae3a22ba276a2e446a460274e0bff8a9bdf4af7d">view</a>]</li> -<li>Added support for range tag in the template language [<a href="http://github.com/doxygen/doxygen/commit/b98846d0b57b78cd45d34e0962a8bcdc2e643e18">view</a>]</li> -<li>Alterative way to get rules information from flex [<a href="http://github.com/doxygen/doxygen/commit/224fa96dd9c9245bfdf68ee6f92160b7aa05f8d1">view</a>]</li> -<li>Better message in case doxygen -u is used [<a href="http://github.com/doxygen/doxygen/commit/cfd8c2415e7d0744a00bf1990f26aab538940f20">view</a>]</li> -<li>Changed "See Also" back to "See also" [<a href="http://github.com/doxygen/doxygen/commit/0754c968a4a06c8217c9301a5ca82c6212c228ec">view</a>]</li> -<li>Chm don't add images multiple times [<a href="http://github.com/doxygen/doxygen/commit/3b339813794390bdce59fa1009cf71506e0cec2b">view</a>]</li> -<li>Command \< and \> are not properly shown in section headers (and consequently in index) [<a href="http://github.com/doxygen/doxygen/commit/04a8ce9a8e2f022c21a5728ffdfb029258fa54e9">view</a>]</li> -<li>Consistency of usage of the word LaTeX in the documentation [<a href="http://github.com/doxygen/doxygen/commit/d63a7d8812c7f748a48d76bfc39ce57f79f6f667">view</a>]</li> -<li>Context enhancement [<a href="http://github.com/doxygen/doxygen/commit/92d53a473074a78735d25bbef02715b3caced569">view</a>]</li> -<li>Corrected some definitions for some Fortran keywords [<a href="http://github.com/doxygen/doxygen/commit/d4aa05e171d27cc17b177078d3ff481441087da4">view</a>]</li> -<li>Disabled config dependency check to avoid regression [<a href="http://github.com/doxygen/doxygen/commit/904ad3fbdc5e1615fdb052ba8562fc9b1329cd81">view</a>]</li> -<li>Documentation corrections [<a href="http://github.com/doxygen/doxygen/commit/4b51e6113f1e9e20a5700840d83f1c3928d84825">view</a>]</li> -<li>Enable Previous and Next buttons in chm output file [<a href="http://github.com/doxygen/doxygen/commit/e6a78b6b2573388353bdb5dcd7a13dcc11959d13">view</a>]</li> -<li>Enabling possibility to have { and } in (latex) index items [<a href="http://github.com/doxygen/doxygen/commit/dd2c137847e16d0a7c6086053f55bce501d84a0c">view</a>]</li> -<li>Error message is given for make distclean as generated_src is a directory [<a href="http://github.com/doxygen/doxygen/commit/76701e2bfb688ac22a751c4f03b28fa9d5f594f7">view</a>]</li> -<li>Extension in config.xml if type=string with format=image [<a href="http://github.com/doxygen/doxygen/commit/025cc9def72002d4ab6da7bfee8a73c03ca7c331">view</a>]</li> -<li>Extension specific filtering [<a href="http://github.com/doxygen/doxygen/commit/425e64e2ee52b92a2c0c8f6fb5457bf95b95e5bf">view</a>]</li> -<li>Fix id parsing for atx markdown headers [<a href="http://github.com/doxygen/doxygen/commit/ee830bb8888535ac48c0c4fd90580542e7f70481">view</a>]</li> -<li>Fix segfault on invalid bounding FIG when patching dot [<a href="http://github.com/doxygen/doxygen/commit/1bd2e38a2ce2d0823557381c48fe47cb53d6fba8">view</a>]</li> -<li>Fix to VHDL scanner. [<a href="http://github.com/doxygen/doxygen/commit/5ca7d423a11337d5c31082f52a287a3dc0986642">view</a>]</li> -<li>Fix typos in russian translation [<a href="http://github.com/doxygen/doxygen/commit/8ce2b0d7aec1d4398b5b4f365a7d3abbe75daf5f">view</a>]</li> -<li>Fixed Tidy's 'empty span' warning in HTML output [<a href="http://github.com/doxygen/doxygen/commit/8cfac90d6c8632436db1a6b650a05a8dfcfab5d0">view</a>]</li> -<li>Fixed compiler warnings in section.h [<a href="http://github.com/doxygen/doxygen/commit/683ef76f7bf1ba929f9c263064bb5f6c8e377275">view</a>]</li> -<li>Fixed difference between generated XML schema and XML files for HTML entities [<a href="http://github.com/doxygen/doxygen/commit/836af2f9510d10f2dd7d832025f214983387b3c6">view</a>]</li> -<li>Fixed issues with @parblock and added regression test case [<a href="http://github.com/doxygen/doxygen/commit/2ed3d33a92dbcdf0a0149c5f06909926e44cdebd">view</a>]</li> -<li>Fixed issues with SEPARATE_MEMBER_PAGES and INLINE_SIMPLE_STRUCTS [<a href="http://github.com/doxygen/doxygen/commit/a9f93437b6b2b9686e1b4f2e691782c6ebe99c26">view</a>]</li> -<li>Fixed memory leak in nested comment administration [<a href="http://github.com/doxygen/doxygen/commit/2514ba72e53473f8dd424efdbef34287c8a3fd56">view</a>]</li> -<li>Fixed off-by one error for last character in compound.xsd [<a href="http://github.com/doxygen/doxygen/commit/61b00c0061eda805696fe6f90db15136811e1ed7">view</a>]</li> -<li>Fixed potential crash caused by overloading the variadic warn function [<a href="http://github.com/doxygen/doxygen/commit/31505eb34565b2e39d113b7f5460645d02ad6d2e">view</a>]</li> -<li>Fixed problem handling Obj-C protocol list when proceeded by a newline [<a href="http://github.com/doxygen/doxygen/commit/09a5fc198a98d697d3e50c1c76392b8373f1af12">view</a>]</li> -<li>Fixed problem with ending a paragraph when htmlonly was at the end of a comment block [<a href="http://github.com/doxygen/doxygen/commit/8d03b3f35e404abfd0ed31022a687fc1eab07fd5">view</a>]</li> -<li>Fixed typo in changelog [<a href="http://github.com/doxygen/doxygen/commit/8f58d6dd7c3d0f6004d127bf111f76e4a4478516">view</a>]</li> -<li>Fixed typo in doxyindexer.vcproj [<a href="http://github.com/doxygen/doxygen/commit/2bc8a820b3e2fefaedb10a3129eed35581a1ea5b">view</a>]</li> -<li>Fixes for missing build dependencies [<a href="http://github.com/doxygen/doxygen/commit/62379ff8fdb13d95c7651419d92db47150e15bcc">view</a>]</li> -<li>Give message when PROJECT_LOGO cannot be found or cannot be converted [<a href="http://github.com/doxygen/doxygen/commit/164864d9bc8ea7e32a69fbc0e47cff54dc678a48">view</a>]</li> -<li>Handlingh of -- by \c and <code> results in - adjusted documentation [<a href="http://github.com/doxygen/doxygen/commit/73d12cc5cf0656e94125baea62cdb19b67908b3d">view</a>]</li> -<li>Improve rendering of sub and superscripts in LaTeX [<a href="http://github.com/doxygen/doxygen/commit/a7c7f36ea2a67969bf3916c7600fe487e34438c0">view</a>]</li> -<li>Improved handling of percent symbol [<a href="http://github.com/doxygen/doxygen/commit/0e080f486f67008ef427c834f6ab6ebca7578124">view</a>]</li> -<li>Improved performance of rendering large index pages, by replacing images in the tables by spans [<a href="http://github.com/doxygen/doxygen/commit/956a7fb004e72923f737e387d053812f99b7bda2">view</a>]</li> -<li>In case of sections with the same name they are not reported. [<a href="http://github.com/doxygen/doxygen/commit/ac611be473c2d9bf65bcafb53b0577274c4ae706">view</a>]</li> -<li>Inconsistency in usage of simplesecr versus simplesectsep corrected [<a href="http://github.com/doxygen/doxygen/commit/bc46b90c42470e238a6e038f49a7423796a8c2e3">view</a>]</li> -<li>Inconsistency in usage of simplesecr versus simplesectsep corrected [<a href="http://github.com/doxygen/doxygen/commit/c5bedcdc2e3b6c519aae62ff1a08d4ec808cce6b">view</a>]</li> -<li>Incorrect handling dependencies [<a href="http://github.com/doxygen/doxygen/commit/bfcfa6fc73942b80cb22e2900438dc99d844a78e">view</a>]</li> -<li>Items XML_SCHEMA and XML_DTD declared obsolete [<a href="http://github.com/doxygen/doxygen/commit/ba31ee73aad3bdc6b3854add2db01c302c9cf19c">view</a>]</li> -<li>List only the project pages in "Related Pages" [<a href="http://github.com/doxygen/doxygen/commit/a2c7f91d6320f72951f1e3ef092e077a89562670">view</a>]</li> -<li>Made documentation more consistent [<a href="http://github.com/doxygen/doxygen/commit/b81fe14c7fe8b3eaafa4ce8ddcd0f1815c2c7ff0">view</a>]</li> -<li>Make sure all ids in g_linkRefs are lower case [<a href="http://github.com/doxygen/doxygen/commit/3df31762585075033a04e40c3cdfb52781aa258f">view</a>]</li> -<li>Make the MAN_SUBDIR setting override the name of the directory the man pages are placed in. [<a href="http://github.com/doxygen/doxygen/commit/83b344db49b27bf68994eb8ec6be87d6d0f24e86">view</a>]</li> -<li>Meta tag in the HTML search page was not closed properly [<a href="http://github.com/doxygen/doxygen/commit/4ccfb9efa8382de50dfc5b176cb147fd1b05870c">view</a>]</li> -<li>Minor fixes for the new build locations [<a href="http://github.com/doxygen/doxygen/commit/d86520ef4920a9a47a4d6e33eadfc62b8b983748">view</a>]</li> -<li>Missing & and chars after " in tree of chm documentation [<a href="http://github.com/doxygen/doxygen/commit/89638fbc9961bd9a1e9cb7bc25e5f739936e8a43">view</a>]</li> -<li>More context changes [<a href="http://github.com/doxygen/doxygen/commit/196f39515ec5f9fdcbda68046f48a1d1a8250854">view</a>]</li> -<li>More work on the template and context mechanisms [<a href="http://github.com/doxygen/doxygen/commit/744d1ca52e25dfa9e3d656056d87ed7cb6320585">view</a>]</li> -<li>On windows citelist.doc remains [<a href="http://github.com/doxygen/doxygen/commit/3c941f24ee93687c197363fa2d4b787512878eab">view</a>]</li> -<li>Place where dot executable is found [<a href="http://github.com/doxygen/doxygen/commit/90ecc2487146e0cdd392047342a30fd13453b233">view</a>]</li> -<li>Properly escape the XCODE path. [<a href="http://github.com/doxygen/doxygen/commit/0cc8f6b2a14fdeb6d6769d34edb035b755d1299f">view</a>]</li> -<li>Pull out property names in Objective-C. [<a href="http://github.com/doxygen/doxygen/commit/f4ff0ea8b11560ce718bb41b63bdf793cd333f27">view</a>]</li> -<li>Recognize all HTML4 special character entities [<a href="http://github.com/doxygen/doxygen/commit/1bd64ac0e925ba2ff069ec64c026ea3c32f85600">view</a>]</li> -<li>Reduced and improved functionality of QList [<a href="http://github.com/doxygen/doxygen/commit/6e51abf63021dc9fe32c05f003232fe68a08591d">view</a>]</li> -<li>Removed config.doc as it is generated by configgen.py [<a href="http://github.com/doxygen/doxygen/commit/a642629761d43d53f3ade41c78530d0c7228a84d">view</a>]</li> -<li>Removed generated file src/settings.h from source repository [<a href="http://github.com/doxygen/doxygen/commit/43461e44d49200fd1564c4e416db7384e7e5eab8">view</a>]</li> -<li>Removed message, minor restructuring [<a href="http://github.com/doxygen/doxygen/commit/ea436bd659e022d6375dd37f651d4bb18a1c01db">view</a>]</li> -<li>Removed remark about installdox from the FAQ [<a href="http://github.com/doxygen/doxygen/commit/68080883535bb146e2e4f65943c8b836da6b68e0">view</a>]</li> -<li>Restructured html entity handling [<a href="http://github.com/doxygen/doxygen/commit/dfa20277697fe904a0846b60a01cc388fc13c933">view</a>]</li> -<li>Reverted #132 after submitter reported that it did not work [<a href="http://github.com/doxygen/doxygen/commit/fdc81edcd47ce176648d7507d0597294098ae8aa">view</a>]</li> -<li>Showing error message on windows in case on error on startup [<a href="http://github.com/doxygen/doxygen/commit/6a0651d9328262271ade2b733c125aae4415e3c3">view</a>]</li> -<li>Simplified LaTeX header/footer escaping [<a href="http://github.com/doxygen/doxygen/commit/3337add3a6e05e26800c9e269b23fff272a9534c">view</a>]</li> -<li>Some restructuring and some compiler warning fixes [<a href="http://github.com/doxygen/doxygen/commit/941eea998d6b9608b8fc586069ef90e805d771f5">view</a>]</li> -<li>Spitting generated files better from source files [<a href="http://github.com/doxygen/doxygen/commit/8885016b2a3bbeb6045a3e71d508939e0a7bd773">view</a>]</li> -<li>Superfluous < sign [<a href="http://github.com/doxygen/doxygen/commit/599700e6e72d687b6597cfbe2453474b231640ea">view</a>]</li> -<li>Superfluous backslash in documentation [<a href="http://github.com/doxygen/doxygen/commit/be5f9c70bcf38f9bce58e4b8e293dab6aea754fd">view</a>]</li> -<li>Superfluous include removed [<a href="http://github.com/doxygen/doxygen/commit/0e12f6bfa938b675f827074eb3693eff362e6b96">view</a>]</li> -<li>Undo previous commit [<a href="http://github.com/doxygen/doxygen/commit/1b5d5e53a7fce8136f9ab0ce82c95a8f9d479574">view</a>]</li> -<li>Unified DirFileContext and NestingContext [<a href="http://github.com/doxygen/doxygen/commit/df839603204979113b96678e2ab21b3eba64476c">view</a>]</li> -<li>Update doctokenizer.l [<a href="http://github.com/doxygen/doxygen/commit/68cf977ee72f8914678e30e3a88f0e9d90703418">view</a>]</li> -<li>Update doctokenizer.l [<a href="http://github.com/doxygen/doxygen/commit/ea1ee635fccbba4273a922dab3d092dd75b195e0">view</a>]</li> -<li>Updated copyright [<a href="http://github.com/doxygen/doxygen/commit/a28ff2331d8e228d901cd6f0b038f76e1cee630a">view</a>]</li> -<li>Use \newline i.s.o. \par for linebreaks in LaTeX [<a href="http://github.com/doxygen/doxygen/commit/7e719d1ad5da33ccb3f54a90ae11dee58828b6ab">view</a>]</li> -<li>Use hook arrow for hyphens in symbol names in the LaTeX output. [<a href="http://github.com/doxygen/doxygen/commit/ac813134a85ba9bd999fb4cf8271c74e02cd4ebb">view</a>]</li> -<li>Wrong UTF 8 codes [<a href="http://github.com/doxygen/doxygen/commit/fd4beb272e5f1a760a71ab8d85463b8356c6f786">view</a>]</li> -<li>Fix broken links to subpages in LaTeX output [<a href="http://github.com/doxygen/doxygen/commit/10189681dcb46e543a287827e2096cef3dbc42ae">view</a>]</li> -<li>\xmlonly aoppeared twice in see also section of \htmlonly and \docbookonly [<a href="http://github.com/doxygen/doxygen/commit/f1cdb27194dd180f1bff1fbdd87874bb0d15758d">view</a>]</li> -<li>add css-escape to avoid jquery based xss [<a href="http://github.com/doxygen/doxygen/commit/7fea82094723ecfb4e9b3ea6819137b99d7dfa9c">view</a>]</li> -<li>add parameter [<a href="http://github.com/doxygen/doxygen/commit/c5bc9fc8c407aac845d594b2685d0c92699727d8">view</a>]</li> -<li>add search.py, a client for doxygen_sqlite3.db [<a href="http://github.com/doxygen/doxygen/commit/697ac97aad7fa045b6cc205050b69cf3f22408ad">view</a>]</li> -<li>add space between br and / for better compatibility [<a href="http://github.com/doxygen/doxygen/commit/2a40448c3855da250561fa4bac01179311831307">view</a>]</li> -<li>added option to have numbers in the bookmark pane (PDF output) [<a href="http://github.com/doxygen/doxygen/commit/62cf79095c4d02ff1c737e02f91f8dcea2175b9e">view</a>]</li> -<li>config.l: dependency checks for booleans [<a href="http://github.com/doxygen/doxygen/commit/5d64c0e2f39730bb5decd86a483a5b0823a67958">view</a>]</li> -<li>detect python2 as Python 2 binary [<a href="http://github.com/doxygen/doxygen/commit/3754cd80cae41b23dc1069245ad5acdc460b8809">view</a>]</li> -<li>fixed compile issue on Linux [<a href="http://github.com/doxygen/doxygen/commit/e3c636337323ba6e3f21bf1e8cfe2a899a8890c1">view</a>]</li> -<li>pass libclang header file location; add paths for Ubuntu's llvm-3.4 [<a href="http://github.com/doxygen/doxygen/commit/2613bf77ccbeee4721a17a8168dead071e41b45e">view</a>]</li> -<li>sqlite3: SQLITE_TRANSIENTs [<a href="http://github.com/doxygen/doxygen/commit/6f38dd245d56aaa9b6c8e966a4ccebe2f66ceb7d">view</a>]</li> -<li>sqlite3: add new searches to search.py [<a href="http://github.com/doxygen/doxygen/commit/c99422b0c7919e953811a3a06e18c7cacbacd7c6">view</a>]</li> -<li>sqlite3: clear bindings on errors and more care with return [<a href="http://github.com/doxygen/doxygen/commit/1a708967ba0c4a5604c1ac7d8f3c8112ec3e7044">view</a>]</li> -<li>sqlite3: extract more info [<a href="http://github.com/doxygen/doxygen/commit/cd4bdf6708194228434bed1f71d1cd698863aaaf">view</a>]</li> -<li>sqlite3: fedora has libsqlite3.so in /usr/lib64 [<a href="http://github.com/doxygen/doxygen/commit/49f65d1ee1c9005e019ec95a933ec5fcf02556c9">view</a>]</li> -<li>sqlite3: leave out insertMemberReference until xref location is valid [<a href="http://github.com/doxygen/doxygen/commit/2349f4b3ff931e334b3d3e09b3e03861a7630f86">view</a>]</li> -<li>sqlite3: remove some debug messages [<a href="http://github.com/doxygen/doxygen/commit/f76ec80dc8d1d7910951b34582ac25ce6f0efe4d">view</a>]</li> -<li>sqlite3: speedup the SELECTs [<a href="http://github.com/doxygen/doxygen/commit/d7f9bbedaa4b4fcc0253470d522149a2307d1020">view</a>]</li> -<li>sqlite3: updates [<a href="http://github.com/doxygen/doxygen/commit/2b80c416671220315a11287b6e10d5b3b2f852cc">view</a>]</li> -<li>sqlite3: use the new qtools API [<a href="http://github.com/doxygen/doxygen/commit/54fbd99c753e09b1c3850af6b8b4457d339b6e84">view</a>]</li> -<li>testsqlite3: a test for sqlite3gen [<a href="http://github.com/doxygen/doxygen/commit/733aaaa073a92a316ba888b6992f1172550dd469">view</a>]</li> -<li>util/patternMatch: break when pattern is found [<a href="http://github.com/doxygen/doxygen/commit/6d8c3184fadb1834223236b13471797089e4a004">view</a>]</li> -<li>util/patternMatch: don't extract a QCString(QFileInfo) each time we QRegExp.match [<a href="http://github.com/doxygen/doxygen/commit/8991d11cc824f40c11a28ccc38c09e9b10f722c3">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2479">2479</a> - c-source and h-source missing for latex [<a href="https://github.com/doxygen/doxygen/commit/d5d34325fb9bed776cf2b4facc0c341f701e780b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3879">3879</a> - FORTRAN: recognition free versus fixed formatted code [<a href="https://github.com/doxygen/doxygen/commit/2dec1060623165057628ee678eb3580351922408">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3893">3893</a> - Latex $projectname with "&" gets no escaped [<a href="https://github.com/doxygen/doxygen/commit/586b3b69238fb09d55a03c5d50fc1b7d3e65ed97">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4179">4179</a> - Fortran: variable with name "type" confuses doxygen [<a href="https://github.com/doxygen/doxygen/commit/17c5b6160d013d118296663e133cf8884c74a939">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4683">4683</a> - Percent to prevent auto-linking in page title is not removed for navpath [<a href="https://github.com/doxygen/doxygen/commit/5d44acc0a49bd7b990bfe649efa312f5f0bb594b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4762">4762</a> - Nested \if messes up list items [<a href="https://github.com/doxygen/doxygen/commit/7f4414b92a1c2147b073dd3cf58e0db7c8a88be6">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4762">4762</a> - Nested \if messes up list items [<a href="https://github.com/doxygen/doxygen/commit/de502ca71fc1c20ed93209f6a223c488eee38297">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4870">4870</a> - Command ignored when using umlauts in markdown and also C-comments in markdown didn't work properly [<a href="https://github.com/doxygen/doxygen/commit/b4b40f4c7ea57655d1264e8f72c754526e3a9209">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5052">5052</a> - Notes in xml output are not correctly separated [<a href="https://github.com/doxygen/doxygen/commit/bc61f00f142792dfbe97c361d9fecd3ea2850f5e">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5254">5254</a> - Enables using unicode (non ASCII) to name output files [<a href="https://github.com/doxygen/doxygen/commit/d5fb69739a1b2facf32a63ca94c12d097f8278cc">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5258">5258</a> - Nested namespace causes incorrect display when referenced via .tag file [<a href="https://github.com/doxygen/doxygen/commit/1bdbbc60982f2f61f4e0423c9fc8c4a24cfb2e94">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5348">5348</a> - Documentation for enumeration not generated [<a href="https://github.com/doxygen/doxygen/commit/1bb36723a522b371810606c2f6504d0374a7b027">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5383">5383</a> - Code coloring in case of file without extension [<a href="https://github.com/doxygen/doxygen/commit/45934e88fa961686c00be1ad272a088f4e7eac0b">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5387">5387</a> - Trouble with /cond /endcond [<a href="https://github.com/doxygen/doxygen/commit/2912829ca5bced897a2c063d1883b9cfd39d3bd9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5388">5388</a> - Wrong call graph in simple situation [<a href="https://github.com/doxygen/doxygen/commit/e12d6b506862c8ad843b7853bc1c9ceb5d0ccb4d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5389">5389</a> - [Latex/PDF] Merging brief and detailed description in file section [<a href="https://github.com/doxygen/doxygen/commit/a99c33838057acba20768ca32681e1f379f36ca0">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5390">5390</a> - Parsing problem with C++11 empty initializer lists [<a href="https://github.com/doxygen/doxygen/commit/1bfacc3b8e589907352eff923b7b3aa73cfc5138">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5393">5393</a> - Move constructors and move assignment operators of embedded classes of template classes cannot be matched. [<a href="https://github.com/doxygen/doxygen/commit/1d0c9b6fefb6c2e0a9a2b7a7ea3192ccace33710">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5396">5396</a> - Dia diagrams not displayed by Firefox [<a href="https://github.com/doxygen/doxygen/commit/5ea2f2a123e473d5964435369fd925d7f103b456">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5404">5404</a> - regression referencing namespaced type [<a href="https://github.com/doxygen/doxygen/commit/9b76c1a9bb7039962933aeef398bb7aa2f59c3a5">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5408">5408</a> - doxygen nested \if \endif sample not working [<a href="https://github.com/doxygen/doxygen/commit/cc78b12b0019fbcb17692b231d38ba75d0952201">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5410">5410</a> - doxygen 1.8.6 sorts the contents of a namespace by group within the Class List [<a href="https://github.com/doxygen/doxygen/commit/f9b80aff6d20524dd0838aff12033fe3df66ba98">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5414">5414</a> - Link refs with no title swallow an extra newline [<a href="https://github.com/doxygen/doxygen/commit/60ea06a68f2e355e34b61bf45babc6405bfbfe84">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5415">5415</a> - Documentation for derived classes no longer has an "Additional Inherited Members" section after upgrading doxygen from 1.8.3.1 to 1.8.6 [<a href="https://github.com/doxygen/doxygen/commit/0e9da9fb27147c5685088019afd428a0aaa901fa">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5416">5416</a> - configure --prefix=/opt/foo not accepted [<a href="https://github.com/doxygen/doxygen/commit/bc7e6301e2d1474592f6cd6cc07624852d1b5016">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5417">5417</a> - Command \| not working when last character in markdown table line [<a href="https://github.com/doxygen/doxygen/commit/8309fbd9e639eaf9e763e83ca7a228c659450a57">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5421">5421</a> - Last line of code block lost if it is only one character and there is no text afterward [<a href="https://github.com/doxygen/doxygen/commit/4d1951ebb648bbc92464904305cafc7fc0dba557">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5422">5422</a> - Doxygen crashes on incorrect end group /**< @} */ [<a href="https://github.com/doxygen/doxygen/commit/b4d5ef176eced8315523baea464cfda733ecb9aa">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5424">5424</a> - star is not printed in \code environment [<a href="https://github.com/doxygen/doxygen/commit/0eaf1cd5d2eac57666b5ffea9e0f948b7a3e6b3a">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5425">5425</a> - Internal inconsistency: namespace in IDL [<a href="https://github.com/doxygen/doxygen/commit/b0456fbefa864b33611f289818deeaaf791c17c9">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5428">5428</a> - Server side (PHP) search broke in 1.8.3 [<a href="https://github.com/doxygen/doxygen/commit/1d2bb19e394850ecb37bea06ef4e5d15fe06e7b0">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5436">5436</a> - python3 import style causes doxygen to ignore some inheritances [<a href="https://github.com/doxygen/doxygen/commit/513ce9aafd05add9b5c1e67e843e540f8937cf63">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5437">5437</a> - Markdown Extra - fenced code block: '>' before tab width parsed as block quote [<a href="https://github.com/doxygen/doxygen/commit/3598e8fdf7ee61a281480fec09f63669710ac35d">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5438">5438</a> - Tilde sign in combination with <pre> and MARKDOWN_SUPPORT disabled [<a href="https://github.com/doxygen/doxygen/commit/721764a1b3c63c77ff0792beb6c37fbfee0f87bb">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5439">5439</a> - Blockquote followed by text inserts an extra paragraph [<a href="https://github.com/doxygen/doxygen/commit/518fccbbadba3136a29c895f3606f40fa220fe47">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5440">5440</a> - alignment of blockquotes in pdf [<a href="https://github.com/doxygen/doxygen/commit/9059295fd6e178804f2f2d95ffe3764645ecc026">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5449">5449</a> - Build fails when --with-libclang on Fedora [<a href="https://github.com/doxygen/doxygen/commit/837d63319a7b014412cb3cb2b5d27d2474a932c2">view</a>]</li> +<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5456">5456</a> - Crash on \addindex \term [<a href="https://github.com/doxygen/doxygen/commit/653a2a8b123b79835af9f684f8b92ef7f88712aa">view</a>]</li> +<li>A new files have been added but is not incorporated in the windows build part [<a href="https://github.com/doxygen/doxygen/commit/d9dd873e25fba968ddcbcc79d6643f5df669b626">view</a>]</li> +<li>Add docbook directory to be removed as well [<a href="https://github.com/doxygen/doxygen/commit/08ea10029e705a388ab14ee29544d496a203f23f">view</a>]</li> +<li>Add extra (documenattion) directories to ignore pattern [<a href="https://github.com/doxygen/doxygen/commit/db358b1f219fecf0d7df96d8c70b47b245471c66">view</a>]</li> +<li>Add index support to context [<a href="https://github.com/doxygen/doxygen/commit/12cd22f4c32ed8b92da7b5a03181aa6735018a5b">view</a>]</li> +<li>Add line numbers in case comment is not closed properly. [<a href="https://github.com/doxygen/doxygen/commit/b1d513b2ac65fe26ceec2fa494867713efa01cd5">view</a>]</li> +<li>Add template context for annotated class index [<a href="https://github.com/doxygen/doxygen/commit/9434ecb13e1f3e2901b78d3e41e7f1d7d9469434">view</a>]</li> +<li>Add validation of internal consistency to html entity mapper [<a href="https://github.com/doxygen/doxygen/commit/d96458ce99b92590a8fec0aba46c67b6816fa632">view</a>]</li> +<li>Add warning when encountering a nested comment start (/*) without matching end (*/). [<a href="https://github.com/doxygen/doxygen/commit/7f30d0afbeb9565bced1439f86ce9f862de5282e">view</a>]</li> +<li>Added \latexinclude command (thanks to Juan Zaratiegui for the patch) [<a href="https://github.com/doxygen/doxygen/commit/1134237afe25f86fcf7c7e2a76a3542eee8acc79">view</a>]</li> +<li>Added basic arithmetic operations to the template expressions, and made the expression lexer faster [<a href="https://github.com/doxygen/doxygen/commit/5af2b7c0aef5cd6a0dc6ceddcffba16f623d920a">view</a>]</li> +<li>Added dir tree nodes to the context [<a href="https://github.com/doxygen/doxygen/commit/762ee821bb0bef125d5406572963ce32c748e227">view</a>]</li> +<li>Added directory info to the context [<a href="https://github.com/doxygen/doxygen/commit/47adeb82d67208db88a4aaae5c3427291462611a">view</a>]</li> +<li>Added doc/config.doc to .gitignore [<a href="https://github.com/doxygen/doxygen/commit/fa400a0252d12db3ffd30eb083e5185f11264112">view</a>]</li> +<li>Added language update for Swedish (thanks to Björn Palmqvist) [<a href="https://github.com/doxygen/doxygen/commit/eec2140f577431915ed087727093c5bf381500ba">view</a>]</li> +<li>Added last and first attributes to index tree node [<a href="https://github.com/doxygen/doxygen/commit/ff5ec803a39b225e03edcd1bf2df3198dafcc16e">view</a>]</li> +<li>Added missing \+ command to build LaTeX manual [<a href="https://github.com/doxygen/doxygen/commit/c096119b0c0bfc567058538b6225ca26eb191a3a">view</a>]</li> +<li>Added new language maintainer for Swedish, removed generated file language.doc [<a href="https://github.com/doxygen/doxygen/commit/f3172cf19514fc05588878d3fabfffe479495cca">view</a>]</li> +<li>Added optional [block] option to \htmlonly [<a href="https://github.com/doxygen/doxygen/commit/842c816a31537e32cec376c85c0a4363f74d7a54">view</a>]</li> +<li>Added reference counting for all context objects [<a href="https://github.com/doxygen/doxygen/commit/ff00706a18b6e57419796ffd6f1448cb2ccb9436">view</a>]</li> +<li>Added stricter URL filtering to prevent DOM Based XSS when the tree view is enabled [<a href="https://github.com/doxygen/doxygen/commit/8ba739ad1ecde1036bfe2e364aee378e137f6dff">view</a>]</li> +<li>Added support for \-- and \--- to prevent interpretation as ndash and mdash [<a href="https://github.com/doxygen/doxygen/commit/385b87e08c23b1392d0e6d6fbdb6ef463fa28477">view</a>]</li> +<li>Added support for elif to the template language [<a href="https://github.com/doxygen/doxygen/commit/ae3a22ba276a2e446a460274e0bff8a9bdf4af7d">view</a>]</li> +<li>Added support for range tag in the template language [<a href="https://github.com/doxygen/doxygen/commit/b98846d0b57b78cd45d34e0962a8bcdc2e643e18">view</a>]</li> +<li>Alternative way to get rules information from flex [<a href="https://github.com/doxygen/doxygen/commit/224fa96dd9c9245bfdf68ee6f92160b7aa05f8d1">view</a>]</li> +<li>Better message in case doxygen -u is used [<a href="https://github.com/doxygen/doxygen/commit/cfd8c2415e7d0744a00bf1990f26aab538940f20">view</a>]</li> +<li>Changed "See Also" back to "See also" [<a href="https://github.com/doxygen/doxygen/commit/0754c968a4a06c8217c9301a5ca82c6212c228ec">view</a>]</li> +<li>Chm don't add images multiple times [<a href="https://github.com/doxygen/doxygen/commit/3b339813794390bdce59fa1009cf71506e0cec2b">view</a>]</li> +<li>Command \< and \> are not properly shown in section headers (and consequently in index) [<a href="https://github.com/doxygen/doxygen/commit/04a8ce9a8e2f022c21a5728ffdfb029258fa54e9">view</a>]</li> +<li>Consistency of usage of the word LaTeX in the documentation [<a href="https://github.com/doxygen/doxygen/commit/d63a7d8812c7f748a48d76bfc39ce57f79f6f667">view</a>]</li> +<li>Context enhancement [<a href="https://github.com/doxygen/doxygen/commit/92d53a473074a78735d25bbef02715b3caced569">view</a>]</li> +<li>Corrected some definitions for some Fortran keywords [<a href="https://github.com/doxygen/doxygen/commit/d4aa05e171d27cc17b177078d3ff481441087da4">view</a>]</li> +<li>Disabled config dependency check to avoid regression [<a href="https://github.com/doxygen/doxygen/commit/904ad3fbdc5e1615fdb052ba8562fc9b1329cd81">view</a>]</li> +<li>Documentation corrections [<a href="https://github.com/doxygen/doxygen/commit/4b51e6113f1e9e20a5700840d83f1c3928d84825">view</a>]</li> +<li>Enable Previous and Next buttons in chm output file [<a href="https://github.com/doxygen/doxygen/commit/e6a78b6b2573388353bdb5dcd7a13dcc11959d13">view</a>]</li> +<li>Enabling possibility to have { and } in (latex) index items [<a href="https://github.com/doxygen/doxygen/commit/dd2c137847e16d0a7c6086053f55bce501d84a0c">view</a>]</li> +<li>Error message is given for make distclean as generated_src is a directory [<a href="https://github.com/doxygen/doxygen/commit/76701e2bfb688ac22a751c4f03b28fa9d5f594f7">view</a>]</li> +<li>Extension in config.xml if type=string with format=image [<a href="https://github.com/doxygen/doxygen/commit/025cc9def72002d4ab6da7bfee8a73c03ca7c331">view</a>]</li> +<li>Extension specific filtering [<a href="https://github.com/doxygen/doxygen/commit/425e64e2ee52b92a2c0c8f6fb5457bf95b95e5bf">view</a>]</li> +<li>Fix id parsing for atx markdown headers [<a href="https://github.com/doxygen/doxygen/commit/ee830bb8888535ac48c0c4fd90580542e7f70481">view</a>]</li> +<li>Fix segfault on invalid bounding FIG when patching dot [<a href="https://github.com/doxygen/doxygen/commit/1bd2e38a2ce2d0823557381c48fe47cb53d6fba8">view</a>]</li> +<li>Fix to VHDL scanner. [<a href="https://github.com/doxygen/doxygen/commit/5ca7d423a11337d5c31082f52a287a3dc0986642">view</a>]</li> +<li>Fix typos in russian translation [<a href="https://github.com/doxygen/doxygen/commit/8ce2b0d7aec1d4398b5b4f365a7d3abbe75daf5f">view</a>]</li> +<li>Fixed Tidy's 'empty span' warning in HTML output [<a href="https://github.com/doxygen/doxygen/commit/8cfac90d6c8632436db1a6b650a05a8dfcfab5d0">view</a>]</li> +<li>Fixed compiler warnings in section.h [<a href="https://github.com/doxygen/doxygen/commit/683ef76f7bf1ba929f9c263064bb5f6c8e377275">view</a>]</li> +<li>Fixed difference between generated XML schema and XML files for HTML entities [<a href="https://github.com/doxygen/doxygen/commit/836af2f9510d10f2dd7d832025f214983387b3c6">view</a>]</li> +<li>Fixed issues with @parblock and added regression test case [<a href="https://github.com/doxygen/doxygen/commit/2ed3d33a92dbcdf0a0149c5f06909926e44cdebd">view</a>]</li> +<li>Fixed issues with SEPARATE_MEMBER_PAGES and INLINE_SIMPLE_STRUCTS [<a href="https://github.com/doxygen/doxygen/commit/a9f93437b6b2b9686e1b4f2e691782c6ebe99c26">view</a>]</li> +<li>Fixed memory leak in nested comment administration [<a href="https://github.com/doxygen/doxygen/commit/2514ba72e53473f8dd424efdbef34287c8a3fd56">view</a>]</li> +<li>Fixed off-by one error for last character in compound.xsd [<a href="https://github.com/doxygen/doxygen/commit/61b00c0061eda805696fe6f90db15136811e1ed7">view</a>]</li> +<li>Fixed potential crash caused by overloading the variadic warn function [<a href="https://github.com/doxygen/doxygen/commit/31505eb34565b2e39d113b7f5460645d02ad6d2e">view</a>]</li> +<li>Fixed problem handling Obj-C protocol list when proceeded by a newline [<a href="https://github.com/doxygen/doxygen/commit/09a5fc198a98d697d3e50c1c76392b8373f1af12">view</a>]</li> +<li>Fixed problem with ending a paragraph when htmlonly was at the end of a comment block [<a href="https://github.com/doxygen/doxygen/commit/8d03b3f35e404abfd0ed31022a687fc1eab07fd5">view</a>]</li> +<li>Fixed typo in changelog [<a href="https://github.com/doxygen/doxygen/commit/8f58d6dd7c3d0f6004d127bf111f76e4a4478516">view</a>]</li> +<li>Fixed typo in doxyindexer.vcproj [<a href="https://github.com/doxygen/doxygen/commit/2bc8a820b3e2fefaedb10a3129eed35581a1ea5b">view</a>]</li> +<li>Fixes for missing build dependencies [<a href="https://github.com/doxygen/doxygen/commit/62379ff8fdb13d95c7651419d92db47150e15bcc">view</a>]</li> +<li>Give message when PROJECT_LOGO cannot be found or cannot be converted [<a href="https://github.com/doxygen/doxygen/commit/164864d9bc8ea7e32a69fbc0e47cff54dc678a48">view</a>]</li> +<li>Handlingh of -- by \c and <code> results in - adjusted documentation [<a href="https://github.com/doxygen/doxygen/commit/73d12cc5cf0656e94125baea62cdb19b67908b3d">view</a>]</li> +<li>Improve rendering of sub and superscripts in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/a7c7f36ea2a67969bf3916c7600fe487e34438c0">view</a>]</li> +<li>Improved handling of percent symbol [<a href="https://github.com/doxygen/doxygen/commit/0e080f486f67008ef427c834f6ab6ebca7578124">view</a>]</li> +<li>Improved performance of rendering large index pages, by replacing images in the tables by spans [<a href="https://github.com/doxygen/doxygen/commit/956a7fb004e72923f737e387d053812f99b7bda2">view</a>]</li> +<li>In case of sections with the same name they are not reported. [<a href="https://github.com/doxygen/doxygen/commit/ac611be473c2d9bf65bcafb53b0577274c4ae706">view</a>]</li> +<li>Inconsistency in usage of simplesecr versus simplesectsep corrected [<a href="https://github.com/doxygen/doxygen/commit/bc46b90c42470e238a6e038f49a7423796a8c2e3">view</a>]</li> +<li>Inconsistency in usage of simplesecr versus simplesectsep corrected [<a href="https://github.com/doxygen/doxygen/commit/c5bedcdc2e3b6c519aae62ff1a08d4ec808cce6b">view</a>]</li> +<li>Incorrect handling dependencies [<a href="https://github.com/doxygen/doxygen/commit/bfcfa6fc73942b80cb22e2900438dc99d844a78e">view</a>]</li> +<li>Items XML_SCHEMA and XML_DTD declared obsolete [<a href="https://github.com/doxygen/doxygen/commit/ba31ee73aad3bdc6b3854add2db01c302c9cf19c">view</a>]</li> +<li>List only the project pages in "Related Pages" [<a href="https://github.com/doxygen/doxygen/commit/a2c7f91d6320f72951f1e3ef092e077a89562670">view</a>]</li> +<li>Made documentation more consistent [<a href="https://github.com/doxygen/doxygen/commit/b81fe14c7fe8b3eaafa4ce8ddcd0f1815c2c7ff0">view</a>]</li> +<li>Make sure all ids in g_linkRefs are lower case [<a href="https://github.com/doxygen/doxygen/commit/3df31762585075033a04e40c3cdfb52781aa258f">view</a>]</li> +<li>Make the MAN_SUBDIR setting override the name of the directory the man pages are placed in. [<a href="https://github.com/doxygen/doxygen/commit/83b344db49b27bf68994eb8ec6be87d6d0f24e86">view</a>]</li> +<li>Meta tag in the HTML search page was not closed properly [<a href="https://github.com/doxygen/doxygen/commit/4ccfb9efa8382de50dfc5b176cb147fd1b05870c">view</a>]</li> +<li>Minor fixes for the new build locations [<a href="https://github.com/doxygen/doxygen/commit/d86520ef4920a9a47a4d6e33eadfc62b8b983748">view</a>]</li> +<li>Missing & and chars after " in tree of chm documentation [<a href="https://github.com/doxygen/doxygen/commit/89638fbc9961bd9a1e9cb7bc25e5f739936e8a43">view</a>]</li> +<li>More context changes [<a href="https://github.com/doxygen/doxygen/commit/196f39515ec5f9fdcbda68046f48a1d1a8250854">view</a>]</li> +<li>More work on the template and context mechanisms [<a href="https://github.com/doxygen/doxygen/commit/744d1ca52e25dfa9e3d656056d87ed7cb6320585">view</a>]</li> +<li>On windows citelist.doc remains [<a href="https://github.com/doxygen/doxygen/commit/3c941f24ee93687c197363fa2d4b787512878eab">view</a>]</li> +<li>Place where dot executable is found [<a href="https://github.com/doxygen/doxygen/commit/90ecc2487146e0cdd392047342a30fd13453b233">view</a>]</li> +<li>Properly escape the XCODE path. [<a href="https://github.com/doxygen/doxygen/commit/0cc8f6b2a14fdeb6d6769d34edb035b755d1299f">view</a>]</li> +<li>Pull out property names in Objective-C. [<a href="https://github.com/doxygen/doxygen/commit/f4ff0ea8b11560ce718bb41b63bdf793cd333f27">view</a>]</li> +<li>Recognize all HTML4 special character entities [<a href="https://github.com/doxygen/doxygen/commit/1bd64ac0e925ba2ff069ec64c026ea3c32f85600">view</a>]</li> +<li>Reduced and improved functionality of QList [<a href="https://github.com/doxygen/doxygen/commit/6e51abf63021dc9fe32c05f003232fe68a08591d">view</a>]</li> +<li>Removed config.doc as it is generated by configgen.py [<a href="https://github.com/doxygen/doxygen/commit/a642629761d43d53f3ade41c78530d0c7228a84d">view</a>]</li> +<li>Removed generated file src/settings.h from source repository [<a href="https://github.com/doxygen/doxygen/commit/43461e44d49200fd1564c4e416db7384e7e5eab8">view</a>]</li> +<li>Removed message, minor restructuring [<a href="https://github.com/doxygen/doxygen/commit/ea436bd659e022d6375dd37f651d4bb18a1c01db">view</a>]</li> +<li>Removed remark about installdox from the FAQ [<a href="https://github.com/doxygen/doxygen/commit/68080883535bb146e2e4f65943c8b836da6b68e0">view</a>]</li> +<li>Restructured html entity handling [<a href="https://github.com/doxygen/doxygen/commit/dfa20277697fe904a0846b60a01cc388fc13c933">view</a>]</li> +<li>Reverted #132 after submitter reported that it did not work [<a href="https://github.com/doxygen/doxygen/commit/fdc81edcd47ce176648d7507d0597294098ae8aa">view</a>]</li> +<li>Showing error message on windows in case on error on startup [<a href="https://github.com/doxygen/doxygen/commit/6a0651d9328262271ade2b733c125aae4415e3c3">view</a>]</li> +<li>Simplified LaTeX header/footer escaping [<a href="https://github.com/doxygen/doxygen/commit/3337add3a6e05e26800c9e269b23fff272a9534c">view</a>]</li> +<li>Some restructuring and some compiler warning fixes [<a href="https://github.com/doxygen/doxygen/commit/941eea998d6b9608b8fc586069ef90e805d771f5">view</a>]</li> +<li>Spitting generated files better from source files [<a href="https://github.com/doxygen/doxygen/commit/8885016b2a3bbeb6045a3e71d508939e0a7bd773">view</a>]</li> +<li>Superfluous < sign [<a href="https://github.com/doxygen/doxygen/commit/599700e6e72d687b6597cfbe2453474b231640ea">view</a>]</li> +<li>Superfluous backslash in documentation [<a href="https://github.com/doxygen/doxygen/commit/be5f9c70bcf38f9bce58e4b8e293dab6aea754fd">view</a>]</li> +<li>Superfluous include removed [<a href="https://github.com/doxygen/doxygen/commit/0e12f6bfa938b675f827074eb3693eff362e6b96">view</a>]</li> +<li>Undo previous commit [<a href="https://github.com/doxygen/doxygen/commit/1b5d5e53a7fce8136f9ab0ce82c95a8f9d479574">view</a>]</li> +<li>Unified DirFileContext and NestingContext [<a href="https://github.com/doxygen/doxygen/commit/df839603204979113b96678e2ab21b3eba64476c">view</a>]</li> +<li>Update doctokenizer.l [<a href="https://github.com/doxygen/doxygen/commit/68cf977ee72f8914678e30e3a88f0e9d90703418">view</a>]</li> +<li>Update doctokenizer.l [<a href="https://github.com/doxygen/doxygen/commit/ea1ee635fccbba4273a922dab3d092dd75b195e0">view</a>]</li> +<li>Updated copyright [<a href="https://github.com/doxygen/doxygen/commit/a28ff2331d8e228d901cd6f0b038f76e1cee630a">view</a>]</li> +<li>Use \newline i.s.o. \par for linebreaks in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/7e719d1ad5da33ccb3f54a90ae11dee58828b6ab">view</a>]</li> +<li>Use hook arrow for hyphens in symbol names in the LaTeX output. [<a href="https://github.com/doxygen/doxygen/commit/ac813134a85ba9bd999fb4cf8271c74e02cd4ebb">view</a>]</li> +<li>Wrong UTF 8 codes [<a href="https://github.com/doxygen/doxygen/commit/fd4beb272e5f1a760a71ab8d85463b8356c6f786">view</a>]</li> +<li>Fix broken links to subpages in LaTeX output [<a href="https://github.com/doxygen/doxygen/commit/10189681dcb46e543a287827e2096cef3dbc42ae">view</a>]</li> +<li>\xmlonly aoppeared twice in see also section of \htmlonly and \docbookonly [<a href="https://github.com/doxygen/doxygen/commit/f1cdb27194dd180f1bff1fbdd87874bb0d15758d">view</a>]</li> +<li>add css-escape to avoid jquery based xss [<a href="https://github.com/doxygen/doxygen/commit/7fea82094723ecfb4e9b3ea6819137b99d7dfa9c">view</a>]</li> +<li>add parameter [<a href="https://github.com/doxygen/doxygen/commit/c5bc9fc8c407aac845d594b2685d0c92699727d8">view</a>]</li> +<li>add search.py, a client for doxygen_sqlite3.db [<a href="https://github.com/doxygen/doxygen/commit/697ac97aad7fa045b6cc205050b69cf3f22408ad">view</a>]</li> +<li>add space between br and / for better compatibility [<a href="https://github.com/doxygen/doxygen/commit/2a40448c3855da250561fa4bac01179311831307">view</a>]</li> +<li>added option to have numbers in the bookmark pane (PDF output) [<a href="https://github.com/doxygen/doxygen/commit/62cf79095c4d02ff1c737e02f91f8dcea2175b9e">view</a>]</li> +<li>config.l: dependency checks for booleans [<a href="https://github.com/doxygen/doxygen/commit/5d64c0e2f39730bb5decd86a483a5b0823a67958">view</a>]</li> +<li>detect python2 as Python 2 binary [<a href="https://github.com/doxygen/doxygen/commit/3754cd80cae41b23dc1069245ad5acdc460b8809">view</a>]</li> +<li>fixed compile issue on Linux [<a href="https://github.com/doxygen/doxygen/commit/e3c636337323ba6e3f21bf1e8cfe2a899a8890c1">view</a>]</li> +<li>pass libclang header file location; add paths for Ubuntu's llvm-3.4 [<a href="https://github.com/doxygen/doxygen/commit/2613bf77ccbeee4721a17a8168dead071e41b45e">view</a>]</li> +<li>sqlite3: SQLITE_TRANSIENTs [<a href="https://github.com/doxygen/doxygen/commit/6f38dd245d56aaa9b6c8e966a4ccebe2f66ceb7d">view</a>]</li> +<li>sqlite3: add new searches to search.py [<a href="https://github.com/doxygen/doxygen/commit/c99422b0c7919e953811a3a06e18c7cacbacd7c6">view</a>]</li> +<li>sqlite3: clear bindings on errors and more care with return [<a href="https://github.com/doxygen/doxygen/commit/1a708967ba0c4a5604c1ac7d8f3c8112ec3e7044">view</a>]</li> +<li>sqlite3: extract more info [<a href="https://github.com/doxygen/doxygen/commit/cd4bdf6708194228434bed1f71d1cd698863aaaf">view</a>]</li> +<li>sqlite3: fedora has libsqlite3.so in /usr/lib64 [<a href="https://github.com/doxygen/doxygen/commit/49f65d1ee1c9005e019ec95a933ec5fcf02556c9">view</a>]</li> +<li>sqlite3: leave out insertMemberReference until xref location is valid [<a href="https://github.com/doxygen/doxygen/commit/2349f4b3ff931e334b3d3e09b3e03861a7630f86">view</a>]</li> +<li>sqlite3: remove some debug messages [<a href="https://github.com/doxygen/doxygen/commit/f76ec80dc8d1d7910951b34582ac25ce6f0efe4d">view</a>]</li> +<li>sqlite3: speedup the SELECTs [<a href="https://github.com/doxygen/doxygen/commit/d7f9bbedaa4b4fcc0253470d522149a2307d1020">view</a>]</li> +<li>sqlite3: updates [<a href="https://github.com/doxygen/doxygen/commit/2b80c416671220315a11287b6e10d5b3b2f852cc">view</a>]</li> +<li>sqlite3: use the new qtools API [<a href="https://github.com/doxygen/doxygen/commit/54fbd99c753e09b1c3850af6b8b4457d339b6e84">view</a>]</li> +<li>testsqlite3: a test for sqlite3gen [<a href="https://github.com/doxygen/doxygen/commit/733aaaa073a92a316ba888b6992f1172550dd469">view</a>]</li> +<li>util/patternMatch: break when pattern is found [<a href="https://github.com/doxygen/doxygen/commit/6d8c3184fadb1834223236b13471797089e4a004">view</a>]</li> +<li>util/patternMatch: don't extract a QCString(QFileInfo) each time we QRegExp.match [<a href="https://github.com/doxygen/doxygen/commit/8991d11cc824f40c11a28ccc38c09e9b10f722c3">view</a>]</li> </ul> <p> \endhtmlonly @@ -1186,67 +1586,67 @@ </p> <h3>Bug fixes</h3> <ul> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=154880">154880</a> - if "using namespace" used, call of a static member function in C++ is not recognized or recognized wrong</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647517">647517</a> - make install prepends a slash to the installation path Removed superfluous /</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668424">668424</a> - HTML links in RTF output are broken</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683897">683897</a> - class list not sorted?</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692004">692004</a> - show includes for free functions</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693537">693537</a> - Create possibility to keep user comments in Doxyfile</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701949">701949</a> - Latex: Hyperlinks for \secreflist / \refitem</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702265">702265</a> - Generated Doxyfile differs from result of doxygen -u (partial fix)</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705910">705910</a> - Indexing and searching cannot treat non ASCII identifiers</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place In some cases, in propriety code, with in body Fortran documentation doxygen crashed. I REOPENED Bug_706520 for this</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706804">706804</a> - Fortran: Doxygen mixes up function-attributes with the return type test string should not be equal to "function" but should contain "function"</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706813">706813</a> - RPM build via spec file fails</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706874">706874</a> - Doxygen crash if missing new-line in a snippet</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706916">706916</a> - C++ exception specifications are no longer parsed correctly</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707102">707102</a> - update the Japanese translation</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707353">707353</a> - Accept IDs using unicode(non ASCII) characters in python codes</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707389">707389</a> - GENERATE_TREEVIEW=YES disables touch scrolling with Android 3.x</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707431">707431</a> - Cannot @ref or @link C++ operator overloads</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707483">707483</a> - Wrong page number and header in pdf output</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707554">707554</a> - When I use @INCLUDE DoxyWizard is closed Current directory was not changed at the right time so the include files could not be found in the "current" directory (i.e. the directory where the Doxyfile resides too, as this directory is shown as the current directory in the doxywizard). This is also important when the doxywizard is started from a shortcut.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707567">707567</a> - Asterisks in comment wrongly displayed for @code</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707641">707641</a> - `FILTER_SOURCE_FILES=YES` required to build CALL_GRAPHS https://bugzilla.gnome.org/show_bug.cgi?id=707641</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707685">707685</a> - Fortran: error message when missing last EOL In case the original buffer in either fixed or free format code does not contain an EOL as last character, add it.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707713">707713</a> - Add support for dia diagrams</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707825">707825</a> - Const treatment</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707925">707925</a> - False warning for Java "warning: missing ( in exception list on member"</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707985">707985</a> - Strange output when : appended to an parameter description</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707995">707995</a> - @copydoc not working for const member overloads</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708446">708446</a> - Deprecated list breaks HTML tree with xhtml extension</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708455">708455</a> - Enabling INLINE_SIMPLE_STRUCTS messes up Data Structures in tree</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708806">708806</a> - Wrong path to graph_legend figure in graph_legend.html when CREATE_SUBDIRS = YES</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709052">709052</a> - Templated and non-templated method mixup documentation</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709226">709226</a> - Struct member fields not documented with INLINE_SIMPLE_STRUCTS</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709526">709526</a> - C++ parsing problem with operators <<, <, >, >> inside templates</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709706">709706</a> - Terminating C comments within markdown files breaks aliases</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709780">709780</a> - Copying of files via \image tag can get confused by symlinks at the destination</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709803">709803</a> - Generated hhc file contains an error for a section of a mainpage</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709845">709845</a> - Fortran: problem with types with name starting with is</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709870">709870</a> - Broken links on members HTML page when using BUILTIN_STL_SUPPORT</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709921">709921</a> - position of linebreak in template argument list affects inheritance relation</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710917">710917</a> - Segfault while parsing a C file</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710998">710998</a> - latex_count=5 is not enough</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711004">711004</a> - Vertical bars cannot be sent straight to makeindex</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711097">711097</a> - Compiler warnings because char is unsigned on ARM/PPC: "comparison is always false"</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711378">711378</a> - Nested Aliases fail when the nested alias has two or more arguments.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711639">711639</a> - [PATCH] #include does not work with absolute paths</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711723">711723</a> - Comment /**/ confuses doxygen</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711787">711787</a> - Long initialization line in C stops doxygen An extra "breakpoint" in the input string has been created in the form of a , (comma), so for initialization lines the line will be shorter and the , (comma) will be copied later on.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712795">712795</a> - segmentation fault in memberdef.cpp</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712819">712819</a> - Some external namespaces appear in list despite having ALLEXTERNALS = NO</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=715172">715172</a> - Consistently document Fortran's equivalent function bodies</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719389">719389</a> - HTML escaping incorrectly applied in source tooltips</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719422">719422</a> - private java class is mentioned in inherited by list of super class</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719463">719463</a> - Invalid null key and segmentation fault</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719489">719489</a> - Label "abstract" instead of "pure virtual" for Java language</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719525">719525</a> - Can't build because the definitions of ***YY_flex_debug are missing.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719591">719591</a> - expand_as_defined macro does not properly work</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719639">719639</a> - @xrefitem with empty heading string</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720046">720046</a> - Document inline objective-C blocks</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720092">720092</a> - USE_MDFILE_AS_MAINPAGE doesn't work if full path is specified.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720580">720580</a> - inline source browser shows wrong code with multi-line c++11's raw strings</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/1293">1293</a> - if "using namespace" used, call of a static member function in C++ is not recognized or recognized wrong</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/4237">4237</a> - make install prepends a slash to the installation path Removed superfluous /</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/4547">4547</a> - HTML links in RTF output are broken</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/4885">4885</a> - class list not sorted?</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5037">5037</a> - show includes for free functions</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5070">5070</a> - Create possibility to keep user comments in Doxyfile</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5207">5207</a> - Latex: Hyperlinks for \secreflist / \refitem</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5213">5213</a> - Generated Doxyfile differs from result of doxygen -u (partial fix)</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5263">5263</a> - Indexing and searching cannot treat non ASCII identifiers</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5270">5270</a> - Fortran: in body documentation lands on wrong place In some cases, in propriety code, with in body Fortran documentation doxygen crashed. I REOPENED Bug_706520 for this</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5271">5271</a> - Fortran: Doxygen mixes up function-attributes with the return type test string should not be equal to "function" but should contain "function"</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5272">5272</a> - RPM build via spec file fails</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5274">5274</a> - Doxygen crash if missing new-line in a snippet</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5275">5275</a> - C++ exception specifications are no longer parsed correctly</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5278">5278</a> - update the Japanese translation</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5282">5282</a> - Accept IDs using unicode(non ASCII) characters in python codes</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5283">5283</a> - GENERATE_TREEVIEW=YES disables touch scrolling with Android 3.x</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5284">5284</a> - Cannot @ref or @link C++ operator overloads</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5285">5285</a> - Wrong page number and header in pdf output</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5286">5286</a> - When I use @INCLUDE DoxyWizard is closed Current directory was not changed at the right time so the include files could not be found in the "current" directory (i.e. the directory where the Doxyfile resides too, as this directory is shown as the current directory in the doxywizard). This is also important when the doxywizard is started from a shortcut.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5288">5288</a> - Asterisks in comment wrongly displayed for @code</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5289">5289</a> - `FILTER_SOURCE_FILES=YES` required to build CALL_GRAPHS <a href="https://github.com/doxygen/doxygen/issues/5289">5289</a></li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5290">5290</a> - Fortran: error message when missing last EOL In case the original buffer in either fixed or free format code does not contain an EOL as last character, add it.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5291">5291</a> - Add support for dia diagrams</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5292">5292</a> - Const treatment</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5293">5293</a> - False warning for Java "warning: missing ( in exception list on member"</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5295">5295</a> - Strange output when : appended to an parameter description</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5296">5296</a> - @copydoc not working for const member overloads</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5298">5298</a> - Deprecated list breaks HTML tree with xhtml extension</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5299">5299</a> - Enabling INLINE_SIMPLE_STRUCTS messes up Data Structures in tree</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5301">5301</a> - Wrong path to graph_legend figure in graph_legend.html when CREATE_SUBDIRS = YES</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5302">5302</a> - Templated and non-templated method mixup documentation</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5303">5303</a> - Struct member fields not documented with INLINE_SIMPLE_STRUCTS</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5305">5305</a> - C++ parsing problem with operators <<, <, >, >> inside templates</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5308">5308</a> - Terminating C comments within markdown files breaks aliases</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5310">5310</a> - Copying of files via \image tag can get confused by symlinks at the destination</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5311">5311</a> - Generated hhc file contains an error for a section of a mainpage</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5313">5313</a> - Fortran: problem with types with name starting with is</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5314">5314</a> - Broken links on members HTML page when using BUILTIN_STL_SUPPORT</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5315">5315</a> - position of linebreak in template argument list affects inheritance relation</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5329">5329</a> - Segfault while parsing a C file</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5331">5331</a> - latex_count=5 is not enough</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5332">5332</a> - Vertical bars cannot be sent straight to makeindex</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5334">5334</a> - Compiler warnings because char is unsigned on ARM/PPC: "comparison is always false"</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5340">5340</a> - Nested Aliases fail when the nested alias has two or more arguments.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5344">5344</a> - [PATCH] #include does not work with absolute paths</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5345">5345</a> - Comment /**/ confuses doxygen</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5347">5347</a> - Long initialization line in C stops doxygen An extra "breakpoint" in the input string has been created in the form of a , (comma), so for initialization lines the line will be shorter and the , (comma) will be copied later on.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5355">5355</a> - segmentation fault in memberdef.cpp</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5358">5358</a> - Some external namespaces appear in list despite having ALLEXTERNALS = NO</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5360">5360</a> - Consistently document Fortran's equivalent function bodies</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5361">5361</a> - HTML escaping incorrectly applied in source tooltips</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5362">5362</a> - private java class is mentioned in inherited by list of super class</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5363">5363</a> - Invalid null key and segmentation fault</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5364">5364</a> - Label "abstract" instead of "pure virtual" for Java language</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5365">5365</a> - Can't build because the definitions of ***YY_flex_debug are missing.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5367">5367</a> - expand_as_defined macro does not properly work</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5369">5369</a> - @xrefitem with empty heading string</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5372">5372</a> - Document inline objective-C blocks</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5374">5374</a> - USE_MDFILE_AS_MAINPAGE doesn't work if full path is specified.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5381">5381</a> - inline source browser shows wrong code with multi-line c++11's raw strings</li> <li> Add support for honoring svg image format preference in msc</li> <li> Added @parblock and @endparblock commands</li> <li> Added compile support for Mavericks</li> @@ -1296,9 +1696,10 @@ <li> Small spelling correction to generate an rtf extensions file -> to generate a rtf extensions file</li> <li> Some texts can be independent of \htmlonly / \latexonly</li> <li> Space missing in error message. the word 'in' and the vale of filesOption were concatenated</li> -<li> This patch contains changes regarding the build system so that the *nix and Windows systems use the same information (consistency). Some use names routine names have been changed (from .l files with -P option) to reflect the file name that generated the routines, this makes it easier to create a general procedure. A number of include / header files are files are generated from different file types (html, xml, js), due some limitations of the windows build system the generated file names had to be changed (the extension in the windows build system is only available including the '.' so e.g. the file jquery_fx.js generates now jquery_fx.js.h instead of jquery_fx_js.h) In the windows version the creation of .cpp files from .l files has been adjusted to correct for the YY_BUF_SIZE problems. Furthermore on windows (and also used on *nix) some commends have been replaced with python scripts so that on windows only python is need (besides flex and bison). On *nix also perl is required for the generation using tmake.</li> +<li> This patch contains changes regarding the build system so that the *nix and Windows systems use the same information (consistency). Some use names routine names have been changed (from .l files with -P option) to reflect the file name that generated the routines, this makes it easier to create a general procedure. A number of include / header files are files are generated from different file types (html, xml, js), due some limitations of the windows build system the generated file names had to be changed (the extension in the windows build system is only available including the '.' so e.g. the file jquery_fx.js generates now jquery_fx.js.h instead of jquery_fx_js.h) In the windows version the creation of .cpp files from .l files has been adjusted to correct for the YY_BUF_SIZE problems. Furthermore on windows (and also used on *nix) some commands have been replaced with python scripts so that on windows only python is need (besides flex and bison). On *nix also perl is required for the generation using tmake.</li> <li> Updated Visual Studio project files to include new source files</li> -<li> Usage of the -d option corrected Giving an error when a wrong -d option is given. Made some error messages more consistent. Corrected usage of the exit call, in case of an error: exit(1) otherwise exit(0). A closer look should be made on exitDoxygen as it does not contain any exit statements and it is unclear (to me) when it is used.</li> <li> VHDL-2008 and arrays on unconstrained elements</li> +<li> Usage of the -d option corrected Giving an error when a wrong -d option is given. Made some error messages more consistent. Corrected usage of the exit call, in case of an error: exit(1) otherwise exit(0). A closer look should be made on exitDoxygen as it does not contain any exit statements and it is unclear (to me) when it is used.</li> +<li> VHDL-2008 and arrays on unconstrained elements</li> <li> consider currentFile when searching for global symbols</li> <li> doc/language.doc generated from the updated sources (bgcolored)</li> <li> doc/language.tpl -- UTF-8 reflected in the langhowto template</li> @@ -1333,54 +1734,54 @@ </ul> <h3>Bug fixes</h3> <ul> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668007">668007</a> - HTML commands - documentation of </dd> tag missing</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676879">676879</a> - parameter on doxywizard manual Added sentence in respect to possible argument for doxywizard Added images to the LaTex / pdf version of the manual</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684324">684324</a> - Strange behavior when placing cite within brief. </li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688858">688858</a> - SHORT_NAMES break references to \page in PDF output</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691315">691315</a> - Line breaks are not copied/displayed properly when using @copydoc. </li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691830">691830</a> - Logical confusion with DISABLE_INDEX and GENERATE_TREEVIEW</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694147">694147</a> - #undef is ignored by doxygen</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698998">698998</a> - vhdldocgen fails to generate proper latex for VHDL record type</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700385">700385</a> - Incorrectly parsed Q_PROPERTY with 'unsigned int' type</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700646">700646</a> - XML output does not handle HTML entities in titles</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700693">700693</a> - Duplicate entry for class template member function with no parameter</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700696">700696</a> - Template static member functions duplicated as non-static public</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700709">700709</a> - typedef warning when "using" some operator functions</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700710">700710</a> - Docbook output produces invalid XML for <programlisting> elements</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a> - Doxygen does not create links on C++ 11 style enum classes</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700788">700788</a> - support @cite within brief description.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700908">700908</a> - code after \@cond is removed</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701295">701295</a> - Doxygen 1.8.4 goes into an endless loop</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701314">701314</a> - URLs are not created on C# classes in some cases</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701550">701550</a> - Error List window in Visual Studio no longer recognizes doxygen warnings</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701771">701771</a> - EXPAND_AS_DEFINED not working with some project structures</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701919">701919</a> - VHDL cross-references fail when unpaired apostrophe present</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702066">702066</a> - VHDL: Bad HTML formatting when using inline sources</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702170">702170</a> - Missing space before optional option in method argument list</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702189">702189</a> - Markdown and @image</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702491">702491</a> - UTF-16LE BOM not handled by source browser and \snippet</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702590">702590</a> - Crash with TAB_SIZE=-1</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702676">702676</a> - Closing ) of function in function documentation is in wrong color</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703574">703574</a> - Add configure options to enable static SQLite and non-standard SQLite</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703112">703112</a> - Backward documentation comments are not allowed in Fortran type-bound procedures</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703133">703133</a> - "operator--()" transformed to "operator&ndash;()" in @copydoc</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703170">703170</a> - Segmentation fault parsing a fortran file</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703213">703213</a> - Can't use @ref instead of \ref with msc</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703301">703301</a> - Misleading warning about DOT font</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703791">703791</a> - Out-of-line docs for class template specialisations failing</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704079">704079</a> - Generated XML is malformed</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704172">704172</a> - Nested Aliases fail when the nested alias has two or more arguments.</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704412">704412</a> - doxygen don't hide private Inherited Members</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704971">704971</a> - Can't build with MinGW</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704973">704973</a> - Doxywizard can't show file names using non-ASCII(Unicode)</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705190">705190</a> - Incorrectly parsed Q_PROPERTY with 'long long' or 'long int' type</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705217">705217</a> - Can't use unicode characters to execute external commands</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705218">705218</a> - QRegExp doesn't work with 80-FF</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705219">705219</a> - Accept IDs using unicode for C/C++ preprocessor</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705586">705586</a> - @code tag as the last line of a comment block causes the parser to hang</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705702">705702</a> - Post-comment blocks on C++11 using definitions attach to following entity</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706236">706236</a> - Confusing use of GENERATE_TAGFILE</li> -<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/4532">4532</a> - HTML commands - documentation of </dd> tag missing</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/4710">4710</a> - parameter on doxywizard manual Added sentence in respect to possible argument for doxywizard Added images to the LaTex / pdf version of the manual</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/4890">4890</a> - Strange behavior when placing cite within brief. </li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/4963">4963</a> - SHORT_NAMES break references to \page in PDF output</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5023">5023</a> - Line breaks are not copied/displayed properly when using @copydoc. </li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5035">5035</a> - Logical confusion with DISABLE_INDEX and GENERATE_TREEVIEW</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5080">5080</a> - #undef is ignored by doxygen</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5153">5153</a> - vhdldocgen fails to generate proper latex for VHDL record type</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5175">5175</a> - Incorrectly parsed Q_PROPERTY with 'unsigned int' type</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5184">5184</a> - XML output does not handle HTML entities in titles</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5185">5185</a> - Duplicate entry for class template member function with no parameter</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5186">5186</a> - Template static member functions duplicated as non-static public</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5187">5187</a> - typedef warning when "using" some operator functions</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5188">5188</a> - Docbook output produces invalid XML for <programlisting> elements</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5189">5189</a> - Doxygen does not create links on C++ 11 style enum classes</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5192">5192</a> - support @cite within brief description.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5194">5194</a> - code after \@cond is removed</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5198">5198</a> - Doxygen 1.8.4 goes into an endless loop</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5199">5199</a> - URLs are not created on C# classes in some cases</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5200">5200</a> - Error List window in Visual Studio no longer recognizes doxygen warnings</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5201">5201</a> - EXPAND_AS_DEFINED not working with some project structures</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5205">5205</a> - VHDL cross-references fail when unpaired apostrophe present</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5209">5209</a> - VHDL: Bad HTML formatting when using inline sources</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5211">5211</a> - Missing space before optional option in method argument list</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5212">5212</a> - Markdown and @image</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5214">5214</a> - UTF-16LE BOM not handled by source browser and \snippet</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5216">5216</a> - Crash with TAB_SIZE=-1</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5217">5217</a> - Closing ) of function in function documentation is in wrong color</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5230">5230</a> - Add configure options to enable static SQLite and non-standard SQLite</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5223">5223</a> - Backward documentation comments are not allowed in Fortran type-bound procedures</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5224">5224</a> - "operator--()" transformed to "operator&ndash;()" in @copydoc</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5225">5225</a> - Segmentation fault parsing a fortran file</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5226">5226</a> - Can't use @ref instead of \ref with msc</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5228">5228</a> - Misleading warning about DOT font</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5233">5233</a> - Out-of-line docs for class template specialisations failing</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5234">5234</a> - Generated XML is malformed</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5239">5239</a> - Nested Aliases fail when the nested alias has two or more arguments.</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5242">5242</a> - doxygen don't hide private Inherited Members</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5246">5246</a> - Can't build with MinGW</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5247">5247</a> - Doxywizard can't show file names using non-ASCII(Unicode)</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5250">5250</a> - Incorrectly parsed Q_PROPERTY with 'long long' or 'long int' type</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5251">5251</a> - Can't use unicode characters to execute external commands</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5252">5252</a> - QRegExp doesn't work with 80-FF</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5253">5253</a> - Accept IDs using unicode for C/C++ preprocessor</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5260">5260</a> - @code tag as the last line of a comment block causes the parser to hang</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5261">5261</a> - Post-comment blocks on C++11 using definitions attach to following entity</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5268">5268</a> - Confusing use of GENERATE_TAGFILE</li> +<li> Bug <a href="https://github.com/doxygen/doxygen/issues/5270">5270</a> - Fortran: in body documentation lands on wrong place</li> <li> Small typo corrected in doxywizard_usage.doc Generated config.doc file in git is not identical to the generated one</li> <li> Various improvements to the (still experimental) sqlite3 support (thanks to Adrian Negreanu)</li> <li> jquery: use the env MINIFIER if specified</li> @@ -1410,7 +1811,7 @@ <li> Replaced utf8 character that broke latex compilation of the manual</li> <li> Fixed unused parameter warnings</li> <li> Add support for writing and importing C++11 style enums to and from tag files</li> -<li> Fixed regression introduced by fixed bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a></li> +<li> Fixed regression introduced by fixed bug <a href="https://github.com/doxygen/doxygen/issues/5189">5189</a></li> <li> Fixed type in function name</li> <li> Remove some unneeded and still enabled debug info</li> <li> Included fix for "Constant Groups" regression on file pages (thanks to Michael Stahl) </li> @@ -1427,11 +1828,11 @@ </p> <h3>Changes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686384">686384</a>: When INLINE_SIMPLE_STRUCTS is enabled, also structs with +<li> id <a href="https://github.com/doxygen/doxygen/issues/4929">4929</a>: When INLINE_SIMPLE_STRUCTS is enabled, also structs with simple typedefs will be inlined.</li> <li> Doxywizard: scrolling with mouse wheel no longer affects the values in the expert view.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681733">681733</a>: More consistent warnings and errors.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4846">4846</a>: More consistent warnings and errors.</li> </ul> <h3>New features</h3> <ul> @@ -1460,110 +1861,110 @@ <li> Included patch by Markus Geimer which adds a new option LATEX_EXTRA_FILES which works similarly to HTML_EXTRA_FILES in that it copied specified files to the LaTeX output directory.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698223">698223</a>: Added support for C++11 keyword alignas</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693178">693178</a>: Added support for processing DocSets with Dash (thanks to +<li> id <a href="https://github.com/doxygen/doxygen/issues/5149">5149</a>: Added support for C++11 keyword alignas</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5056">5056</a>: Added support for processing DocSets with Dash (thanks to Bogdan Popescu for the patch </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684782">684782</a>: Added option EXTERNAL_PAGES which can be used to determine +<li> id <a href="https://github.com/doxygen/doxygen/issues/4900">4900</a>: Added option EXTERNAL_PAGES which can be used to determine whether or not pages importated via tags will appear under related pages (similar to EXTERNAL_GROUPS).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692227">692227</a>: Added new MathJax command MATHJAX_CODEFILE which supports +<li> id <a href="https://github.com/doxygen/doxygen/issues/5042">5042</a>: Added new MathJax command MATHJAX_CODEFILE which supports including a file with MathJax related scripting to be inserted before the MathJax script is loaded. Thanks to Albert for the patch.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693537">693537</a>: Comments in the config file starting with ## will now be +<li> id <a href="https://github.com/doxygen/doxygen/issues/5070">5070</a>: Comments in the config file starting with ## will now be kept when upgrading the file with doxygen -u (and doxygen -s -u). Thanks to Albert for the patch.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693422">693422</a>: Adds support for Latvian (thanks to a patch by Lauris).</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5061">5061</a>: Adds support for Latvian (thanks to a patch by Lauris).</li> <li> Included language updates for Ukrainian, Romanian, and Korean</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=145294">145294</a>: Fixed parse issue when using less than inside a template +<li> id <a href="https://github.com/doxygen/doxygen/issues/1169">1169</a>: Fixed parse issue when using less than inside a template argument.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=325266">325266</a> man page output was missing a linebreak before .SH when +<li> id <a href="https://github.com/doxygen/doxygen/issues/1976">1976</a> man page output was missing a linebreak before .SH when definition a group with a section.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=338205">338205</a>: @anchor were wrong when CREATE_SUBDIRS was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=427012">427012</a>: Putting a @todo in front of an anonymous namespace caused +<li> id <a href="https://github.com/doxygen/doxygen/issues/2114">2114</a>: @anchor were wrong when CREATE_SUBDIRS was enabled.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/2445">2445</a>: Putting a @todo in front of an anonymous namespace caused bogus entry in the todo list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=564462">564462</a>: Fixed alignment issue with tabs and multibyte characters.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567542">567542</a>: Character entities in titles were not rendered correctly +<li> id <a href="https://github.com/doxygen/doxygen/issues/3198">3198</a>: Fixed alignment issue with tabs and multibyte characters.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3230">3230</a>: Character entities in titles were not rendered correctly in the HTML navigation tree.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571561">571561</a>: No space between * and tag (e.g. \endcode) made parser +<li> id <a href="https://github.com/doxygen/doxygen/issues/3272">3272</a>: No space between * and tag (e.g. \endcode) made parser misbehave</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583233">583233</a>: Included patch to limit generated Doxyfile comments to 80 +<li> id <a href="https://github.com/doxygen/doxygen/issues/3397">3397</a>: Included patch to limit generated Doxyfile comments to 80 columns</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592626">592626</a>: Fixed off-by-one with MAX_DOT_GRAPH_DEPTH.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619790">619790</a>: Improved linking to template specializations. +<li> id <a href="https://github.com/doxygen/doxygen/issues/3487">3487</a>: Fixed off-by-one with MAX_DOT_GRAPH_DEPTH.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3785">3785</a>: Improved linking to template specializations. Thanks to David Haney for the patch.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=627712">627712</a>: Doxygen Header in C Files makes empty Lines in HTML Source +<li> id <a href="https://github.com/doxygen/doxygen/issues/3909">3909</a>: Doxygen Header in C Files makes empty Lines in HTML Source Code when starts in Line 1</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639954">639954</a>: Fortran: array constructors with brackets were not correctly +<li> id <a href="https://github.com/doxygen/doxygen/issues/4096">4096</a>: Fortran: array constructors with brackets were not correctly recognized.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646428">646428</a>: The generated man pages had a .PP just before the subject +<li> id <a href="https://github.com/doxygen/doxygen/issues/4223">4223</a>: The generated man pages had a .PP just before the subject description</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646431">646431</a>: On generated manpages the return section is incorrectly +<li> id <a href="https://github.com/doxygen/doxygen/issues/4224">4224</a>: On generated manpages the return section is incorrectly indented</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650004">650004</a>: use \page now generates a man page were the . is not +<li> id <a href="https://github.com/doxygen/doxygen/issues/4261">4261</a>: use \page now generates a man page were the . is not replaced by _8.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=657704">657704</a>: Fixed issue with PROJECT_LOGO when using backslashes in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4385">4385</a>: Fixed issue with PROJECT_LOGO when using backslashes in the path.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666008">666008</a>: Fortran: Using @var at module level didn't work. +<li> id <a href="https://github.com/doxygen/doxygen/issues/4499">4499</a>: Fortran: Using @var at module level didn't work. expect a file/path name.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673218">673218</a>: Replaced "echo -n" with "printf" in the configure script.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674856">674856</a>: Removed warning when using \endinternal</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675607">675607</a>: Added &, @, and # as allowed characters for commands that</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Included patch by Abert to correctly link pages in the manual</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681874">681874</a>: Added support for single column Markdown tables.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682369">682369</a>: Incomplete documentation on doxygen -w latex</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683516">683516</a>: Doxygen crashed when structural commands (like \var) appeared +<li> id <a href="https://github.com/doxygen/doxygen/issues/4650">4650</a>: Replaced "echo -n" with "printf" in the configure script.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4684">4684</a>: Removed warning when using \endinternal</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4696">4696</a>: Added &, @, and # as allowed characters for commands that</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4788">4788</a>: Included patch by Abert to correctly link pages in the manual</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4850">4850</a>: Added support for single column Markdown tables.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4855">4855</a>: Incomplete documentation on doxygen -w latex</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4877">4877</a>: Doxygen crashed when structural commands (like \var) appeared in .md files.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686259">686259</a>: Fixed character encoding problem when multibytes characters +<li> id <a href="https://github.com/doxygen/doxygen/issues/4926">4926</a>: Fixed character encoding problem when multibytes characters were used in anchors.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691071">691071</a>: Documentation before an anonymous member did not appear.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692162">692162</a>: Fixed Markdown related indentation problem.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692320">692320</a>: Regression: Text after @copydoc was not visible anymore.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692537">692537</a>: Linked to external pages was done using the page label +<li> id <a href="https://github.com/doxygen/doxygen/issues/5013">5013</a>: Documentation before an anonymous member did not appear.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5040">5040</a>: Fixed Markdown related indentation problem.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5044">5044</a>: Regression: Text after @copydoc was not visible anymore.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5046">5046</a>: Linked to external pages was done using the page label rather than the file name.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693331">693331</a>: build using ./configure ; make did not work if the path +<li> id <a href="https://github.com/doxygen/doxygen/issues/5059">5059</a>: build using ./configure ; make did not work if the path contained a space.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693406">693406</a>: Tag files are now identfied by the full path instead of +<li> id <a href="https://github.com/doxygen/doxygen/issues/5060">5060</a>: Tag files are now identfied by the full path instead of only the name of the tag file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694376">694376</a>: In some cases members were missing from the tag file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694027">694027</a>: Fortran: derive intent from documentation in case no +<li> id <a href="https://github.com/doxygen/doxygen/issues/5086">5086</a>: In some cases members were missing from the tag file.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5079">5079</a>: Fortran: derive intent from documentation in case no intent is specified</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694610">694610</a>: Warning was not reported at the correct line in two cases.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694631">694631</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694632">694632</a>: @cond..@endcond did not work properly for removing +<li> id <a href="https://github.com/doxygen/doxygen/issues/5089">5089</a>: Warning was not reported at the correct line in two cases.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5092">5092</a>, <a href="https://github.com/doxygen/doxygen/issues/5093">5093</a>: @cond..@endcond did not work properly for removing macro definitions.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694685">694685</a>: Fixed crash when adding two different functions with the +<li> id <a href="https://github.com/doxygen/doxygen/issues/5098">5098</a>: Fixed crash when adding two different functions with the same name to the same group.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694726">694726</a>: VHDL: fixed issue generating LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=695277">695277</a>: Fortran: improved handling of protected statement</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=695974">695974</a>: Fortran: Fixed issue resulting in +<li> id <a href="https://github.com/doxygen/doxygen/issues/5100">5100</a>: VHDL: fixed issue generating LaTeX output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5116">5116</a>: Fortran: improved handling of protected statement</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5124">5124</a>: Fortran: Fixed issue resulting in "Stack buffers nested too deeply" error.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696708">696708</a>: @cond was not handled properly by the preprocessor.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697233">697233</a>: @copyright command did not end a brief description.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697249">697249</a>: Markdown tables caused errors reported at wrong line number.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697494">697494</a>: Removed double entry from the messages produced by doxygen.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698818">698818</a>: Fixed problem handling @cond for #define's</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698007">698007</a>: Fixed potential crash when searching files.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696925">696925</a>: #include's inside namespace could result in duplicate entries.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696954">696954</a>: Doxywizard: Labels of items are now also grayed out +<li> id <a href="https://github.com/doxygen/doxygen/issues/5128">5128</a>: @cond was not handled properly by the preprocessor.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5133">5133</a>: @copyright command did not end a brief description.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5134">5134</a>: Markdown tables caused errors reported at wrong line number.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5135">5135</a>: Removed double entry from the messages produced by doxygen.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5152">5152</a>: Fixed problem handling @cond for #define's</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5144">5144</a>: Fixed potential crash when searching files.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5131">5131</a>: #include's inside namespace could result in duplicate entries.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5132">5132</a>: Doxywizard: Labels of items are now also grayed out when an item is disabled (thanks to Albert for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699195">699195</a>: Changed Markdown page label to support multiple .md files +<li> id <a href="https://github.com/doxygen/doxygen/issues/5154">5154</a>: Changed Markdown page label to support multiple .md files with the same name.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699218">699218</a>: Fixed issue with margin computation in resize.js.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699381">699381</a>: Lonely h4,h5,h6 end tag caused assert.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699437">699437</a>: Trailing comments were not always rendered properly if +<li> id <a href="https://github.com/doxygen/doxygen/issues/5155">5155</a>: Fixed issue with margin computation in resize.js.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5157">5157</a>: Lonely h4,h5,h6 end tag caused assert.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5158">5158</a>: Trailing comments were not always rendered properly if MARKDOWN_SUPPORT was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699460">699460</a>: Updated doxygen man page (thanks to Manuel for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699464">699464</a>: Added reference to \xmlonly and \docbookonly in \htmlonly</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699731">699731</a>: LaTeX: switch to using the xtabular package instead of +<li> id <a href="https://github.com/doxygen/doxygen/issues/5159">5159</a>: Updated doxygen man page (thanks to Manuel for the patch).</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5160">5160</a>: Added reference to \xmlonly and \docbookonly in \htmlonly</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5163">5163</a>: LaTeX: switch to using the xtabular package instead of longtable to prevent overfull vbox errors.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699732">699732</a>: Template parameters and Exceptions were rendered differently +<li> id <a href="https://github.com/doxygen/doxygen/issues/5164">5164</a>: Template parameters and Exceptions were rendered differently than Parameters and Return Values in the LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700153">700153</a>: Tcl: Fixed crash when parsing certain Tcl code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700345">700345</a>: Comment blocking ending with ///// made slashes appear in +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Tcl: Fixed crash when parsing certain Tcl code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5171">5171</a>: Comment blocking ending with ///// made slashes appear in the output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700456">700456</a>: Added support for separating auto list items with an +<li> id <a href="https://github.com/doxygen/doxygen/issues/5180">5180</a>: Added support for separating auto list items with an empty paragraph.</li> <li> Included a couple of VHDL fixes (thanks to Martin Kreis for the patch)</li> <li> \include and \includelineno both showed line numbers.</li> @@ -1589,7 +1990,7 @@ <li> Disabled the disk cache for member data. Allows removing quite some complexity in doxygen and is not really needed now that 64bit systems with >4GB RAM are becoming more common. Let me know if you think you benefit from this caching.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691607">691607</a>: Using $relpath$ in a custom footer could lead to ambiguities +<li> id <a href="https://github.com/doxygen/doxygen/issues/5031">5031</a>: Using $relpath$ in a custom footer could lead to ambiguities when followed by a name that could also be a marker, like 'search'. Now $relpath^ should be used instead. $relpath$ is still supported for backward compatibility.</li> @@ -1605,31 +2006,31 @@ </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=644350">644350</a>: Fortran: Included patch to improve parsing line continuation +<li> id <a href="https://github.com/doxygen/doxygen/issues/4191">4191</a>: Fortran: Included patch to improve parsing line continuation characters.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645423">645423</a>: Fortran: added support for protected attribute</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682550">682550</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691315">691315</a>: When using @copydoc, paragraphs breaks did not appear +<li> id <a href="https://github.com/doxygen/doxygen/issues/4204">4204</a>: Fortran: added support for protected attribute</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4859">4859</a>, <a href="https://github.com/doxygen/doxygen/issues/5023">5023</a>: When using @copydoc, paragraphs breaks did not appear in the copied documentation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686581">686581</a>: Fortran: handle single quotes in normal Fortran comment.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686689">686689</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691335">691335</a>: Scope of forwardly declared template class was lost +<li> id <a href="https://github.com/doxygen/doxygen/issues/4930">4930</a>: Fortran: handle single quotes in normal Fortran comment.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4931">4931</a>, <a href="https://github.com/doxygen/doxygen/issues/5025">5025</a>: Scope of forwardly declared template class was lost in the output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689713">689713</a>: Tcl: Inline source code was not rendered correctly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690787">690787</a>: Fixed case were a cyclic inheritance relation could crash +<li> id <a href="https://github.com/doxygen/doxygen/issues/4978">4978</a>: Tcl: Inline source code was not rendered correctly.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5005">5005</a>: Fixed case were a cyclic inheritance relation could crash doxygen.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690831">690831</a>: Using @subpage in a -# style list was not handled properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691000">691000</a>: For a mainpage without title the project name is now shown as +<li> id <a href="https://github.com/doxygen/doxygen/issues/5008">5008</a>: Using @subpage in a -# style list was not handled properly.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5012">5012</a>: For a mainpage without title the project name is now shown as the title in the XML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691277">691277</a>: The generated list of citations is now no longer included in +<li> id <a href="https://github.com/doxygen/doxygen/issues/5017">5017</a>: The generated list of citations is now no longer included in the tag file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691073">691073</a>: Documenting strongly typed enum values outside of the enum +<li> id <a href="https://github.com/doxygen/doxygen/issues/5014">5014</a>: Documenting strongly typed enum values outside of the enum did not work.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691310">691310</a>: Python: = was missing in the output for variable assignment.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691323">691323</a>: Doxygen could crash when creating inline msc graphs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691340">691340</a>: Members didn't have a More.. link to jump to detailed docs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691602">691602</a>: Doxygen did not probably distinguish between two template</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691798">691798</a>: regression: C++ style comments that started with a line of +<li> id <a href="https://github.com/doxygen/doxygen/issues/5022">5022</a>: Python: = was missing in the output for variable assignment.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5024">5024</a>: Doxygen could crash when creating inline msc graphs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5026">5026</a>: Members didn't have a More.. link to jump to detailed docs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5030">5030</a>: Doxygen did not probably distinguish between two template</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5034">5034</a>: regression: C++ style comments that started with a line of slashes did not get processed correctly anymore. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692031">692031</a>: Fixed parse error when left shift operator occurred as a +<li> id <a href="https://github.com/doxygen/doxygen/issues/5038">5038</a>: Fixed parse error when left shift operator occurred as a default parameter. members or functions that only differ in the return type.</li> <li> Setting SEARCH_INCLUDES to NO resulted in no include graphs and no @@ -1657,7 +2058,7 @@ Pez Cuckow for the patch).</li> <li> A blockquote in Markdown does no longer require a whitespace after the last '>' if the '>' is followed by a newline.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682718">682718</a>: Included patch to add version info to all generated +<li> id <a href="https://github.com/doxygen/doxygen/issues/4863">4863</a>: Included patch to add version info to all generated template files (headers, footers, stylesheets, layout files, etc).</li> </ul> <h3>New features</h3> @@ -1673,91 +2074,91 @@ See the <a href="extsearch.html">manual</a> for details.</li> <li> Added USE_MDFILE_AS_MAINPAGE config option to select a markdown page to be used as the main page.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630645">630645</a>: This patch (contributed by Albert) adds support for +<li> id <a href="https://github.com/doxygen/doxygen/issues/3945">3945</a>: This patch (contributed by Albert) adds support for simple logic expressions for \cond, \if, and friends, i.e. you can do \if (SOME_SECTION_NAME && (!THIS_ALTERNATIVE || THAT_ALTERNATIVE))</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684152">684152</a>: Patch (contributed by Albert) adds a new configuration +<li> id <a href="https://github.com/doxygen/doxygen/issues/4888">4888</a>: Patch (contributed by Albert) adds a new configuration option MATHJAX_FORMAT to select the MathJax output format. Options are HTML-CSS, NativeMML, or SVG.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670853">670853</a>: Fixed compile issues with 0 to QCString cast for +<li> id <a href="https://github.com/doxygen/doxygen/issues/4584">4584</a>: Fixed compile issues with 0 to QCString cast for old compilers.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678139">678139</a>: A class A deriving from another class B inside a namespace +<li> id <a href="https://github.com/doxygen/doxygen/issues/4752">4752</a>: A class A deriving from another class B inside a namespace not known to doxygen, caused class B to appear in the global scope.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681209">681209</a>: Fixed problem processing .bib files when they were located +<li> id <a href="https://github.com/doxygen/doxygen/issues/4839">4839</a>: Fixed problem processing .bib files when they were located in a path containing spaces.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681830">681830</a>: Using \addindex in a page will now produce a link to the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4848">4848</a>: Using \addindex in a page will now produce a link to the word, instead of the start of the page.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681831">681831</a>: The TREEVIEW_WIDTH option did not have any effect.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681898">681898</a>: Jumping from a level 3 section to a level 1 section did +<li> id <a href="https://github.com/doxygen/doxygen/issues/4849">4849</a>: The TREEVIEW_WIDTH option did not have any effect.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4851">4851</a>: Jumping from a level 3 section to a level 1 section did not appear correctly in the page TOC.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681976">681976</a>: C++11: Improved handling of noexcept expressions, e.g.: +<li> id <a href="https://github.com/doxygen/doxygen/issues/4852">4852</a>: C++11: Improved handling of noexcept expressions, e.g.: <code>Test() noexcept ( noexcept(T::T()) ) = default;</code></li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682048">682048</a>: Improved SIGINT handling when running multiple dot instances.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682602">682602</a>: Fixed problem processing .bib files when using a non default +<li> id <a href="https://github.com/doxygen/doxygen/issues/4853">4853</a>: Improved SIGINT handling when running multiple dot instances.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4860">4860</a>: Fixed problem processing .bib files when using a non default output directory.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682713">682713</a>: Comment for IDL_PROPERTY_SUPPORT in the config file template +<li> id <a href="https://github.com/doxygen/doxygen/issues/4862">4862</a>: Comment for IDL_PROPERTY_SUPPORT in the config file template did not have line wrapping.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682728">682728</a>: Setting SHOW_FILES to NO prevented call graphs from being +<li> id <a href="https://github.com/doxygen/doxygen/issues/4864">4864</a>: Setting SHOW_FILES to NO prevented call graphs from being generated.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682740">682740</a>: Fortran: In initialization statement the "=" was missing</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683284">683284</a>: Fortran: ALIASes where not replaced in !! and !< comments.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683976">683976</a>: Added meta tag "generator" to HTML output (thanks to +<li> id <a href="https://github.com/doxygen/doxygen/issues/4865">4865</a>: Fortran: In initialization statement the "=" was missing</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4872">4872</a>: Fortran: ALIASes where not replaced in !! and !< comments.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4886">4886</a>: Added meta tag "generator" to HTML output (thanks to Albert for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684781">684781</a>: Sections of the main page did not appear in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4899">4899</a>: Sections of the main page did not appear in the navigation tree until the main page had sub pages. Also fixed bug in treeview that caused mainpage with title and sections to appear at the same level as the sections.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685125">685125</a>: Doxygen could select the wrong overloaded method when +<li> id <a href="https://github.com/doxygen/doxygen/issues/4908">4908</a>: Doxygen could select the wrong overloaded method when the only difference in parameter types was the template type of a typedef.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685181">685181</a>: Inheriting member documentation did not work in combination +<li> id <a href="https://github.com/doxygen/doxygen/issues/4909">4909</a>: Inheriting member documentation did not work in combination with Java interfaces.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685623">685623</a>: Enum values did not appear in the detailed documentation +<li> id <a href="https://github.com/doxygen/doxygen/issues/4915">4915</a>: Enum values did not appear in the detailed documentation when using C++11 style enums.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685879">685879</a>: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation +<li> id <a href="https://github.com/doxygen/doxygen/issues/4920">4920</a>: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation still showed undocumented members.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685940">685940</a>: Fixed back button behaviour when using the navigation tree.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686284">686284</a>: Added anchors to refs in the index.qhp TOC.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686826">686826</a>: Added XML declaration to index.qhp TOC.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686956">686956</a>: When a class and its base class has the same nested class, +<li> id <a href="https://github.com/doxygen/doxygen/issues/4921">4921</a>: Fixed back button behaviour when using the navigation tree.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4927">4927</a>: Added anchors to refs in the index.qhp TOC.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Added XML declaration to index.qhp TOC.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4932">4932</a>: When a class and its base class has the same nested class, the collaboration diagram could point to the wrong class.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686983">686983</a>: Comments inside a function macro parameter appeared before +<li> id <a href="https://github.com/doxygen/doxygen/issues/4934">4934</a>: Comments inside a function macro parameter appeared before the expanded macro, instead of being treated as part of the parameter.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687301">687301</a>: Allow minus in the name of a HTML attribute.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687572">687572</a>: Code fragments were wrapped too early in the latex output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688226">688226</a>: Fixed Qt version number in ./configure --help text.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688463">688463</a>: Included patch to prevent processing identifiers starting +<li> id <a href="https://github.com/doxygen/doxygen/issues/4936">4936</a>: Allow minus in the name of a HTML attribute.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4939">4939</a>: Code fragments were wrapped too early in the latex output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4947">4947</a>: Fixed Qt version number in ./configure --help text.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4955">4955</a>: Included patch to prevent processing identifiers starting with _ or __ as markdown.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688531">688531</a>: Horizontal ruler inside paragraph caused missing </p></li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688542">688542</a>: Using "usergroup" in the layout.xml caused missing <div></li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688739">688739</a>: Fixed problem with user defined entries in the eclipse help +<li> id <a href="https://github.com/doxygen/doxygen/issues/4956">4956</a>: Horizontal ruler inside paragraph caused missing </p></li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4957">4957</a>: Using "usergroup" in the layout.xml caused missing <div></li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4962">4962</a>: Fixed problem with user defined entries in the eclipse help index (thanks to Rene Papenhoven for the fix).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688647">688647</a>: Fixed problem parsing initializer list with C++11 style +<li> id <a href="https://github.com/doxygen/doxygen/issues/4959">4959</a>: Fixed problem parsing initializer list with C++11 style uniform types.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689341">689341</a>: \if around list item preceded by whitespace caused wrong +<li> id <a href="https://github.com/doxygen/doxygen/issues/4968">4968</a>: \if around list item preceded by whitespace caused wrong list in the output. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689461">689461</a>: Correct link in documentation of SIP_SUPPORT option.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689720">689720</a>: Fixed bug that could prevent refman.tex from being generated.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689833">689833</a>: Fixed missing space in Chinese translation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690093">690093</a>: Files added via HTML_EXTRA_STYLESHEET did not correct refer +<li> id <a href="https://github.com/doxygen/doxygen/issues/4969">4969</a>: Correct link in documentation of SIP_SUPPORT option.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4979">4979</a>: Fixed bug that could prevent refman.tex from being generated.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4980">4980</a>: Fixed missing space in Chinese translation.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4989">4989</a>: Files added via HTML_EXTRA_STYLESHEET did not correct refer to files that where placed in a subdirectory.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690190">690190</a>: Searching for multibyte characters did not work with the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4991">4991</a>: Searching for multibyte characters did not work with the server based search engine.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690250">690250</a>: Fixed case where line numbers got out of sync with the code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690341">690341</a>: First member of an anonymous C++11 style enum was not shown +<li> id <a href="https://github.com/doxygen/doxygen/issues/4993">4993</a>: Fixed case where line numbers got out of sync with the code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4994">4994</a>: First member of an anonymous C++11 style enum was not shown properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690385">690385</a>: Fixed case where _'s where falsely converted to Markdown +<li> id <a href="https://github.com/doxygen/doxygen/issues/4995">4995</a>: Fixed case where _'s where falsely converted to Markdown emphasis.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690403">690403</a>: Title not used when \ref'ing to a \section imported via +<li> id <a href="https://github.com/doxygen/doxygen/issues/4996">4996</a>: Title not used when \ref'ing to a \section imported via a tag file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690418">690418</a>: Behavior of @cond was accidentally reversed by new expression +<li> id <a href="https://github.com/doxygen/doxygen/issues/4997">4997</a>: Behavior of @cond was accidentally reversed by new expression parser.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690602">690602</a>: Fixed problems handling @cond inside /// comments.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690629">690629</a>: Fixed case where doxygen would during preprocessing.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690685">690685</a>: A file specified using HTML_EXTRA_STYLEHSHEET did not end +<li> id <a href="https://github.com/doxygen/doxygen/issues/5000">5000</a>: Fixed problems handling @cond inside /// comments.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5001">5001</a>: Fixed case where doxygen would during preprocessing.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/5002">5002</a>: A file specified using HTML_EXTRA_STYLEHSHEET did not end up in the Qt Help index.</li> <li> Improved the way enum's are rendered in the HTML output.</li> <li> When inlining structs (INLINE_SIMPLE_STRUCTS=YES) a <p> was missing @@ -1794,20 +2195,20 @@ <pre>enum class E</pre></li> <li> enums with explicit type, e.g.: <pre>enum E : unsigned int { ... }</pre></li> - <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678097">678097</a>: added support for final keyword on classes and methods.</li> + <li> id <a href="https://github.com/doxygen/doxygen/issues/4749">4749</a>: added support for final keyword on classes and methods.</li> <li> support for override keyword for methods.</li> <li> <code>nullptr</code> is new a type keyword in code fragments.</li> <li> support for variables with initializer lists, e.g.: <pre>const int var {10};</pre></li> <li> support for trailing return types, e.g.: <pre>auto foo() -> Bar;</pre></li> - <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672372">672372</a>: added support for template aliases, + <li> id <a href="https://github.com/doxygen/doxygen/issues/4624">4624</a>: added support for template aliases, e.g.: <pre>template<typename T> using A = B<T>;</pre></li> <li> support for C++11 variadic templates, e.g.: <pre>template<typename... Values> class C;</pre></li> <li> support for documenting template class declarations.</li> - <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680098">680098</a>: <code>static_assert(...);</code> inside a class is now ignored.</li> - <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679740">679740</a>: Add support parameters with default lambda functions, + <li> id <a href="https://github.com/doxygen/doxygen/issues/4807">4807</a>: <code>static_assert(...);</code> inside a class is now ignored.</li> + <li> id <a href="https://github.com/doxygen/doxygen/issues/4793">4793</a>: Add support parameters with default lambda functions, e.g.: <pre>int foo(int i, std::function<int(int)> f = [](int x) -> int { return x / 2; })</pre></li> <li> default initializers for non-static data members, e.g.: <pre>class C { public: int x = 4; int y {6}; int z = y*func(); };</pre></li> @@ -1853,36 +2254,36 @@ member and its brief description.</li> <li> Fixed a couple of compiler warning with the new XCode 4.4 compiler.</li> <li> Added compilation support for Mountain Lion (Mac OS X 10.8).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679631">679631</a>: Nested namespaces did not appear in the namespace list if the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4789">4789</a>: Nested namespaces did not appear in the namespace list if the parent namespace was undocumented.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680227">680227</a>: Fixed some spelling errors in the code comments.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680398">680398</a>: Fortran: comma at begin of argument list description in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4809">4809</a>: Fixed some spelling errors in the code comments.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4814">4814</a>: Fortran: comma at begin of argument list description in case of implicit type</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680405">680405</a>: Fortran: Entities on line with USE, ONLY were not hyperlinked +<li> id <a href="https://github.com/doxygen/doxygen/issues/4815">4815</a>: Fortran: Entities on line with USE, ONLY were not hyperlinked in code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680408">680408</a>: Fortran: handle carriage return in non terminated strings.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680492">680492</a>: Using Markdown formatting in @todo/@bug/.. like descriptions +<li> id <a href="https://github.com/doxygen/doxygen/issues/4816">4816</a>: Fortran: handle carriage return in non terminated strings.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4821">4821</a>: Using Markdown formatting in @todo/@bug/.. like descriptions did not work.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680575">680575</a>: Fixed potential crash when <code> appeared inside <summary> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4823">4823</a>: Fixed potential crash when <code> appeared inside <summary> for C# code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680697">680697</a>: \xrefitems of the same type are not grouped together under +<li> id <a href="https://github.com/doxygen/doxygen/issues/4824">4824</a>: \xrefitems of the same type are not grouped together under the same heading (just like \todo and friends). </li> <li> Fixed case where full directory path was shown even though FULL_PATH_NAMES was set to NO.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680709">680709</a>: HTML output of template-derived classes contained unescaped +<li> id <a href="https://github.com/doxygen/doxygen/issues/4825">4825</a>: HTML output of template-derived classes contained unescaped characters.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679963">679963</a>: "Class Index" appeared twice in the PDF TOC, Index at the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4800">4800</a>: "Class Index" appeared twice in the PDF TOC, Index at the end did not appear at all.</li> <li> In a declaration no link was created when referring to a class inside an undocumented namespace imported via a tag file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681281">681281</a>: Make default for TAB_SIZE 4 and added remark in Markdown +<li> id <a href="https://github.com/doxygen/doxygen/issues/4840">4840</a>: Make default for TAB_SIZE 4 and added remark in Markdown section of the manual about the effect of TAB_SIZE on code block processing when using tabs in the comment block.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681023">681023</a>: Project logo was not included in the Qt help output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680992">680992</a>: Fixed a couple of typos in the comments.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681350">681350</a>: Fixed a problem with Markdown processing of a @code block +<li> id <a href="https://github.com/doxygen/doxygen/issues/4835">4835</a>: Project logo was not included in the Qt help output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4834">4834</a>: Fixed a couple of typos in the comments.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4841">4841</a>: Fixed a problem with Markdown processing of a @code block inside an indented /// style comment.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679928">679928</a>: Disabled section level correction for Markdown pages as +<li> id <a href="https://github.com/doxygen/doxygen/issues/4799">4799</a>: Disabled section level correction for Markdown pages as it was confusing.</li> </ul> <p> @@ -1896,7 +2297,7 @@ <ul> <li> doxygen now strips the leading indentation shared by the lines in a @code..@endcode block.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678218">678218</a>: Changed title of the SVG graphs from 'G' to the root node +<li> id <a href="https://github.com/doxygen/doxygen/issues/4755">4755</a>: Changed title of the SVG graphs from 'G' to the root node of the graph.</li> </ul> <h3>New features</h3> @@ -1905,41 +2306,41 @@ syncing the navigation tree with the content.</li> <li> Extended the number of HTML entities with Greek letters and other symbols (thanks to Charles Karney for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663645">663645</a>: Added support for C++11 strongly typed enums +<li> id <a href="https://github.com/doxygen/doxygen/issues/4464">4464</a>: Added support for C++11 strongly typed enums (enum class E { ... }).</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590518">590518</a>: Added missing class member initialization to a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3470">3470</a>: Added missing class member initialization to a class in doxmlparser and made the library compile again.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667678">667678</a>: Added support for Obj-C property attribute "unsafe_retained".</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674842">674842</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676984">676984</a>: Unmatched quote in a comment prevented alias expansion.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676019">676019</a>: Fixed another case where local include path did not appear +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Added support for Obj-C property attribute "unsafe_retained".</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4682">4682</a>, <a href="https://github.com/doxygen/doxygen/issues/4721">4721</a>: Unmatched quote in a comment prevented alias expansion.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4702">4702</a>: Fixed another case where local include path did not appear correctly in the class documentation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676966">676966</a>: Fortran: Some keyword were not colored in the source view.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676981">676981</a>: Fortran: Argument type was wrong type of in case of out of +<li> id <a href="https://github.com/doxygen/doxygen/issues/4716">4716</a>: Fortran: Some keyword were not colored in the source view.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4720">4720</a>: Fortran: Argument type was wrong type of in case of out of place !> comment</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677935">677935</a>: Included patch to fix problem compiling for x86 release on +<li> id <a href="https://github.com/doxygen/doxygen/issues/4739">4739</a>: Included patch to fix problem compiling for x86 release on Windows.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677992">677992</a>: Section without title could result in an invalid Qt Help +<li> id <a href="https://github.com/doxygen/doxygen/issues/4741">4741</a>: Section without title could result in an invalid Qt Help index.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678022">678022</a>: Anonymous enum could result in an invalid Qt Help index.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678102">678102</a>: Superfluous trailing comma in javascript +<li> id <a href="https://github.com/doxygen/doxygen/issues/4743">4743</a>: Anonymous enum could result in an invalid Qt Help index.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4751">4751</a>: Superfluous trailing comma in javascript prevented navigation tree to load in IE7.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678177">678177</a>: a + at the start of a line inside a <pre> block, +<li> id <a href="https://github.com/doxygen/doxygen/issues/4753">4753</a>: a + at the start of a line inside a <pre> block, triggered the start of a list. Also -- and --- where not kept untouched inside a <pre> block.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678180">678180</a>: ndash (--) appearing in a brief description could lead +<li> id <a href="https://github.com/doxygen/doxygen/issues/4754">4754</a>: ndash (--) appearing in a brief description could lead to invalid SVG images.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678288">678288</a>: -- and --- inside a Markdown code block were not handled +<li> id <a href="https://github.com/doxygen/doxygen/issues/4759">4759</a>: -- and --- inside a Markdown code block were not handled properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679331">679331</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675766">675766</a>: In body documentation with a different indentation then the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4783">4783</a>, <a href="https://github.com/doxygen/doxygen/issues/4699">4699</a>: In body documentation with a different indentation then the main documentation was not rendered correctly (MARKDOWN=YES).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679436">679436</a>: Using an escaped pipe symbol in a Markdown table did not get +<li> id <a href="https://github.com/doxygen/doxygen/issues/4784">4784</a>: Using an escaped pipe symbol in a Markdown table did not get unescaped in the output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679533">679533</a>: Code fragments did not appear properly in the doxygen manual.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679615">679615</a>: Added missing delete call in a piece of debugging code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Fixed some navigation issues in the manual</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4785">4785</a>: Code fragments did not appear properly in the doxygen manual.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4786">4786</a>: Added missing delete call in a piece of debugging code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4788">4788</a>: Fixed some navigation issues in the manual</li> <li> Not all inherited members appeared in the "Additional inherited members" list.</li> <li> Link to call after "Inherited members" was not correct when @@ -1964,30 +2365,30 @@ <ul> <li> VHDL code now has a new Design Overview page (thanks for Martin Kreis for the patch). Requires HAVE_DOT=YES, and DOT_IMAGE_FORMAT=svg.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677678">677678</a>: Added support for strong and weak attributes in Objective-C +<li> id <a href="https://github.com/doxygen/doxygen/issues/4735">4735</a>: Added support for strong and weak attributes in Objective-C properties.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618462">618462</a>: Fortran: Appearance of comments in the HTML output +<li> id <a href="https://github.com/doxygen/doxygen/issues/3772">3772</a>: Fortran: Appearance of comments in the HTML output are now customizable via CSS again.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673660">673660</a>: <code> inside a <summary> or <remarks> section is now treated +<li> id <a href="https://github.com/doxygen/doxygen/issues/4655">4655</a>: <code> inside a <summary> or <remarks> section is now treated as @code (was already the code for C#).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673921">673921</a>: When a comment started at indent >= 4 after a /** and +<li> id <a href="https://github.com/doxygen/doxygen/issues/4661">4661</a>: When a comment started at indent >= 4 after a /** and continued at the same indent without leading * after a blank line, the continued part appeared at as a code block when Markdown was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675036">675036</a>: If a file was not indexed, the navigation tree became empty.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676019">676019</a>: Include path using quotes did not work as documented.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676877">676877</a>: @warning did not end at blank line when followed by +<li> id <a href="https://github.com/doxygen/doxygen/issues/4689">4689</a>: If a file was not indexed, the navigation tree became empty.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4702">4702</a>: Include path using quotes did not work as documented.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4709">4709</a>: @warning did not end at blank line when followed by a numbered list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676902">676902</a>: An anonymous namespace could introduce an invalid entry in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4713">4713</a>: An anonymous namespace could introduce an invalid entry in the navigation list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676948">676948</a>: Breadcrumb navigation path had wrong links when +<li> id <a href="https://github.com/doxygen/doxygen/issues/4715">4715</a>: Breadcrumb navigation path had wrong links when CREATE_SUBDIRS was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677315">677315</a>: Fixed case where function was incorrectly detected as a +<li> id <a href="https://github.com/doxygen/doxygen/issues/4729">4729</a>: Fixed case where function was incorrectly detected as a variable.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677589">677589</a>: Fixed typo in the documentation of the LAYOUT_FILE option.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677771">677771</a>: Fixed visual misalignment for first argument.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4733">4733</a>: Fixed typo in the documentation of the LAYOUT_FILE option.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4737">4737</a>: Fixed visual misalignment for first argument.</li> <li> The "arrow out" button in interactive SVG did not work when served from a web server, due to the use of an absolute path.</li> <li> If a declaration was too wide for a page, the content in HTML spilled @@ -2037,8 +2438,7 @@ make sure you add the following: <script type="text/javascript" src="$relpath$jquery.js"></script> <script type="text/javascript" src="$relpath$dynsections.js"></script></pre><p> Otherwise the interactivity of the trees does not work. - </p> -</li> + </p> </li> <li> Included a couple of performance improvements (thanks to Dirk Reiners)</li> <li> Changed the way member attributes (like protected, virtual, and static) are rendered in the HTML output.</li> @@ -2052,14 +2452,14 @@ make sure you add the following: <li> For interactive SVGs the print button has been replaced by a "arrow out" button that opens the original non-interactive SVG in a new window for easy printing or saving. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661499">661499</a>: Long names are now wrapped in the dot nodes to avoid +<li> id <a href="https://github.com/doxygen/doxygen/issues/4426">4426</a>: Long names are now wrapped in the dot nodes to avoid very wide graphs.</li> </ul> <h3>New features</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666527">666527</a>: Added support for <inheritdoc/> C# XML command +<li> id <a href="https://github.com/doxygen/doxygen/issues/4508">4508</a>: Added support for <inheritdoc/> C# XML command (thanks to John Werner for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670965">670965</a>, Added support for resolving environment variables of the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4588">4588</a>, Added support for resolving environment variables of the form $(PROGRAMFILES(X86)) inside the config file</li> <li> Doxygen now shows Objective-C properties in collaboration diagrams (thanks to Sven Weidauer for the patch).</li> @@ -2067,77 +2467,77 @@ make sure you add the following: <li> Inherited class members are now shown as expandable sections in the member overview (default is collapsed). Each section is rendered as a table. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674349">674349</a>: Included build support for NetBSD.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4669">4669</a>: Included build support for NetBSD.</li> <li> A -- will now be rendered as an 'en dash', similarly, --- will produce an mdash.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523156">523156</a>: Fortran: Prefix of routines got stripped.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666088">666088</a>: Include VHDL patch (thanks to Martin Kreis).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670235">670235</a>: Fixed include guard detection problem when using +<li> id <a href="https://github.com/doxygen/doxygen/issues/2891">2891</a>: Fortran: Prefix of routines got stripped.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4502">4502</a>: Include VHDL patch (thanks to Martin Kreis).</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4569">4569</a>: Fixed include guard detection problem when using #pragma once</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670805">670805</a>: A numbered list (1. 2. 3.) where each list item ended with +<li> id <a href="https://github.com/doxygen/doxygen/issues/4582">4582</a>: A numbered list (1. 2. 3.) where each list item ended with an empty line is no longer treated as a set of separate lists (all starting with 1.).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670889">670889</a>: Java: last enum value did not appear in the output unless it was +<li> id <a href="https://github.com/doxygen/doxygen/issues/4586">4586</a>: Java: last enum value did not appear in the output unless it was followed by a comma.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671023">671023</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671312">671312</a>: Regression: Autolist items starting on a new paragraph +<li> id <a href="https://github.com/doxygen/doxygen/issues/4591">4591</a>, <a href="https://github.com/doxygen/doxygen/issues/4606">4606</a>: Regression: Autolist items starting on a new paragraph at indent level larger than 0 were not processed correctly. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671076">671076</a>: Sections could be missing from the navigation tree in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4594">4594</a>: Sections could be missing from the navigation tree in some situations.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671158">671158</a>: @tableofcontents did not work for the main page (@mainpage)</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671159">671159</a>: Sections in a separate markdown page did not appear in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4597">4597</a>: @tableofcontents did not work for the main page (@mainpage)</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4598">4598</a>: Sections in a separate markdown page did not appear in the table of contents.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671166">671166</a>: Fortran: Fixed problem causing call/caller graphs not to be +<li> id <a href="https://github.com/doxygen/doxygen/issues/4600">4600</a>: Fortran: Fixed problem causing call/caller graphs not to be generated.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671171">671171</a>: RPM spec file was updated to make it work with RHEL 6.2 +<li> id <a href="https://github.com/doxygen/doxygen/issues/4601">4601</a>: RPM spec file was updated to make it work with RHEL 6.2 (thanks to Peter Klotz for the patch)</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671240">671240</a>: Corrected line number of error message reported for +<li> id <a href="https://github.com/doxygen/doxygen/issues/4604">4604</a>: Corrected line number of error message reported for pages.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671291">671291</a>: C# regression: enum values where not shown in the docs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671395">671395</a>: When #some_member appeared at the start of a line it was +<li> id <a href="https://github.com/doxygen/doxygen/issues/4605">4605</a>: C# regression: enum values where not shown in the docs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4607">4607</a>: When #some_member appeared at the start of a line it was seen as a level one header instead of a link to a member when Markdown processing was enabled. Now at least one space is required after the # to make it a header.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671426">671426</a>: Fixed case where doxygen could crash when a section and +<li> id <a href="https://github.com/doxygen/doxygen/issues/4608">4608</a>: Fixed case where doxygen could crash when a section and subsection had the same label.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671591">671591</a>: docset creating could fail due to invalid Nodes.xml</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671702">671702</a>: Using \internal in a group or member did not hide it +<li> id <a href="https://github.com/doxygen/doxygen/issues/4610">4610</a>: docset creating could fail due to invalid Nodes.xml</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4614">4614</a>: Using \internal in a group or member did not hide it from the navigation tree if there was no documentation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671709">671709</a>: Backticks in C# comments did not appear as inline +<li> id <a href="https://github.com/doxygen/doxygen/issues/4615">4615</a>: Backticks in C# comments did not appear as inline fragments, like was the case for other languages.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672119">672119</a>: PHP: defines are now shown as constants rather than enums.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672662">672662</a>: File with .md or .markdown extension were not included +<li> id <a href="https://github.com/doxygen/doxygen/issues/4620">4620</a>: PHP: defines are now shown as constants rather than enums.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4636">4636</a>: File with .md or .markdown extension were not included with the default setting of FILE_PATTERNS.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672366">672366</a>: mailto style URLs did not work correctly in combination with +<li> id <a href="https://github.com/doxygen/doxygen/issues/4623">4623</a>: mailto style URLs did not work correctly in combination with CREATE_SUBDIRS = YES.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672472">672472</a>: Removed bogus </b> when using @par.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672475">672475</a>: Added "warning:" prefix to "missing \endcode" message.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672479">672479</a>: Doxygen comments after a macro definition were not +<li> id <a href="https://github.com/doxygen/doxygen/issues/4626">4626</a>: Removed bogus </b> when using @par.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4627">4627</a>: Added "warning:" prefix to "missing \endcode" message.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4629">4629</a>: Doxygen comments after a macro definition were not removed in the source browser view.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672526">672526</a>: Removed black line in front of custom paragraphs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672536">672536</a>: PHP: use keyword was not handled correctly when importing +<li> id <a href="https://github.com/doxygen/doxygen/issues/4632">4632</a>: Removed black line in front of custom paragraphs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: PHP: use keyword was not handled correctly when importing classes from another namespace.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672620">672620</a>: Switched to using "Macro" in the output instead of "Define".</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672656">672656</a>: Using ![caption](filename.png) did not work correctly for +<li> id <a href="https://github.com/doxygen/doxygen/issues/4634">4634</a>: Switched to using "Macro" in the output instead of "Define".</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4635">4635</a>: Using ![caption](filename.png) did not work correctly for local images pointed to with IMAGE_PATH.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673045">673045</a>: A block of ///'s inside a verbatim block inside a .md +<li> id <a href="https://github.com/doxygen/doxygen/issues/4642">4642</a>: A block of ///'s inside a verbatim block inside a .md file was replaced by /** .. */</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673066">673066</a>: Doxygen now skips scanning files in directories starting with +<li> id <a href="https://github.com/doxygen/doxygen/issues/4645">4645</a>: Doxygen now skips scanning files in directories starting with a dot (e.g. .svn).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673219">673219</a>: Included patch by Ryan Schmidt to make the Mac versions +<li> id <a href="https://github.com/doxygen/doxygen/issues/4651">4651</a>: Included patch by Ryan Schmidt to make the Mac versions in qglobal.h match that of Apple header files.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673870">673870</a>: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673983">673983</a>: Using a backslash in a section cause 026E30F to appear in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4659">4659</a>: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4662">4662</a>: Using a backslash in a section cause 026E30F to appear in the latex TOC.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674563">674563</a>: Fortran: case sensitiveness for routines and functions +<li> id <a href="https://github.com/doxygen/doxygen/issues/4675">4675</a>: Fortran: case sensitiveness for routines and functions did not work</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674583">674583</a>: Fortran: continuation by ampersand not placed in code output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675757">675757</a>: Fixed indenting issue after the end of a markdown code block +<li> id <a href="https://github.com/doxygen/doxygen/issues/4676">4676</a>: Fortran: continuation by ampersand not placed in code output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4698">4698</a>: Fixed indenting issue after the end of a markdown code block inside a list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676116">676116</a>: Use new index style for page index.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676294">676294</a>: Fixed LaTeX error when backslash appeared in a hyperlinked +<li> id <a href="https://github.com/doxygen/doxygen/issues/4703">4703</a>: Use new index style for page index.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4704">4704</a>: Fixed LaTeX error when backslash appeared in a hyperlinked code fragment.</li> <li> Tag files had wrong character encoding set in the header.</li> <li> C# in/out did not appear in generics using covariance or contravariance.</li> @@ -2162,7 +2562,7 @@ make sure you add the following: <h3>Changes</h3> <ul> <li> Auto list items can now consist of multiple paragraphs. - The indentation of the (first line) of a new paragraph detemines + The indentation of the (first line) of a new paragraph determines to which list item the paragraph belongs or if it marks the end of the list. </li> <li> When UML_LOOK is enabled, relations shown on the edge of a graph @@ -2170,19 +2570,19 @@ make sure you add the following: <li> Updated the manual and improved the look.</li> <li> Made the contents in the navigation tree more consistent for groups, pages with subpages, and grouped subpages.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669079">669079</a>: Latex: made the margins of latex page layout smaller using +<li> id <a href="https://github.com/doxygen/doxygen/issues/4558">4558</a>: Latex: made the margins of latex page layout smaller using the geometry package.</li> <li> The tool doxytag has been declared obsolete and is removed (it wasn't working properly anyway). Same goes for the installdox script.</li> <li> Updated the copyright in source code and doxywizard "about" to 2012.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668008">668008</a>: HTML version of the manual now has the treeview enabled +<li> id <a href="https://github.com/doxygen/doxygen/issues/4533">4533</a>: HTML version of the manual now has the treeview enabled for easier navigation.</li> </ul> <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 @@ -2206,7 +2606,7 @@ make sure you add the following: Note that doxygen uses a relative indent of 4 spaces, not an absolute indent like Markdown does. </li> <li> Markdown style hyperlinks and hyperlink references.</li> - <li> Simple tables can be created using the <a href="http://michelf.com/projects/php-markdown/extra/#table">Markdown Extra format</a>.</li> + <li> Simple tables can be created using the <a href="https://michelf.ca/projects/php-markdown/extra/#table">Markdown Extra format</a>.</li> <li> <a href="http://freewisdom.org/projects/python-markdown/Fenced_Code_Blocks">Fenced code blocks</a> are also supported, include language selection.</li> <li> files with extension .md or .markdown are converted to related pages.</li> </ul> @@ -2237,70 +2637,70 @@ make sure you add the following: LaTeX and RTF output. </li> <li> Added -d filteroutput option to show the output of an input filter (thanks to Albert for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668010">668010</a>: Latex: for Windows doxygen new generates a makepdf.bat +<li> id <a href="https://github.com/doxygen/doxygen/issues/4534">4534</a>: Latex: for Windows doxygen new generates a makepdf.bat file in the latex output dir to create the latex documentation.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=498703">498703</a>: Fixed encoding issue in CHM index file for group titles.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=510975">510975</a>: FORTRAN: Keywords like .GT. recognized as symbols for +<li> id <a href="https://github.com/doxygen/doxygen/issues/2729">2729</a>: Fixed encoding issue in CHM index file for group titles.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/2791">2791</a>: FORTRAN: Keywords like .GT. recognized as symbols for cross ref.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=511906">511906</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581303">581303</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622749">622749</a>: \copydoc did copy the brief description +<li> id <a href="https://github.com/doxygen/doxygen/issues/2799">2799</a>, <a href="https://github.com/doxygen/doxygen/issues/3376">3376</a>, <a href="https://github.com/doxygen/doxygen/issues/3825">3825</a>: \copydoc did copy the brief description into the detailed section, causing a difference between the original and the copy.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=555327">555327</a>: Using @ref for an example file, caused it to appear as +<li> id <a href="https://github.com/doxygen/doxygen/issues/3116">3116</a>: Using @ref for an example file, caused it to appear as file::ext.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567494">567494</a>: Fortran: Included patch for blockdata sub-programs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628417">628417</a>: Fortran: doxygen filter, preparsing fixed form of null</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662286">662286</a>: TCL: Included patch to fixed UTF-8 support.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662289">662289</a>: TCL: Included patch to prevent ##### from appearing in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3228">3228</a>: Fortran: Included patch for blockdata sub-programs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3920">3920</a>: Fortran: doxygen filter, preparsing fixed form of null</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4443">4443</a>: TCL: Included patch to fixed UTF-8 support.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4444">4444</a>: TCL: Included patch to prevent ##### from appearing in the output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646319">646319</a>: Using a file name with path for HTML_STYLESHEET caused the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4220">4220</a>: Using a file name with path for HTML_STYLESHEET caused the path to appear in the HTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664826">664826</a>: Fixed one more problem with include guard detection.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665629">665629</a>: Fixed parse problem when a #define appeared inside an enum.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665855">665855</a>: Fixed problem parsing C++ template specialization of the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4477">4477</a>: Fixed one more problem with include guard detection.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4492">4492</a>: Fixed parse problem when a #define appeared inside an enum.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4497">4497</a>: Fixed problem parsing C++ template specialization of the form A<func(T*)> such as used in boost::signal2 types.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666047">666047</a>: A </p> followed by an htmlonly..endhtmlonly section +<li> id <a href="https://github.com/doxygen/doxygen/issues/4500">4500</a>: A </p> followed by an htmlonly..endhtmlonly section caused invalid XHTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666085">666085</a>: Fixed include handling in case the include guard was +<li> id <a href="https://github.com/doxygen/doxygen/issues/4501">4501</a>: Fixed include handling in case the include guard was documented.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666124">666124</a>: Fixed problem loading the navigation tree in IE8 when +<li> id <a href="https://github.com/doxygen/doxygen/issues/4505">4505</a>: Fixed problem loading the navigation tree in IE8 when serving pages via a web server.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666337">666337</a>: Included patch to avoid hyphenation hints in front of the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4506">4506</a>: Included patch to avoid hyphenation hints in front of the first capital in a word.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666568">666568</a>: When SHOW_FILES was NO, a grouped function did not appear +<li> id <a href="https://github.com/doxygen/doxygen/issues/4509">4509</a>: When SHOW_FILES was NO, a grouped function did not appear in the javascript based search index.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666909">666909</a>: \copybrief introduced extra spacing in the HTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666986">666986</a>: Fixed case where search engine specific code appeared +<li> id <a href="https://github.com/doxygen/doxygen/issues/4514">4514</a>: \copybrief introduced extra spacing in the HTML output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4515">4515</a>: Fixed case where search engine specific code appeared twice in the HTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666993">666993</a>: Fixed bug in the generated makefile causing index not +<li> id <a href="https://github.com/doxygen/doxygen/issues/4516">4516</a>: Fixed bug in the generated makefile causing index not to be generated when using pdflatex.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667020">667020</a>: HTML output for example pages was not well-formed.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667192">667192</a>: Include statements in latex output where placed all on +<li> id <a href="https://github.com/doxygen/doxygen/issues/4517">4517</a>: HTML output for example pages was not well-formed.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4520">4520</a>: Include statements in latex output where placed all on one line in the LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667835">667835</a>: PHP: Fixed problem handling heredoc blocks</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667844">667844</a>: For aliases with a single argument it is no longer required +<li> id <a href="https://github.com/doxygen/doxygen/issues/4526">4526</a>: PHP: Fixed problem handling heredoc blocks</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4527">4527</a>: For aliases with a single argument it is no longer required to escape commas that appear inside the argument text.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668037">668037</a>: Latex: tables can now span multiple pages by using the xtab +<li> id <a href="https://github.com/doxygen/doxygen/issues/4536">4536</a>: Latex: tables can now span multiple pages by using the xtab package.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668218">668218</a>: Doxygen will ignore the common prefix shared by all +<li> id <a href="https://github.com/doxygen/doxygen/issues/4544">4544</a>: Doxygen will ignore the common prefix shared by all directories when computing a names for the directory's output files. This will make the names of the output more stable.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668519">668519</a>: Added missing newline in man page output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669071">669071</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669072">669072</a>: Fixed parse problem for Q_PROPERTY when a template +<li> id <a href="https://github.com/doxygen/doxygen/issues/4549">4549</a>: Added missing newline in man page output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4555">4555</a>, <a href="https://github.com/doxygen/doxygen/issues/4556">4556</a>: Fixed parse problem for Q_PROPERTY when a template with a namespaced type was used.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669078">669078</a>: Included patch which changes MATHJAX_RELPATH to use the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4557">4557</a>: Included patch which changes MATHJAX_RELPATH to use the content delivery network by default.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669138">669138</a>: Fortran: Fixed problem handling multiple definition +<li> id <a href="https://github.com/doxygen/doxygen/issues/4560">4560</a>: Fortran: Fixed problem handling multiple definition statements on one line.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669406">669406</a>: Using -d Preprocessor now also works when QUIET is YES.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669434">669434</a>: Latex: citations where only generated properly if the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4561">4561</a>: Using -d Preprocessor now also works when QUIET is YES.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4563">4563</a>: Latex: citations where only generated properly if the bib files specified via CITE_BIB_FILES did not have a path.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669758">669758</a>: Tcl: Same function in multiple Tcl namespaces not added.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670289">670289</a>: Fixed case where doxygen would not correctly detect +<li> id <a href="https://github.com/doxygen/doxygen/issues/4565">4565</a>: Tcl: Same function in multiple Tcl namespaces not added.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4574">4574</a>: Fixed case where doxygen would not correctly detect >> as a termination of a nested template.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670571">670571</a>: subpages generate empty pages in latex/rtf output and +<li> id <a href="https://github.com/doxygen/doxygen/issues/4580">4580</a>: subpages generate empty pages in latex/rtf output and broken links when SHORT_NAME was set to YES.</li> <li> Included VHDL fixes provided by Martin Kreis.</li> <li> The word "dummy" wrongly appeared before the first parameter type in @@ -2317,7 +2717,7 @@ make sure you add the following: <a name="1.7.6.1"></a> </p> <h1>Doxygen Release 1.7.6.1</h1> -<h2>(release date 10-12-2011)</h2> +<b>(release date 10-12-2011)</b> <h3>Changes</h3> <ul> <li> Doxygen now reports its cache usage (for the symbol and the @@ -2334,19 +2734,19 @@ make sure you add the following: <h3>Bug fixes</h3> <ul> <li> Python: scopes are now shown with . instead of ::</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665313">665313</a>: Space before @if was not preserved, causing problems +<li> id <a href="https://github.com/doxygen/doxygen/issues/4483">4483</a>: Space before @if was not preserved, causing problems with inline @if .. @endif constructs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665583">665583</a>: Fixed XHTML validity problem when using mscgen graphs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665641">665641</a>: Fixed XHTML validity problem when GENERATE_TREEVIEW was +<li> id <a href="https://github.com/doxygen/doxygen/issues/4490">4490</a>: Fixed XHTML validity problem when using mscgen graphs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4493">4493</a>: Fixed XHTML validity problem when GENERATE_TREEVIEW was disabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665720">665720</a>: Included patch to fix hang issue when non-empty +<li> id <a href="https://github.com/doxygen/doxygen/issues/4494">4494</a>: Included patch to fix hang issue when non-empty INCLUDE_PATH was used.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665778">665778</a>: Fixed parse issue when a comma appeared as part of an +<li> id <a href="https://github.com/doxygen/doxygen/issues/4495">4495</a>: Fixed parse issue when a comma appeared as part of an enum's value.</li> </ul> <a name="1.7.6"></a> <h1>Doxygen Release 1.7.6</h1> -<h2>(release date 03-12-2011)</h2> +<b>(release date 03-12-2011)</b> <h3>Changes</h3> <ul> <li> To improve the performance of loading the navigation tree, @@ -2367,7 +2767,7 @@ make sure you add the following: <h3>New features</h3> <ul> <li> Update of the French translation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607305">607305</a>: Added support for PHP heredoc and nowdoc constructs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3637">3637</a>: Added support for PHP heredoc and nowdoc constructs.</li> <li> Added support for cross-referencing in case of operator-> overloading. This includes support for std::auto_ptr,std::smart_ptr,std::unique_ptr and std::weak_ptr when BUILTIN_STL_SUPPORT is enabled.</li> @@ -2381,84 +2781,84 @@ make sure you add the following: definitions preceded by whitespace (thanks to Rene Zaumseil)</li> <li> When using "static int a,b" variable "b" incorrectly appeared in the output even though EXTRACT_STATIC was set to NO.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=657152">657152</a>: Fixed constant expression evaluation error in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/2867">2867</a>: .spec file was only updated after running ./configure</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4363">4363</a>: Fixed potential crash when using doxygen for large projects.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4370">4370</a>: Fixed problem running bibtex with \cite command on Windows.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4375">4375</a>: Fixed constant expression evaluation error in the preprocessor.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Removed bogus ' from the man page output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=659244">659244</a>: Quotes in the brief description could appear unescaped in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4294">4294</a>: Removed bogus ' from the man page output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4411">4411</a>: Quotes in the brief description could appear unescaped in the tooltip.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #includes with ../ were not always processed correctly.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4137">4137</a>: #includes with ../ were not always processed correctly.</li> <li> Fixed potential crash when INLINE_GROUPED_CLASSES and INLINE_SIMPLE_STRUCTS are set to YES.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658896">658896</a>: Fixed preprocessor problem handling #defines whose value was +<li> id <a href="https://github.com/doxygen/doxygen/issues/4406">4406</a>: Fixed preprocessor problem handling #defines whose value was a constant string containing ///.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660332">660332</a>: Using a \ at the end of a comment line could cause +<li> id <a href="https://github.com/doxygen/doxygen/issues/4419">4419</a>: Using a \ at the end of a comment line could cause parsing problems for C# as the \ was treated as a line continuation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658033">658033</a>: Fixed parser problem when using multiple member groups +<li> id <a href="https://github.com/doxygen/doxygen/issues/4391">4391</a>: Fixed parser problem when using multiple member groups inside a macro definition.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=503239">503239</a>: Fixed several issues related to \cite handling.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658587">658587</a>: Improved the way macro definitions are collected.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660501">660501</a>: Fixed LaTeX error when using \name with a description.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661292">661292</a>: The documentation for \mainpage incorrectly mentioned that +<li> id <a href="https://github.com/doxygen/doxygen/issues/2755">2755</a>: Fixed several issues related to \cite handling.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4400">4400</a>: Improved the way macro definitions are collected.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4421">4421</a>: Fixed LaTeX error when using \name with a description.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4424">4424</a>: The documentation for \mainpage incorrectly mentioned that one has to use \ref main in case GENERATE_TREEVIEW was set to YES, which is no longer the case.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=659096">659096</a>: Nested aliases definitions where not always expanded properly +<li> id <a href="https://github.com/doxygen/doxygen/issues/4409">4409</a>: Nested aliases definitions where not always expanded properly (regression w.r.t version 1.7.4)</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658038">658038</a>: Fixed preprocessor problem where the @ character inside a +<li> id <a href="https://github.com/doxygen/doxygen/issues/4392">4392</a>: Fixed preprocessor problem where the @ character inside a macro definition could appear as @@.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658646">658646</a>: Fixed problem running mscgen for LaTeX and RTF output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661723">661723</a>: Using ClassName%'s did not work anymore, and also +<li> id <a href="https://github.com/doxygen/doxygen/issues/4401">4401</a>: Fixed problem running mscgen for LaTeX and RTF output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4429">4429</a>: Using ClassName%'s did not work anymore, and also ClassName's wasn't autolinked.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662044">662044</a>: Fixed potential printing of null pointer when using +<li> id <a href="https://github.com/doxygen/doxygen/issues/4437">4437</a>: Fixed potential printing of null pointer when using a version filter that returned blanks.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625518">625518</a>: Fortran: first problem where subroutine using results +<li> id <a href="https://github.com/doxygen/doxygen/issues/3871">3871</a>: Fortran: first problem where subroutine using results variable appeared as a function.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654153">654153</a>: If an URL appeared at the end of a sentence, the period +<li> id <a href="https://github.com/doxygen/doxygen/issues/4331">4331</a>: If an URL appeared at the end of a sentence, the period was included in the URL.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656560">656560</a>: Fortran: Added support for the Double Complex type.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663640">663640</a>: Included workaround for Solaris CC issue in index.cpp</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662190">662190</a>: Included patch to fix some TCL issues and add the TCL_SUBST +<li> id <a href="https://github.com/doxygen/doxygen/issues/4362">4362</a>: Fortran: Added support for the Double Complex type.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4462">4462</a>: Included workaround for Solaris CC issue in index.cpp</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4441">4441</a>: Included patch to fix some TCL issues and add the TCL_SUBST configuration option.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661672">661672</a>: Fortran: Added support for ALIAS expansion in comment blocks.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663101">663101</a>: Fixed case where a macro was not corrected found in the header +<li> id <a href="https://github.com/doxygen/doxygen/issues/4428">4428</a>: Fortran: Added support for ALIAS expansion in comment blocks.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4451">4451</a>: Fixed case where a macro was not corrected found in the header file when it could only be found via INCLUDE_PATH.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664718">664718</a>: using multiple <para>'s inside a <summary> block caused +<li> id <a href="https://github.com/doxygen/doxygen/issues/4474">4474</a>: using multiple <para>'s inside a <summary> block caused text to be joined without spacing.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656556">656556</a>: Java enums are now parsed as classes. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664826">664826</a>: Fixed problem in the preprocessor regarding the handling +<li> id <a href="https://github.com/doxygen/doxygen/issues/4361">4361</a>: Java enums are now parsed as classes. </li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4477">4477</a>: Fixed problem in the preprocessor regarding the handling of include guards.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664893">664893</a>: Fixed typo in the docs for EXCLUDE_SYMLINKS.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665466">665466</a>: Using a relative URL with <a href> did not work when +<li> id <a href="https://github.com/doxygen/doxygen/issues/4478">4478</a>: Fixed typo in the docs for EXCLUDE_SYMLINKS.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4487">4487</a>: Using a relative URL with <a href> did not work when CREATE_SUBDIRS was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665464">665464</a>: Using an absolute URL with <img> did not work when +<li> id <a href="https://github.com/doxygen/doxygen/issues/4486">4486</a>: Using an absolute URL with <img> did not work when CREATE_SUBDIRS was enabled.</li> </ul> <a name="1.7.5.1"></a> <h1>Doxygen Release 1.7.5.1</h1> -<h2>(release date 21-08-2011)</h2> +<b>(release date 21-08-2011)</b> <h3>New features</h3> <ul> <li>Update of the French translation.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/2867">2867</a>: .spec file was only updated after running ./configure</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4363">4363</a>: Fixed potential crash when using doxygen for large projects.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4370">4370</a>: Fixed problem running bibtex with \cite command on Windows.</li> <li>Regression: some information was no longer available for a class, due to accidental deletion of a code block.</li> <li>Regression: fixed matching problem in the code parser.</li> </ul> <a name="1.7.5"></a> <h1>Doxygen Release 1.7.5</h1> -<h2>(release date 14-08-2011)</h2> +<b>(release date 14-08-2011)</b> <h3>Changes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641904">641904</a>: Function in the call graphs are now shown based on first +<li> id <a href="https://github.com/doxygen/doxygen/issues/4145">4145</a>: Function in the call graphs are now shown based on first appearance rather then alphabetical order.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616213">616213</a>: When customizing the HTML header $title now only generates +<li> id <a href="https://github.com/doxygen/doxygen/issues/3743">3743</a>: When customizing the HTML header $title now only generates the title excluding the project name (which can still be added using $projectname)</li> <li> Improved the look of the class index: all items now have equal spacing.</li> @@ -2482,7 +2882,7 @@ make sure you add the following: SERVER_BASED_SEARCH=YES) doxygen now advertises a opensearch provider for your project, that allows integrating the search directly in the search field of the browser (thanks to Phil Lello for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=503239">503239</a>: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new +<li> id <a href="https://github.com/doxygen/doxygen/issues/2755">2755</a>: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new command \cite, allowing you to make references to literature (as defined in one or more .bib files). This also works for output formats other than LaTeX. The tool bibtex is required for this to work though. Thanks @@ -2490,7 +2890,7 @@ make sure you add the following: <li> PHP namespaces are now shown as A\B in the output.</li> <li> Added new \snippet command that can be used to include marked sections from a source file. See - http://www.doxygen.org/commands.html#cmdsnippet for more info.</li> + <a href="commands.html#cmdsnippet">\snippet</a> for more info.</li> <li> Added translation support for Armenian, thank to Armen Tangamyan. and included translation updates for a number of languages.</li> </ul> @@ -2507,96 +2907,96 @@ make sure you add the following: set to xhtml.</li> <li> Fixed several cases where the LaTeX output could produce too long lines.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=318061">318061</a>: Putting two functions in the same group that only +<li> id <a href="https://github.com/doxygen/doxygen/issues/1837">1837</a>: Putting two functions in the same group that only different in the number of template arguments did not work.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=437346">437346</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=564614">564614</a>: Fixed proper encoding of multibyte output in RTF +<li> id <a href="https://github.com/doxygen/doxygen/issues/2483">2483</a>, <a href="https://github.com/doxygen/doxygen/issues/3199">3199</a>: Fixed proper encoding of multibyte output in RTF depending on the code page (thanks to Hirao for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: The .spec file in the source distribution did not get +<li> id <a href="https://github.com/doxygen/doxygen/issues/2867">2867</a>: The .spec file in the source distribution did not get updated to the latest version.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521861">521861</a>: Fortran: Continuation character was not recognised in +<li> id <a href="https://github.com/doxygen/doxygen/issues/2872">2872</a>: Fortran: Continuation character was not recognised in fixed format code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=522496">522496</a>: Fortran: @param checking was not case insensitive.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=560105">560105</a>: Fixed problem combining @cond with preprocessor directives.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=577359">577359</a>: Using "struct A : C, D {};" showed a private inheritance +<li> id <a href="https://github.com/doxygen/doxygen/issues/2887">2887</a>: Fortran: @param checking was not case insensitive.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3168">3168</a>: Fixed problem combining @cond with preprocessor directives.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3343">3343</a>: Using "struct A : C, D {};" showed a private inheritance relation for D.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584194">584194</a>: Some links to typedef where pointing to the typedef'ed +<li> id <a href="https://github.com/doxygen/doxygen/issues/3410">3410</a>: Some links to typedef where pointing to the typedef'ed class instead. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619560">619560</a>: Anonymous enums caused an invalid entry in the LaTeX TOC.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622935">622935</a>: Deriving from an unknown template class could cause the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3781">3781</a>: Anonymous enums caused an invalid entry in the LaTeX TOC.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3827">3827</a>: Deriving from an unknown template class could cause the class to appear with a -g postfix in C# </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625731">625731</a>: Fortran: Fixed issue handling private subroutines.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632946">632946</a>: LaTeX now starts a new page when starting a new module.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634837">634837</a>: Fortran: Prefix of function was overwritten and the word +<li> id <a href="https://github.com/doxygen/doxygen/issues/3883">3883</a>: Fortran: Fixed issue handling private subroutines.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3990">3990</a>: LaTeX now starts a new page when starting a new module.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4014">4014</a>: Fortran: Prefix of function was overwritten and the word 'function' not specified.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637099">637099</a>: Fortran: Included fix for using collaboration diagrams.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642468">642468</a>: Added PHP support for namespace with curly braces.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643219">643219</a>: Fortran: Improved handling of semicolons.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643617">643617</a>: Fortran: Added support for "type is".</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643944">643944</a>: A macro added to a group appeared twice in the group +<li> id <a href="https://github.com/doxygen/doxygen/issues/4050">4050</a>: Fortran: Included fix for using collaboration diagrams.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4158">4158</a>: Added PHP support for namespace with curly braces.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4174">4174</a>: Fortran: Improved handling of semicolons.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4178">4178</a>: Fortran: Added support for "type is".</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4188">4188</a>: A macro added to a group appeared twice in the group documentation if was also made related to a class using \relates.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646321">646321</a>: Fixed problem were the search box was missing when using +<li> id <a href="https://github.com/doxygen/doxygen/issues/4221">4221</a>: Fixed problem were the search box was missing when using a custom HTML header.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646447">646447</a>: Fixed unterminated img tab in the XHTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646463">646463</a>: Fixed problem handling MSCFILE_DIRS option with multiple +<li> id <a href="https://github.com/doxygen/doxygen/issues/4227">4227</a>: Fixed unterminated img tab in the XHTML output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4228">4228</a>: Fixed problem handling MSCFILE_DIRS option with multiple paths.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646533">646533</a>: Included patch to sort overloaded members by appearance in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4229">4229</a>: Included patch to sort overloaded members by appearance in the code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646747">646747</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646879">646879</a>: Putting an autolist inside a @todo, @bug or similar +<li> id <a href="https://github.com/doxygen/doxygen/issues/4230">4230</a>, <a href="https://github.com/doxygen/doxygen/issues/4231">4231</a>: Putting an autolist inside a @todo, @bug or similar section did not work anymore.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646922">646922</a>: Referring to a logo with a relative path, caused +<li> id <a href="https://github.com/doxygen/doxygen/issues/4232">4232</a>: Referring to a logo with a relative path, caused a broken image target when using a custom HTML header.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647499">647499</a>: Fixed HTML rendering problem on older browsers when +<li> id <a href="https://github.com/doxygen/doxygen/issues/4235">4235</a>: Fixed HTML rendering problem on older browsers when GENERATE_TREEVIEW was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647768">647768</a>: Linking to a section on the main page could result in a +<li> id <a href="https://github.com/doxygen/doxygen/issues/4242">4242</a>: Linking to a section on the main page could result in a broken link when GENERATE_TREEVIEW was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647889">647889</a>: Fixed invalid warning when using @deparated method with +<li> id <a href="https://github.com/doxygen/doxygen/issues/4243">4243</a>: Fixed invalid warning when using @deparated method with default values for parameters.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=648302">648302</a>: A function made related using @relates could end up in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4245">4245</a>: A function made related using @relates could end up in the wrong class if there was already a method with a matching argument list in that other class.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=649103">649103</a>: Return types containing multiple *'s ended up in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4254">4254</a>: Return types containing multiple *'s ended up in the output with only one * in some cases.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650397">650397</a>: Fixed problem with alias substitution if the alias had +<li> id <a href="https://github.com/doxygen/doxygen/issues/4267">4267</a>: Fixed problem with alias substitution if the alias had more then 9 parameters.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650430">650430</a>: For nested anonymous structs @xx markers could appear in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4268">4268</a>: For nested anonymous structs @xx markers could appear in the output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650463">650463</a>: Added compilation support for MacOSX 10.7 (aka Lion).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650958">650958</a>: Fixed issue printing HTML pages when the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4270">4270</a>: Added compilation support for MacOSX 10.7 (aka Lion).</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4278">4278</a>: Fixed issue printing HTML pages when the GENERATE_TREEVIEW option is set to YES.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=651611">651611</a>: Fixed broken link to an undocumented namespace.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652138">652138</a>: Fixed potential crash while parsing Fortran code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652188">652188</a>: Fixed problem parsing comment which included +<li> id <a href="https://github.com/doxygen/doxygen/issues/4281">4281</a>: Fixed broken link to an undocumented namespace.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4291">4291</a>: Fixed potential crash while parsing Fortran code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4292">4292</a>: Fixed problem parsing comment which included an unterminated alias within quotes (i.e. "\word{")</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Lines starting with . did not appear in the man page output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652389">652389</a>: Fortran: Fixed text is detailed function section.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652396">652396</a>: When enabling INTERACTIVE_SVG wide graphs are now also +<li> id <a href="https://github.com/doxygen/doxygen/issues/4294">4294</a>: Lines starting with . did not appear in the man page output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4296">4296</a>: Fortran: Fixed text is detailed function section.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4297">4297</a>: When enabling INTERACTIVE_SVG wide graphs are now also fit to the screen width.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652695">652695</a>: Added missing space between parameter type and name in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4304">4304</a>: Added missing space between parameter type and name in the RTF output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652741">652741</a>: Use background-color instead of background in doxygen.css.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653344">653344</a>: Fixed potential segfault while creating man pages.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653666">653666</a>: Fortran: add a space to "type" in argument list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653801">653801</a>: Fixed problem handling include guard when multiple +<li> id <a href="https://github.com/doxygen/doxygen/issues/4305">4305</a>: Use background-color instead of background in doxygen.css.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4313">4313</a>: Fixed potential segfault while creating man pages.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4321">4321</a>: Fortran: add a space to "type" in argument list.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4324">4324</a>: Fixed problem handling include guard when multiple blocks guarded by the same guard were used in a header file. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653963">653963</a>: Fortran: Unified handling of @params at various places.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654108">654108</a>: make clean failed on a system without qmake.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654244">654244</a>: Fixed compile issue for HP Itanium.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654779">654779</a>: Fortran: Interface was seen as a class with constructor / +<li> id <a href="https://github.com/doxygen/doxygen/issues/4327">4327</a>: Fortran: Unified handling of @params at various places.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: make clean failed on a system without qmake.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4332">4332</a>: Fixed compile issue for HP Itanium.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4339">4339</a>: Fortran: Interface was seen as a class with constructor / destructor.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654869">654869</a>: Using the word "property" as a type in C caused wrong +<li> id <a href="https://github.com/doxygen/doxygen/issues/4341">4341</a>: Using the word "property" as a type in C caused wrong results.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654866">654866</a>: Fortran: fixed issue parsing function type that looked like +<li> id <a href="https://github.com/doxygen/doxygen/issues/4340">4340</a>: Fortran: fixed issue parsing function type that looked like C function pointers.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655178">655178</a>: Fortran: Fixed parse issue when using variable name +<li> id <a href="https://github.com/doxygen/doxygen/issues/4345">4345</a>: Fortran: Fixed parse issue when using variable name starting with the word interface.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655591">655591</a>: Improved error handling for empty html style list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655935">655935</a>: Fixed case where %s could end up in a warning messge.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656005">656005</a>: Methods of Objective-C categories defined in an .m file are +<li> id <a href="https://github.com/doxygen/doxygen/issues/4348">4348</a>: Improved error handling for empty html style list.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4352">4352</a>: Fixed case where %s could end up in a warning message.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4355">4355</a>: Methods of Objective-C categories defined in an .m file are now marked as private.</li> </ul> <a name="1.7.4"></a> <h1>Doxygen Release 1.7.4</h1> -<h2>(release date 28-03-2011)</h2> +<b>(release date 28-03-2011)</b> <h3>Changes</h3> <ul> <li> doxygen -w html now reads the default Doxyfile even if not specified @@ -2609,73 +3009,73 @@ make sure you add the following: <li> New option INLINE_GROUPED_CLASSES that when enabled shows grouped classes inside the group documentation, instead of on a separate page.</li> <li> Included updates for the Italian and Russian translation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640875">640875</a>: Added option HTML_EXTRA_FILES which makes it easier to copy +<li> id <a href="https://github.com/doxygen/doxygen/issues/4121">4121</a>: Added option HTML_EXTRA_FILES which makes it easier to copy additional files to the HTML output and also add them to the index files.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642579">642579</a>: Included patch that adds new LATEX_FOOTER option to +<li> id <a href="https://github.com/doxygen/doxygen/issues/4162">4162</a>: Included patch that adds new LATEX_FOOTER option to customize the end of refman.tex in the LaTeX output.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=140259">140259</a>: Jumping to a @section did not work in the RTF output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521854">521854</a>: Fortran: included patch for supporting multiple argument +<li> id <a href="https://github.com/doxygen/doxygen/issues/1067">1067</a>: Jumping to a @section did not work in the RTF output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/2868">2868</a>: Fortran: included patch for supporting multiple argument declarations on one line.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521861">521861</a>: Fixed problem with line continuation in Fortran.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=566921">566921</a>: %A::B now prevents a link for A::B, instead of only for A +<li> id <a href="https://github.com/doxygen/doxygen/issues/2872">2872</a>: Fixed problem with line continuation in Fortran.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3217">3217</a>: %A::B now prevents a link for A::B, instead of only for A and generating a warning that ::B cannot be linked.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598481">598481</a>: Fortran: Added support for extends keyword.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618374">618374</a>: Added support for inlining code in the VHDL output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625519">625519</a>: Fortran: argument name starting with a reserved word was +<li> id <a href="https://github.com/doxygen/doxygen/issues/3561">3561</a>: Fortran: Added support for extends keyword.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3771">3771</a>: Added support for inlining code in the VHDL output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3872">3872</a>: Fortran: argument name starting with a reserved word was not handled properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634415">634415</a>: Fixed problem parsing an array of character literals.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635537">635537</a>: Links to file members were not made when found in tag files.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638637">638637</a>: The Doxyfile documentation contained some very long lines.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638655">638655</a>: Double quote in page or group title broke treeview.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638733">638733</a>: Improved documentation for DOT_IMAGE_FORMAT option.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638829">638829</a>: Added documentation to warn for consequences of using +<li> id <a href="https://github.com/doxygen/doxygen/issues/4009">4009</a>: Fixed problem parsing an array of character literals.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4028">4028</a>: Links to file members were not made when found in tag files.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4066">4066</a>: The Doxyfile documentation contained some very long lines.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4067">4067</a>: Double quote in page or group title broke treeview.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4077">4077</a>: Improved documentation for DOT_IMAGE_FORMAT option.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4079">4079</a>: Added documentation to warn for consequences of using HTML_HEADER.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638856">638856</a>: Fixed problem autolinking to struct field using #S::a</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639272">639272</a>: using @dot...@endot produced an image referenced with +<li> id <a href="https://github.com/doxygen/doxygen/issues/4080">4080</a>: Fixed problem autolinking to struct field using #S::a</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4085">4085</a>: using @dot...@endot produced an image referenced with absolute path.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639521">639521</a>: \mscfile did not work properly for LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639716">639716</a>: Fixed problem where #include's could cause phantom __pad__ +<li> id <a href="https://github.com/doxygen/doxygen/issues/4091">4091</a>: \mscfile did not work properly for LaTeX output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4095">4095</a>: Fixed problem where #include's could cause phantom __pad__ members to appear in the output (appeared on Windows only).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640259">640259</a>: Options PROJECT_LOGO and PROJECT_BRIEF were missing +<li> id <a href="https://github.com/doxygen/doxygen/issues/4103">4103</a>: Options PROJECT_LOGO and PROJECT_BRIEF were missing from the manual.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640463">640463</a>: Fixed problem parsing PHP "use" statement when the argument +<li> id <a href="https://github.com/doxygen/doxygen/issues/4105">4105</a>: Fixed problem parsing PHP "use" statement when the argument did not have a namespace scope.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640588">640588</a>: Included fix for proper splitting of multiple arguments +<li> id <a href="https://github.com/doxygen/doxygen/issues/4110">4110</a>: Included fix for proper splitting of multiple arguments given to the QHP_CUST_FILTER_ATTRS option.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640646">640646</a>: Long error messages could cause memory corruption.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640742">640742</a>: XML: switched indent option to no in the combine.xslt script.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640754">640754</a>: Comment with XML style list of type table was not rendered +<li> id <a href="https://github.com/doxygen/doxygen/issues/4112">4112</a>: Long error messages could cause memory corruption.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4116">4116</a>: XML: switched indent option to no in the combine.xslt script.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4117">4117</a>: Comment with XML style list of type table was not rendered properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640822">640822</a>: Added support for overloading of C# indexer operators.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640828">640828</a>: Internal section marked with @internal was not shown as +<li> id <a href="https://github.com/doxygen/doxygen/issues/4118">4118</a>: Added support for overloading of C# indexer operators.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4119">4119</a>: Internal section marked with @internal was not shown as such anymore in the XML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640847">640847</a>: PHP: Fixed parse problem referring to class in global +<li> id <a href="https://github.com/doxygen/doxygen/issues/4120">4120</a>: PHP: Fixed parse problem referring to class in global namespace.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640924">640924</a>: Included patch by Haffmans to make the custom header and +<li> id <a href="https://github.com/doxygen/doxygen/issues/4124">4124</a>: Included patch by Haffmans to make the custom header and footer independent of the chosen config options.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640927">640927</a>: Included fix to prevent a warning in the server side PHP +<li> id <a href="https://github.com/doxygen/doxygen/issues/4127">4127</a>: Included fix to prevent a warning in the server side PHP search script.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641026">641026</a>: Included patch to fix broken hyperlink to page entry +<li> id <a href="https://github.com/doxygen/doxygen/issues/4128">4128</a>: Included patch to fix broken hyperlink to page entry in xreflists.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641188">641188</a>: Header of \page was wrong in Man page output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #include's to other directories were not always linked.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641673">641673</a>: Using "use Foo\Foo;" in PHP could cause doxygen to hang.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641814">641814</a>: In some cases the HTML output could contain an extra </p>.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642030">642030</a>: Tooltips with HTML entities could be wrongly truncated.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642475">642475</a>: Include graphs could be incomplete.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643056">643056</a>: Fixed problem with macro expansion.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643279">643279</a>: Fixed potential crash when generating a warning for +<li> id <a href="https://github.com/doxygen/doxygen/issues/4136">4136</a>: Header of \page was wrong in Man page output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4137">4137</a>: #include's to other directories were not always linked.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4140">4140</a>: Using "use Foo\Foo;" in PHP could cause doxygen to hang.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4142">4142</a>: In some cases the HTML output could contain an extra </p>.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4147">4147</a>: Tooltips with HTML entities could be wrongly truncated.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4159">4159</a>: Include graphs could be incomplete.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4169">4169</a>: Fixed problem with macro expansion.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4176">4176</a>: Fixed potential crash when generating a warning for void f(int %x) style parameter, which is valid in C++/CLI.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643280">643280</a>: Included patch to enabled LargeAddressAware for Windows +<li> id <a href="https://github.com/doxygen/doxygen/issues/4177">4177</a>: Included patch to enabled LargeAddressAware for Windows builds.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643276">643276</a>: Fixed cases where FILE_VERSION_FILTER was called for +<li> id <a href="https://github.com/doxygen/doxygen/issues/4175">4175</a>: Fixed cases where FILE_VERSION_FILTER was called for dummy files with name "generated".</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643655">643655</a>: Fixed argument matching issue when one of match candidates +<li> id <a href="https://github.com/doxygen/doxygen/issues/4180">4180</a>: Fixed argument matching issue when one of match candidates was a typedef of a method pointer.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645754">645754</a>: mscfile tag was closed with dotfile in the XML output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4210">4210</a>: mscfile tag was closed with dotfile in the XML output.</li> <li> doxygen -w html now ignores the values for HTML_HEADER and HTML_FOOTER found in the config file.</li> <li> Importing a group via a tag file could overrule a local group with @@ -2683,7 +3083,7 @@ make sure you add the following: </ul> <a name="1.7.3"></a> <h1>Doxygen Release 1.7.3</h1> -<h2>(release date 03-01-2011)</h2> +<b>(release date 03-01-2011)</b> <h3>Changes</h3> <ul> <li> Added a header for each HTML page above the navigation menu, @@ -2702,7 +3102,7 @@ make sure you add the following: </ul> <h3>New features</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=499544">499544</a>: Added SVG support to doxygen's dot output +<li> id <a href="https://github.com/doxygen/doxygen/issues/2734">2734</a>: Added SVG support to doxygen's dot output (setting DOT_IMAGE_FORMAT to svg now works as expected)</li> <li> Added control to the wizard to configure the color of the output visually.</li> @@ -2724,44 +3124,44 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: code blocks with using directives did not get hyperlinked.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=313527">313527</a>: enum values with bitfields did not get parsed correctly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=565715">565715</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630582">630582</a>: Included a patch that fixes a couple of Fortran issues +<li> id <a href="https://github.com/doxygen/doxygen/issues/1666">1666</a>: code blocks with using directives did not get hyperlinked.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/1770">1770</a>: enum values with bitfields did not get parsed correctly.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3207">3207</a>, <a href="https://github.com/doxygen/doxygen/issues/3944">3944</a>: Included a patch that fixes a couple of Fortran issues (thanks to Albert).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615507">615507</a>: Fixed problem handling @cond..@endcond in Fortran code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619040">619040</a>: Scope was missing in Tokens.xml when using docsets.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625517">625517</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523156">523156</a>: Applied patch tp avoid stripping prefixes for Fortran +<li> id <a href="https://github.com/doxygen/doxygen/issues/3731">3731</a>: Fixed problem handling @cond..@endcond in Fortran code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3779">3779</a>: Scope was missing in Tokens.xml when using docsets.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3870">3870</a>, <a href="https://github.com/doxygen/doxygen/issues/2891">2891</a>: Applied patch tp avoid stripping prefixes for Fortran subroutines.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626476">626476</a>: allow label before end statement in Fortran</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630901">630901</a>: </see> was not handled properly in comment block.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632311">632311</a>: Fixed potential crash for empty verbatim section.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632426">632426</a>: closing brace of a function with one parameter has wrong +<li> id <a href="https://github.com/doxygen/doxygen/issues/3895">3895</a>: allow label before end statement in Fortran</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3956">3956</a>: </see> was not handled properly in comment block.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3980">3980</a>: Fixed potential crash for empty verbatim section.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3983">3983</a>: closing brace of a function with one parameter has wrong color in HTML.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632543">632543</a>: Added support for Fortran TYPEs with language bindings. +<li> id <a href="https://github.com/doxygen/doxygen/issues/3985">3985</a>: Added support for Fortran TYPEs with language bindings. (thanks to a patch by Daniel Franke)</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632879">632879</a>: An explicit link request such as #blah did not longer produce +<li> id <a href="https://github.com/doxygen/doxygen/issues/3989">3989</a>: An explicit link request such as #blah did not longer produce a warning if no symbol named blah was found.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=633891">633891</a>: warnings in "inbody" documentation were shown with "unknown" +<li> id <a href="https://github.com/doxygen/doxygen/issues/4002">4002</a>: warnings in "inbody" documentation were shown with "unknown" file name.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634116">634116</a>: Titles customized via the layout file did not appear in +<li> id <a href="https://github.com/doxygen/doxygen/issues/4006">4006</a>: Titles customized via the layout file did not appear in the title page and navigation tree, only in the top menu.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634600">634600</a>: Fixed problem resolving typedef.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634775">634775</a>: Fixed a problem were // inside a code block got removed.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634857">634857</a>: Added support for escaping :: by using \:: (or @::)</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634962">634962</a>: #include with relative path to parent dir did not get +<li> id <a href="https://github.com/doxygen/doxygen/issues/4010">4010</a>: Fixed problem resolving typedef.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4012">4012</a>: Fixed a problem were // inside a code block got removed.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4015">4015</a>: Added support for escaping :: by using \:: (or @::)</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4018">4018</a>: #include with relative path to parent dir did not get hyperlinked.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634986">634986</a>: Removed double definition of docParamName in compound.xsd.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635198">635198</a>: C++/CLI Finalizer methods were not parsed properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636475">636475</a>: Objective-C method names can now be used as the +<li> id <a href="https://github.com/doxygen/doxygen/issues/4019">4019</a>: Removed double definition of docParamName in compound.xsd.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4023">4023</a>: C++/CLI Finalizer methods were not parsed properly.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4036">4036</a>: Objective-C method names can now be used as the the first argument of \ref.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636588">636588</a>: Fixed a couple of problems in the compound.xsd schema used +<li> id <a href="https://github.com/doxygen/doxygen/issues/4037">4037</a>: Fixed a couple of problems in the compound.xsd schema used for XML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636598">636598</a>: DISTRIBUTE_GROUP_DOC now works again for enum values.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636947">636947</a>: Improved matching of typedef'ed array parameter and non +<li> id <a href="https://github.com/doxygen/doxygen/issues/4038">4038</a>: DISTRIBUTE_GROUP_DOC now works again for enum values.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4047">4047</a>: Improved matching of typedef'ed array parameter and non typedef'ed array parameter.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637610">637610</a>: Added a number of fixed for Fortran interfaces.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637712">637712</a>: Handle files with the .for extension as Fortran.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637987">637987</a>: Fixed error in the grouping documentation.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4056">4056</a>: Added a number of fixed for Fortran interfaces.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4057">4057</a>: Handle files with the .for extension as Fortran.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/4060">4060</a>: Fixed error in the grouping documentation.</li> <li> Fixed line number sync problem when using Objective-C #import statements.</li> <li> Fixed problem handling /** @cond */ in the preprocessor.</li> @@ -2769,7 +3169,7 @@ make sure you add the following: </ul> <a name="1.7.2"></a> <h1>Doxygen Release 1.7.2</h1> -<h2>(release date 09-10-2010)</h2> +<b>(release date 09-10-2010)</b> <h3>Changes</h3> <ul> @@ -2781,10 +3181,10 @@ make sure you add the following: <ul> <li> added support for Apple's block object extension for C/Obj-C/C++.</li> <li> added support for detecting Python constructors and destructors.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624575">624575</a>: Added \endinternal command that can be used to force +<li> id <a href="https://github.com/doxygen/doxygen/issues/3855">3855</a>: Added \endinternal command that can be used to force the end of a section started with \internal.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=552605">552605</a>: Added parsing support for PHP 5.3+ style namespaces.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582532">582532</a>: added \mscfile command which can be used to insert a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3084">3084</a>: Added parsing support for PHP 5.3+ style namespaces.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3389">3389</a>: added \mscfile command which can be used to insert a message sequence chart given a .msc file. Also added a new config option MSCFILE_DIRS to provide directories were msc files are searched (Thanks to Adrien for the patch).</li> @@ -2797,130 +3197,130 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: Fixed case where using of a namespace did not work inside +<li> id <a href="https://github.com/doxygen/doxygen/issues/1666">1666</a>: Fixed case where using of a namespace did not work inside an example.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=336053">336053</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=487871">487871</a>: /// were not stripped from formulas and \dot..\enddot</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=563698">563698</a>: dropped support for a4wide paper format for LaTeX, since +<li> id <a href="https://github.com/doxygen/doxygen/issues/2097">2097</a>, <a href="https://github.com/doxygen/doxygen/issues/2669">2669</a>: /// were not stripped from formulas and \dot..\enddot</li> +<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://bugzilla.gnome.org/show_bug.cgi?id=571014">571014</a>: Behaviour of CLASS_DIAGRAM=NO in combination with - HAVE_DOT=YES, was not propely documented.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=576291">576291</a>: Python comments for next class or method could end up in +<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 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://bugzilla.gnome.org/show_bug.cgi?id=611174">611174</a>: Fixed problem handling nested classes in Python.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621733">621733</a>: removed unexpected warnings about undocumented return types</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622737">622737</a>: Undefined function macros could cause constant expression +<li> id <a href="https://github.com/doxygen/doxygen/issues/3688">3688</a>: Fixed problem handling nested classes in Python.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3804">3804</a>: removed unexpected warnings about undocumented return types</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3824">3824</a>: Undefined function macros could cause constant expression errors.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622780">622780</a>: updated copyright statement in PDF docs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622935">622935</a>: C# generics appeared with -g extension in the output in +<li> id <a href="https://github.com/doxygen/doxygen/issues/3826">3826</a>: updated copyright statement in PDF docs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3827">3827</a>: C# generics appeared with -g extension in the output in some situations.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623023">623023</a>: Fixed parsing problem for "int &foo1(),&foo2();"</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623052">623052</a>: Link to destructor was wrong in the member index.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623424">623424</a>: Fixed problem where struct description gets added to variable +<li> id <a href="https://github.com/doxygen/doxygen/issues/3829">3829</a>: Fixed parsing problem for "int &foo1(),&foo2();"</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3830">3830</a>: Link to destructor was wrong in the member index.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3836">3836</a>: Fixed problem where struct description gets added to variable of struct type.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623673">623673</a>: Anchors were missing in the Qhp index for members.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623733">623733</a>: Fixed potential crash due to uninitialized line number.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623765">623765</a>: closed.png was wrongly linked when GENERATE_SUBDIRS and +<li> id <a href="https://github.com/doxygen/doxygen/issues/3837">3837</a>: Anchors were missing in the Qhp index for members.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3838">3838</a>: Fixed potential crash due to uninitialized line number.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3839">3839</a>: closed.png was wrongly linked when GENERATE_SUBDIRS and HTML_DYNAMIC_SECTIONS were enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624014">624014</a>: Function macro was not handled properly when there was +<li> id <a href="https://github.com/doxygen/doxygen/issues/3840">3840</a>: Function macro was not handled properly when there was a line continuation directly after the name.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624095">624095</a>: Linking to a class via a tag file did not work if the class +<li> id <a href="https://github.com/doxygen/doxygen/issues/3841">3841</a>: Linking to a class via a tag file did not work if the class was in an undocumented namespace.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624104">624104</a>: Fixed a couple of typos in lodepng.h</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624323">624323</a>: Graph legend image was missing form the index files.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3843">3843</a>: Fixed a couple of typos in lodepng.h</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3848">3848</a>: Graph legend image was missing form the index files.</li> <li> Fixed a number of typos in the config file documentation (thanks to Jens Schweikhardt)</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624514">624514</a>: Some enums were not cross-referenced.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624829">624829</a>: Missing \endcond could cause preprocessor issues in +<li> id <a href="https://github.com/doxygen/doxygen/issues/3854">3854</a>: Some enums were not cross-referenced.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3857">3857</a>: Missing \endcond could cause preprocessor issues in next file(s) to be parsed.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625070">625070</a>: a function definition in a namespace, documented in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3862">3862</a>: a function definition in a namespace, documented in the header did not always get cross-referenced.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625296">625296</a>: Removed superfluous <td></td> from parameter list in +<li> id <a href="https://github.com/doxygen/doxygen/issues/3865">3865</a>: Removed superfluous <td></td> from parameter list in HTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625317">625317</a>: Unterminated comment could crash doxygen.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625531">625531</a>: Inherited documentation was only included for the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3866">3866</a>: Unterminated comment could crash doxygen.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3873">3873</a>: Inherited documentation was only included for the last derived class in case of multiple inheritance.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625578">625578</a>: In the HTML output </div> was missing for built-in +<li> id <a href="https://github.com/doxygen/doxygen/issues/3877">3877</a>: In the HTML output </div> was missing for built-in class diagrams.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625555">625555</a>: References in example files with underscores were wrong.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625982">625982</a>: When using Japanese characters mixed with ascii characters +<li> id <a href="https://github.com/doxygen/doxygen/issues/3876">3876</a>: References in example files with underscores were wrong.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: When using Japanese characters mixed with ascii characters doxygen incorrectly ended the brief description with a dot.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625952">625952</a>: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear +<li> id <a href="https://github.com/doxygen/doxygen/issues/3886">3886</a>: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear in the output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626033">626033</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567774">567774</a>: EXTENSION_MAPPING did not work if a mapped +<li> id <a href="https://github.com/doxygen/doxygen/issues/3890">3890</a>, <a href="https://github.com/doxygen/doxygen/issues/3235">3235</a>: EXTENSION_MAPPING did not work if a mapped language was handled by the same parser as used for the original extension.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626175">626175</a>: Fixed bracket bug in LaTeX fancy headers.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626508">626508</a>: Allow hyphen in key argument of \xrefitem.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626647">626647</a>: \copydoc did not work for array type arguments (e.g. int[]).</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3894">3894</a>: Fixed bracket bug in LaTeX fancy headers.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3896">3896</a>: Allow hyphen in key argument of \xrefitem.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3898">3898</a>: \copydoc did not work for array type arguments (e.g. int[]).</li> <li> Use \dotfile did not produce the correct map file, so URLs in dot files did not work.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=627371">627371</a>: #define's in files only found via INCLUDE_PATH were not +<li> id <a href="https://github.com/doxygen/doxygen/issues/3907">3907</a>: #define's in files only found via INCLUDE_PATH were not correctly handled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628065">628065</a>: auto brief description ending with .) cause the ) to +<li> id <a href="https://github.com/doxygen/doxygen/issues/3918">3918</a>: auto brief description ending with .) cause the ) to end up in the detailed part.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628242">628242</a>: Fixed encoding issue for the Spanish translation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628678">628678</a>: Fixed segmentation fault in case of very long errors.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629040">629040</a>: Fixed type in search page of the documentation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629182">629182</a>: Fixed problem detecting include guard.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629270">629270</a>: Made file extension to parser mapping case insensitive.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629485">629485</a>: Latex makefile clean target used rm command also for Windows.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629942">629942</a>: the EXCLUDE_SYMBOLS option was missing form the online docs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=631094">631094</a>: \htmlinclude and \verbinclude ended the brief description.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=631380">631380</a>: Inconsistent behaviour when a brief description was given +<li> id <a href="https://github.com/doxygen/doxygen/issues/3919">3919</a>: Fixed encoding issue for the Spanish translation.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3927">3927</a>: Fixed segmentation fault in case of very long errors.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3930">3930</a>: Fixed type in search page of the documentation.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3931">3931</a>: Fixed problem detecting include guard.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3936">3936</a>: Made file extension to parser mapping case insensitive.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3937">3937</a>: Latex makefile clean target used rm command also for Windows.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3939">3939</a>: the EXCLUDE_SYMBOLS option was missing form the online docs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3962">3962</a>: \htmlinclude and \verbinclude ended the brief description.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3963">3963</a>: Inconsistent behaviour when a brief description was given following by a detailed comment block with JAVADOC_AUTOBRIEF enabled.</li> <li> Fixed a number of typos in the documentation - (thanks to Albert van der Meer)</li> + (thanks to Albert)</li> <li> Fixed potential hangup when scanning directories defined as symlinks to absolute paths.</li> <li> HTML attributes other than src were not copied for the <img> tag.</li> </ul> <a name="1.7.1"></a> <h1>Doxygen Release 1.7.1</h1> -<h2>(release date 25-06-2010)</h2> +<b>(release date 25-06-2010)</b> <h3>Changes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621695">621695</a>: Made warning and error messages appear with lower case +<li> id <a href="https://github.com/doxygen/doxygen/issues/3803">3803</a>: Made warning and error messages appear with lower case "warning:" and "error:" prefix to make it easier to use the messages from Visual Studio.</li> </ul> <h3>New features</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621908">621908</a>: Added new config option FORMULA_TRANSPARENT which allows +<li> id <a href="https://github.com/doxygen/doxygen/issues/3809">3809</a>: Added new config option FORMULA_TRANSPARENT which allows selecting between transparent (YES) or non-transparent (NO) PNGs for formulas in the HTML output.</li> <li> Update for Turkish translation.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=533821">533821</a>: Inheritance relation for a C# class deriving from +<li> id <a href="https://github.com/doxygen/doxygen/issues/2959">2959</a>: Inheritance relation for a C# class deriving from a generic class was not handled correctly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=554638">554638</a>: Changing DOT_IMAGE_FORMAT did not cause the graphs to be +<li> id <a href="https://github.com/doxygen/doxygen/issues/3105">3105</a>: Changing DOT_IMAGE_FORMAT did not cause the graphs to be regenerated.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=576533">576533</a>: A field of the form "enum E *p" was ignore.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597016">597016</a>: Hide scope name was not working properly for todo items +<li> id <a href="https://github.com/doxygen/doxygen/issues/3334">3334</a>: A field of the form "enum E *p" was ignore.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3549">3549</a>: Hide scope name was not working properly for todo items inside class members, where the class was inside a namespace.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617761">617761</a>: In dot graphs now also @ref worked (previously only \ref was +<li> id <a href="https://github.com/doxygen/doxygen/issues/3764">3764</a>: In dot graphs now also @ref worked (previously only \ref was supported).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621653">621653</a>: Fixed error when compiling doxygen for Solaris 8.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621733">621733</a>: Removed bogus warning about undocumented return type for +<li> id <a href="https://github.com/doxygen/doxygen/issues/3802">3802</a>: Fixed error when compiling doxygen for Solaris 8.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3804">3804</a>: Removed bogus warning about undocumented return type for define when WARN_NO_PARAMDOC was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621780">621780</a>: Fixed parsing support for a function that returns a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3805">3805</a>: Fixed parsing support for a function that returns a struct definition.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621785">621785</a>: Doxygen could hang when using \copydoc in a function with +<li> id <a href="https://github.com/doxygen/doxygen/issues/3806">3806</a>: Doxygen could hang when using \copydoc in a function with \param.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621805">621805</a>: Using //!< after a #define no longer worked.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621854">621854</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622219">622219</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622593">622593</a>: html help compiler (and also the Qt +<li> id <a href="https://github.com/doxygen/doxygen/issues/3807">3807</a>: Using //!< after a #define no longer worked.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3808">3808</a>, <a href="https://github.com/doxygen/doxygen/issues/3816">3816</a>, <a href="https://github.com/doxygen/doxygen/issues/3820">3820</a>: html help compiler (and also the Qt help compiler) was called before all dot images were generated.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621984">621984</a>: Using a auto-list in combination with \subpage cause the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3810">3810</a>: Using a auto-list in combination with \subpage cause the items to be inlined.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622018">622018</a>: Fixed problem parsing a @param command where the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3812">3812</a>: Fixed problem parsing a @param command where the text part started with a formula.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622019">622019</a>: Added some instructions how to document Fortran code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622041">622041</a>: Using \var multiple times in a comment block did not +<li> id <a href="https://github.com/doxygen/doxygen/issues/3813">3813</a>: Added some instructions how to document Fortran code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3814">3814</a>: Using \var multiple times in a comment block did not work properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622413">622413</a>: Tooltips could get wrongly truncated when multi-byte +<li> id <a href="https://github.com/doxygen/doxygen/issues/3818">3818</a>: Tooltips could get wrongly truncated when multi-byte UTF-8 characters were used.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622471">622471</a>: Argument matching failed for typedef in another namespace.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3819">3819</a>: Argument matching failed for typedef in another namespace.</li> <li> Fixed crash situation while handling commands inside a @ref section.</li> <li> Treeview icons were missing in the HTML output when setting GENERATE_TREEVIEW to NO and USE_INLINE_TREES to YES.</li> @@ -2928,7 +3328,7 @@ make sure you add the following: <a name="1.7.0"></a> <h1>Doxygen Release 1.7.0</h1> -<h2>(release date 15-06-2010)</h2> +<b>(release date 15-06-2010)</b> <h3>Changes</h3> <ul> <li> Changed the look of the HTML output.</li> @@ -2953,99 +3353,99 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: source browser could miss links for used namespaces.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=361476">361476</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620924">620924</a>: \if and \endif did not work properly inside auto lists.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557164">557164</a>: No warning for missing return type documentation even though +<li> id <a href="https://github.com/doxygen/doxygen/issues/1666">1666</a>: source browser could miss links for used namespaces.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/2255">2255</a>, <a href="https://github.com/doxygen/doxygen/issues/3796">3796</a>: \if and \endif did not work properly inside auto lists.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3139">3139</a>: No warning for missing return type documentation even though WARN_NO_PARAMDOC was set to YES.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=577005">577005</a>: Handling of nesting \defgroup's was not always working +<li> id <a href="https://github.com/doxygen/doxygen/issues/3341">3341</a>: Handling of nesting \defgroup's was not always working properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=578739">578739</a>: ø was not translated correctly in the LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583526">583526</a>: Use relative paths for mscgen diagrams to avoid errors in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3355">3355</a>: ø was not translated correctly in the LaTeX output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3401">3401</a>: Use relative paths for mscgen diagrams to avoid errors in the LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592991">592991</a>: The "Use current settings at startup" feature of Doxywizard +<li> id <a href="https://github.com/doxygen/doxygen/issues/3491">3491</a>: The "Use current settings at startup" feature of Doxywizard was broken.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593679">593679</a>: Links in the search results were broken if they pointed to +<li> id <a href="https://github.com/doxygen/doxygen/issues/3500">3500</a>: Links in the search results were broken if they pointed to symbols imported via tag files using an absolute path or URL.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593760">593760</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615682">615682</a>: Fixed man page output problem when using @par.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594021">594021</a>: A C comment before a #endif caused the preprocessor +<li> id <a href="https://github.com/doxygen/doxygen/issues/3504">3504</a>, <a href="https://github.com/doxygen/doxygen/issues/3735">3735</a>: Fixed man page output problem when using @par.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3506">3506</a>: A C comment before a #endif caused the preprocessor statement to be ignored.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597013">597013</a>: When HIDE_SCOPE_NAMES was enabled also the scope for +<li> id <a href="https://github.com/doxygen/doxygen/issues/3547">3547</a>: When HIDE_SCOPE_NAMES was enabled also the scope for nested classes was stripped. Now only the namespace scope will be stripped as before.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600829">600829</a>: Autolinks to namespace members did not work if +<li> id <a href="https://github.com/doxygen/doxygen/issues/3575">3575</a>: Autolinks to namespace members did not work if an explicit # or :: was used.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=602732">602732</a>: Slashes inside strings in java annotations were not handled +<li> id <a href="https://github.com/doxygen/doxygen/issues/3591">3591</a>: Slashes inside strings in java annotations were not handled properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606335">606335</a>: Fixed the "show html output" button in doxywizard +<li> id <a href="https://github.com/doxygen/doxygen/issues/3628">3628</a>: Fixed the "show html output" button in doxywizard for Windows when IE was set as the default browser.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608292">608292</a>: Formatting was lost for section copied with \copydoc.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608359">608359</a>: Fixed C++ parse issue for "class : public base {} var;" +<li> id <a href="https://github.com/doxygen/doxygen/issues/3652">3652</a>: Formatting was lost for section copied with \copydoc.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3653">3653</a>: Fixed C++ parse issue for "class : public base {} var;" construct.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611056">611056</a>: Generated HTML footer file did not have UTF-8 encoding and +<li> id <a href="https://github.com/doxygen/doxygen/issues/3685">3685</a>: Generated HTML footer file did not have UTF-8 encoding and the relative path marker needed when using CREATE_SUBDIRS = YES.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611193">611193</a>: Fixed parsing problem with try-functions having multiple +<li> id <a href="https://github.com/doxygen/doxygen/issues/3689">3689</a>: Fixed parsing problem with try-functions having multiple catch handlers.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611642">611642</a>: Specialized private template member function appeared as +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Specialized private template member function appeared as public.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611888">611888</a>: Include dependency graphs were sometimes wrong.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612170">612170</a>: Some lines in the generated Doxyfile where too long.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612275">612275</a>: Fixed auto-link problem for certain URLs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612292">612292</a>: Improved handling of ellipsis inside brief description when +<li> id <a href="https://github.com/doxygen/doxygen/issues/3695">3695</a>: Include dependency graphs were sometimes wrong.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3696">3696</a>: Some lines in the generated Doxyfile where too long.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3697">3697</a>: Fixed auto-link problem for certain URLs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3698">3698</a>: Improved handling of ellipsis inside brief description when JAVADOC_AUTOBRIEF is enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612364">612364</a>: Accessibility of macros was not handled properly in all cases.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612310">612310</a>: Enabling REFERENCED_BY_RELATION without SOURCE_BROWSER could +<li> id <a href="https://github.com/doxygen/doxygen/issues/3700">3700</a>: Accessibility of macros was not handled properly in all cases.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3699">3699</a>: Enabling REFERENCED_BY_RELATION without SOURCE_BROWSER could result in broken links.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612458">612458</a>: Fixed problem handling @copydoc for function operators.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612609">612609</a>: A raw C# string constant could end up in the next string.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612969">612969</a>: subpages were not part of the XML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=613024">613024</a>: First list item in the paragraph after a @todo +<li> id <a href="https://github.com/doxygen/doxygen/issues/3701">3701</a>: Fixed problem handling @copydoc for function operators.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3703">3703</a>: A raw C# string constant could end up in the next string.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3709">3709</a>: subpages were not part of the XML output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3711">3711</a>: First list item in the paragraph after a @todo item was not parsed properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614204">614204</a>: Generated man page links were having a heading underscore.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614443">614443</a>: Made include guard detect a bit more strict to avoid false +<li> id <a href="https://github.com/doxygen/doxygen/issues/3718">3718</a>: Generated man page links were having a heading underscore.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3720">3720</a>: Made include guard detect a bit more strict to avoid false positives.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614447">614447</a>: The labels of CVS tags were missing a colon.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614438">614438</a>: Fixed problem parsing Q_PROPERTY with template type and +<li> id <a href="https://github.com/doxygen/doxygen/issues/3722">3722</a>: The labels of CVS tags were missing a colon.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3719">3719</a>: Fixed problem parsing Q_PROPERTY with template type and spaces.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615165">615165</a>: Made the date string in the HTML footer translatable, +<li> id <a href="https://github.com/doxygen/doxygen/issues/3729">3729</a>: Made the date string in the HTML footer translatable, along with some other sentences on the directory pages.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612858">612858</a>: Inline attribute was shown also for non-inline template +<li> id <a href="https://github.com/doxygen/doxygen/issues/3708">3708</a>: Inline attribute was shown also for non-inline template members.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615583">615583</a>: Fixed problem handling @copy for operators with +<li> id <a href="https://github.com/doxygen/doxygen/issues/3733">3733</a>: Fixed problem handling @copy for operators with const qualifier.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615755">615755</a>: Fixed problem handling '"' inside comments.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615957">615957</a>: Made the LaTeX output a bit less spacious using \input.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615695">615695</a>: Fixed preprocessor issue where a macro that was redefined +<li> id <a href="https://github.com/doxygen/doxygen/issues/3738">3738</a>: Fixed problem handling '"' inside comments.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3740">3740</a>: Made the LaTeX output a bit less spacious using \input.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3736">3736</a>: Fixed preprocessor issue where a macro that was redefined was not resolved.</li> <li> Fixed character encoding issue on the search results page.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615670">615670</a>: C# namespaces are now extracted also without comment block +<li> id <a href="https://github.com/doxygen/doxygen/issues/3734">3734</a>: C# namespaces are now extracted also without comment block (the language spec does not allow XML documentation).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616209">616209</a>: included patch that fixes some typos in the code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616344">616344</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610604">610604</a>: Pages with an underscore in the label generated a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3742">3742</a>: included patch that fixes some typos in the code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3744">3744</a>, <a href="https://github.com/doxygen/doxygen/issues/3679">3679</a>: Pages with an underscore in the label generated a file name containing two underscores.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616387">616387</a>: text of the form something.symbol got autolinked when +<li> id <a href="https://github.com/doxygen/doxygen/issues/3747">3747</a>: text of the form something.symbol got autolinked when symbol had a global scope.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616761">616761</a>: Call graph could be wrong when local variable has the same +<li> id <a href="https://github.com/doxygen/doxygen/issues/3748">3748</a>: Call graph could be wrong when local variable has the same name as a global function.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616947">616947</a>: Added documentation patch on how to create URL links with +<li> id <a href="https://github.com/doxygen/doxygen/issues/3750">3750</a>: Added documentation patch on how to create URL links with custom text.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616988">616988</a>: Doxywizard now removes non-existent files from the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3751">3751</a>: Doxywizard now removes non-existent files from the recent list and has an option to clear the list completely.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617051">617051</a>: A macro defined via PREDEFINED did not always overrule a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3752">3752</a>: A macro defined via PREDEFINED did not always overrule a macro definition in the code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617278">617278</a>: Enabling call graphs produced invalid XHTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617871">617871</a>: Non ascii characters in file or directory names +<li> id <a href="https://github.com/doxygen/doxygen/issues/3759">3759</a>: Enabling call graphs produced invalid XHTML output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3766">3766</a>: Non ascii characters in file or directory names caused problems on Windows.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618079">618079</a>: An ALIAS with parameters spanning multiple lines +<li> id <a href="https://github.com/doxygen/doxygen/issues/3768">3768</a>: An ALIAS with parameters spanning multiple lines caused problems with /// style comments. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618632">618632</a>: Included patch to prevent image overflowing the page in +<li> id <a href="https://github.com/doxygen/doxygen/issues/3775">3775</a>: Included patch to prevent image overflowing the page in the LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619728">619728</a>: Fixed problem using EXTENSION_MAPPING for C# (thanks to +<li> id <a href="https://github.com/doxygen/doxygen/issues/3783">3783</a>: Fixed problem using EXTENSION_MAPPING for C# (thanks to Vsevolod Kukol for the patch).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619978">619978</a>: Links to external files could be wrong when CREATE_SUBDIR +<li> id <a href="https://github.com/doxygen/doxygen/issues/3786">3786</a>: Links to external files could be wrong when CREATE_SUBDIR was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620229">620229</a>: /* characters in a print broke parsing within an conditional +<li> id <a href="https://github.com/doxygen/doxygen/issues/3787">3787</a>: /* characters in a print broke parsing within an conditional section.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620926">620926</a>: \if and \endif did not work properly inside HTML tables.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3797">3797</a>: \if and \endif did not work properly inside HTML tables.</li> <li> Using @include in combination with LATEX_SOURCE_CODE caused wrong output.</li> <li> Included a patch by Guido Tack which adds two new options @@ -3062,59 +3462,59 @@ make sure you add the following: <a name="1.6.3"></a> </p> <h1>Doxygen Release 1.6.3</h1> -<h2>(release date 21-02-2010)</h2> +<b>(release date 21-02-2010)</b> <h3>New features</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608480">608480</a>: Using \dir without argument will create directory +<li> id <a href="https://github.com/doxygen/doxygen/issues/3654">3654</a>: Using \dir without argument will create directory documentation for the directory in which the \dir command was found.</li> </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590161">590161</a>: perlmod output was wrong when using paragraph commands.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600525">600525</a>: Included patch for VHDL.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=605698">605698</a>: Replaced size attribute of hr tag by class attribute in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3467">3467</a>: perlmod output was wrong when using paragraph commands.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3571">3571</a>: Included patch for VHDL.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3617">3617</a>: Replaced size attribute of hr tag by class attribute in the HTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606030">606030</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606192">606192</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607563">607563</a>: +<li> id <a href="https://github.com/doxygen/doxygen/issues/3618">3618</a>, <a href="https://github.com/doxygen/doxygen/issues/3623">3623</a>, <a href="https://github.com/doxygen/doxygen/issues/3639">3639</a>: Using \dot produced "Error opening map file" or could even crash doxygen.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606084">606084</a>: Loading a new config file in doxywizard did not reset all +<li> id <a href="https://github.com/doxygen/doxygen/issues/3619">3619</a>: Loading a new config file in doxywizard did not reset all values of a previously loaded config file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606104">606104</a>: Grouped members with todo-like items were shown with +<li> id <a href="https://github.com/doxygen/doxygen/issues/3621">3621</a>: Grouped members with todo-like items were shown with "GlobalScope" prefix.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606156">606156</a>: Fixed RTF rendering problem with group index.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606206">606206</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610133">610133</a>: Added missing line break in LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606330">606330</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608056">608056</a>: The title of pages whose label had an underscore +<li> id <a href="https://github.com/doxygen/doxygen/issues/3622">3622</a>: Fixed RTF rendering problem with group index.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3624">3624</a>, <a href="https://github.com/doxygen/doxygen/issues/3675">3675</a>: Added missing line break in LaTeX output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3627">3627</a>, <a href="https://github.com/doxygen/doxygen/issues/3648">3648</a>: The title of pages whose label had an underscore was not shown</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606717">606717</a>: Include guard not starting with #ifndef SOME_GUARD_H were not +<li> id <a href="https://github.com/doxygen/doxygen/issues/3631">3631</a>: Include guard not starting with #ifndef SOME_GUARD_H were not recognised as such.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606718">606718</a>: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused +<li> id <a href="https://github.com/doxygen/doxygen/issues/3632">3632</a>: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused error that search results directory could not be created.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606772">606772</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608493">608493</a>: typedef'ed enums or struct with the same as the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3635">3635</a>, <a href="https://github.com/doxygen/doxygen/issues/3655">3655</a>: typedef'ed enums or struct with the same as the typedef did no longer show up.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607088">607088</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607946">607946</a>: Related pages (manual and automatic like the todo page) +<li> id <a href="https://github.com/doxygen/doxygen/issues/3636">3636</a>, <a href="https://github.com/doxygen/doxygen/issues/3643">3643</a>: Related pages (manual and automatic like the todo page) caused broken links when SHORT_NAMES was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607432">607432</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608002">608002</a>: Automatically generated related pages (like the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3638">3638</a>, <a href="https://github.com/doxygen/doxygen/issues/3644">3644</a>: Automatically generated related pages (like the todo page) caused broken links when CREATE_SUBDIR was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607736">607736</a>: comments after #if could cause next function call not to be +<li> id <a href="https://github.com/doxygen/doxygen/issues/3641">3641</a>: comments after #if could cause next function call not to be cross-referenced.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607743">607743</a>: \internal inside a conditional section caused warning.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608016">608016</a>: Using \internal inside a \section did not end at the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3642">3642</a>: \internal inside a conditional section caused warning.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3646">3646</a>: Using \internal inside a \section did not end at the next \section as documented.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608018">608018</a>: \internal command produced message with .: in +<li> id <a href="https://github.com/doxygen/doxygen/issues/3647">3647</a>: \internal command produced message with .: in the LaTeX output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608072">608072</a>: HTML Tables with custom attributes were not rendered +<li> id <a href="https://github.com/doxygen/doxygen/issues/3649">3649</a>: HTML Tables with custom attributes were not rendered properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608227">608227</a>: Man pages with underscore got double underscore in the name.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608590">608590</a>: Buffer overflow when using non-ascii characters as class +<li> id <a href="https://github.com/doxygen/doxygen/issues/3651">3651</a>: Man pages with underscore got double underscore in the name.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3658">3658</a>: Buffer overflow when using non-ascii characters as class name.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608921">608921</a>: Macro definition had effect even if the definition was not +<li> id <a href="https://github.com/doxygen/doxygen/issues/3662">3662</a>: Macro definition had effect even if the definition was not actually included.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609504">609504</a>: config.h and config.l where missing from the SVN repository.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609624">609624</a>: Todo items were merged for overloaded functions.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609709">609709</a>: C# enum values with @todo items were missing from the todo +<li> id <a href="https://github.com/doxygen/doxygen/issues/3670">3670</a>: config.h and config.l where missing from the SVN repository.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3672">3672</a>: Todo items were merged for overloaded functions.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3673">3673</a>: C# enum values with @todo items were missing from the todo list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610437">610437</a>: Removed bogus warning when using <br/> tag.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3678">3678</a>: Removed bogus warning when using <br/> tag.</li> <li> Fixed parsing problem for function pointer type starting with "typedef enum".</li> <li> Preprocessor did not take EXCLUDE_PATTERNS into account, which @@ -3124,12 +3524,12 @@ make sure you add the following: <a name="1.6.2"></a> <h1>Doxygen Release 1.6.2</h1> -<h2>(release date 30-12-2009)</h2> +<b>(release date 30-12-2009)</b> <h3>Changes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594787">594787</a>: Autolinking to all-lower case words has been disabled, +<li> id <a href="https://github.com/doxygen/doxygen/issues/3513">3513</a>: Autolinking to all-lower case words has been disabled, in accordance with the documentation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604543">604543</a>: Doxygen now allows any extension supported by dot via the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3608">3608</a>: Doxygen now allows any extension supported by dot via the DOT_IMAGE_FORMAT option.</li> <li> Switched back to using PNGs for built-in diagrams and formulas using the Lode Vandevenne's PNG encoder.</li> @@ -3144,14 +3544,14 @@ make sure you add the following: to generate an index file that can be used to embed doxygen's HTML output into Eclipse as a help plugin (thanks to a patch by Ondrej Starek).</li> -<li> Wrote new <a href="http://www.doxygen.org/searching.html">documentation</a> +<li> Wrote new <a href="searching.html">documentation</a> regarding the methods of searching in the HTML output.</li> <li> Included patch by Ed Rosten to render formulas with proper anti-aliasing on non-white backgrounds using transparency.</li> <li> Add new option FORCE_LOCAL_INCLUDES to make the default #include appearance in class documentation with "" i.s.o sharp brackets.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=558457">558457</a>: Make \addindex put keywords into the .qhp file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595214">595214</a>: #cmakedefine is now treated the same was as #define +<li> id <a href="https://github.com/doxygen/doxygen/issues/3156">3156</a>: Make \addindex put keywords into the .qhp file.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3519">3519</a>: #cmakedefine is now treated the same was as #define (for users of the CMake build system).</li> <li> Added compilation support for OSX 10.6 (aka Snow Leopard)</li> <li> Included language update for Brazilian.</li> @@ -3159,78 +3559,78 @@ make sure you add the following: <h3>Bug fixes</h3> <ul> <li> Doxywizard did not warn when it failed to save its config file.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557035">557035</a>: Empty class definitions were not included in Tokens file +<li> id <a href="https://github.com/doxygen/doxygen/issues/3136">3136</a>: Empty class definitions were not included in Tokens file for docsets.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=563233">563233</a>: GENERATE_QHP details was considered even though it is +<li> id <a href="https://github.com/doxygen/doxygen/issues/3187">3187</a>: GENERATE_QHP details was considered even though it is not defined.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567346">567346</a>: Comment parser could get stuck in certain cases.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=570369">570369</a>: GENERATE_QHP should generate keywords for classes in +<li> id <a href="https://github.com/doxygen/doxygen/issues/3223">3223</a>: Comment parser could get stuck in certain cases.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3254">3254</a>: GENERATE_QHP should generate keywords for classes in generated *.qhc.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571964">571964</a>: Fixed two issues in the compound.xsd schema definition.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592991">592991</a>: Fixed wrong default destination directory.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593040">593040</a>: Fixed problem with distributing member group documentation +<li> id <a href="https://github.com/doxygen/doxygen/issues/3273">3273</a>: Fixed two issues in the compound.xsd schema definition.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3491">3491</a>: Fixed wrong default destination directory.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3492">3492</a>: Fixed problem with distributing member group documentation for anonymous member groups.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593273">593273</a>: GENERATE_TODOLIST=NO and friends not longer worked.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593928">593928</a>: Added support for UCS-2 encoded input files.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594391">594391</a>: Fixed problem parsing fully-qualified java annotations.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594592">594592</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596815">596815</a>: Fixed problem handling quotes.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595191">595191</a>: Not all configuration options appeared in the index of +<li> id <a href="https://github.com/doxygen/doxygen/issues/3496">3496</a>: GENERATE_TODOLIST=NO and friends not longer worked.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3505">3505</a>: Added support for UCS-2 encoded input files.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3508">3508</a>: Fixed problem parsing fully-qualified java annotations.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3511">3511</a>, <a href="https://github.com/doxygen/doxygen/issues/3539">3539</a>: Fixed problem handling quotes.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3517">3517</a>: Not all configuration options appeared in the index of the documentation and some were not sorted correctly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595253">595253</a>: formulas had the .png extension while they were gifs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595833">595833</a>: Fixed recursive lockup while resolving template relations.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595935">595935</a>: Doxygen's preprocessor got confused when /**/ appeared as +<li> id <a href="https://github.com/doxygen/doxygen/issues/3520">3520</a>: formulas had the .png extension while they were gifs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3525">3525</a>: Fixed recursive lockup while resolving template relations.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3528">3528</a>: Doxygen's preprocessor got confused when /**/ appeared as part of a macro definition.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596085">596085</a>: Removed obsolete option USE_WINDOWS_ENCODING from the docs.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596233">596233</a>: RTF output was missing a new paragraph for brief +<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Removed obsolete option USE_WINDOWS_ENCODING from the docs.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3531">3531</a>: RTF output was missing a new paragraph for brief member descriptions.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596807">596807</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596819">596819</a>: Code reformatting done for the LaTeX output could +<li> id <a href="https://github.com/doxygen/doxygen/issues/3536">3536</a>, <a href="https://github.com/doxygen/doxygen/issues/3542">3542</a>: Code reformatting done for the LaTeX output could break multibyte UTF-8 characters causing invalid output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596809">596809</a>: Using multibyte characters in a page label caused invalid +<li> id <a href="https://github.com/doxygen/doxygen/issues/3537">3537</a>: Using multibyte characters in a page label caused invalid output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596816">596816</a>: Documented the interaction between LATEX_CMD_NAME and +<li> id <a href="https://github.com/doxygen/doxygen/issues/3540">3540</a>: Documented the interaction between LATEX_CMD_NAME and USE_PDFLATEX.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597015">597015</a>: Todo items for two inner classes with the same name where +<li> id <a href="https://github.com/doxygen/doxygen/issues/3548">3548</a>: Todo items for two inner classes with the same name where collapsed together in the todo list when HIDE_SCOPE_NAMES was enabled.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597016">597016</a>: Scope was not hidden for members in the todo list even +<li> id <a href="https://github.com/doxygen/doxygen/issues/3549">3549</a>: Scope was not hidden for members in the todo list even though HIDE_SCOPE_NAMES was set to YES.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598497">598497</a>: Struct variable with explicit struct keyword got labelled +<li> id <a href="https://github.com/doxygen/doxygen/issues/3562">3562</a>: Struct variable with explicit struct keyword got labelled with [read] attribute.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596902">596902</a>: PHP was not parsed properly when it appeared in a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3545">3545</a>: PHP was not parsed properly when it appeared in a <script language="php"> section.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597415">597415</a>: Fixed problem matching base class member against the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3550">3550</a>: Fixed problem matching base class member against the member in the derived class.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597518">597518</a>: Makefile for Docsets now honors DESTDIR.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598298">598298</a>: Made browsing for HHC_LOCATION via the wizard +<li> id <a href="https://github.com/doxygen/doxygen/issues/3551">3551</a>: Makefile for Docsets now honors DESTDIR.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3560">3560</a>: Made browsing for HHC_LOCATION via the wizard yield an absolute path.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599128">599128</a>: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid +<li> id <a href="https://github.com/doxygen/doxygen/issues/3564">3564</a>: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid issues in a Solaris environment.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595931">595931</a>: Removed unnecessary paragraphs from HTML table cells.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597541">597541</a>: referring to page labels of the form a-1 did not work.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599224">599224</a>: Code generators could produce extra </span> tags.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599974">599974</a>: Included the PHP search engine again (with new config +<li> id <a href="https://github.com/doxygen/doxygen/issues/3527">3527</a>: Removed unnecessary paragraphs from HTML table cells.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3552">3552</a>: referring to page labels of the form a-1 did not work.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3565">3565</a>: Code generators could produce extra </span> tags.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3568">3568</a>: Included the PHP search engine again (with new config option SERVER_BASED_SEARCH to enable it)</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600544">600544</a>: Doxygen produced invalid Latex output for RCS tags.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600563">600563</a>: Fixed issue with include dependency tracking that could +<li> id <a href="https://github.com/doxygen/doxygen/issues/3572">3572</a>: Doxygen produced invalid Latex output for RCS tags.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3573">3573</a>: Fixed issue with include dependency tracking that could cause macro expansion not to work properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600940">600940</a>: Fixed issue with VHDL call graph (thank to Martin Kreis +<li> id <a href="https://github.com/doxygen/doxygen/issues/3576">3576</a>: Fixed issue with VHDL call graph (thank to Martin Kreis for the fix).</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601138">601138</a>: Fixed problem parsing C++ function-try-blocks.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601222">601222</a>: #include inside a class could cause line numbers to be off.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601223">601223</a>: Fixed parsing problem skipping over /**/ comment.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601694">601694</a>: Fixed problem handling Javadoc style {@code ... } blocks.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601771">601771</a>: Special commands did not work in the title of +<li> id <a href="https://github.com/doxygen/doxygen/issues/3577">3577</a>: Fixed problem parsing C++ function-try-blocks.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3578">3578</a>: #include inside a class could cause line numbers to be off.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3579">3579</a>: Fixed parsing problem skipping over /**/ comment.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3584">3584</a>: Fixed problem handling Javadoc style {@code ... } blocks.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3585">3585</a>: Special commands did not work in the title of the @mainpage.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=602818">602818</a>: Fixed problem parsing files that start with UTF-8 BOM.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603001">603001</a>: Fixed problem parsing friend function with explicit scope.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603238">603238</a>: Fixed perlmod generation issue.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604948">604948</a>: Project number was not centered anymore in the HTML output.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604503">604503</a>: Using %word in a page title incorrectly did show the %.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3593">3593</a>: Fixed problem parsing files that start with UTF-8 BOM.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3596">3596</a>: Fixed problem parsing friend function with explicit scope.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3599">3599</a>: Fixed perlmod generation issue.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3613">3613</a>: Project number was not centered anymore in the HTML output.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3607">3607</a>: Using %word in a page title incorrectly did show the %.</li> </ul> <a name="1.6.1"></a> <h1>Doxygen Release 1.6.1</h1> -<h2>(release date 25-08-2009)</h2> +<b>(release date 25-08-2009)</b> <h3>Bug fixes</h3> <ul> <li> Fixed file handle leak when parsing include files. Also fixed @@ -3238,31 +3638,32 @@ make sure you add the following: parsed.</li> <li> Search result pages were not using UTF-8 character encoding.</li> <li> Search results pointing to external references were not linked correctly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: Multiline second argument of \ref caused unexpected " warning.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592454">592454</a>: Feeding invalid XML could crash doxygen's DBus XML parser.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592485">592485</a>: Include patch to fix problem with building rpms.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592511">592511</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592625">592625</a>: Doxywizard problem with GENERATE_TREEVIEW.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592650">592650</a>: SHOW_USED_FILES now works again.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592808">592808</a>: xrefitems (like @todo) did not appear in the list when +<li> id <a href="https://github.com/doxygen/doxygen/issues/966">966</a>: Multiline second argument of \ref caused unexpected " warning.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3479">3479</a>: Feeding invalid XML could crash doxygen's DBus XML parser.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3481">3481</a>: Include patch to fix problem with building rpms.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3482">3482</a>, <a href="https://github.com/doxygen/doxygen/issues/3486">3486</a>: Doxywizard problem with GENERATE_TREEVIEW.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3488">3488</a>: SHOW_USED_FILES now works again.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3489">3489</a>: xrefitems (like @todo) did not appear in the list when found in comments marked with @enum or @name.</li> </ul> +<a name="1.6.0"></a> <h1>Doxygen Release 1.6.0</h1> -<h2>(release date 20-08-2009)</h2> +<b>(release date 20-08-2009)</b> <h3>Changes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=580924">580924</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=541234">541234</a>: Replaced the PHP based search engine by a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3372">3372</a>, <a href="https://github.com/doxygen/doxygen/issues/3012">3012</a>: Replaced the PHP based search engine by a Javascript/DHTML based one. As a result the search feature no longer requires a HTTP server with PHP enabled to be usable. Searching is limited to symbols though, but it is now possible to filter on symbol type.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=519886">519886</a>: Make the HTML output XHTML 1.0 compliant.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=579950">579950</a>: Objective-C categories are now merged with their base +<li> id <a href="https://github.com/doxygen/doxygen/issues/2852">2852</a>: Make the HTML output XHTML 1.0 compliant.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3365">3365</a>: Objective-C categories are now merged with their base class, unless there is no base class.</li> <li> Member groups with the same header within the same scope are now merged. This also works for Objective-C categories.</li> <li> Changed the LaTeX style sheet such that more of the markup is configurable. Please update your style sheet if you use a custom one.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584844">584844</a>: Treat \details inside a brief description as a new paragraph +<li> id <a href="https://github.com/doxygen/doxygen/issues/3415">3415</a>: Treat \details inside a brief description as a new paragraph command.</li> <li> Split GENERATE_TREEVIEW into two separate options: GENERATE_TREEVIEW and USE_INLINE_TREES.</li> @@ -3273,7 +3674,7 @@ make sure you add the following: <ul> <li> Added option SORT_MEMBERS_CTORS_1ST, which when enabled places the constructors and destructors first in an otherwise sorted list.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581518">581518</a>: Applied patch by Tobias Hunger that adds support for +<li> id <a href="https://github.com/doxygen/doxygen/issues/3377">3377</a>: Applied patch by Tobias Hunger that adds support for documenting DBus XML interface descriptions. </li> <li> Included QtHelp patch by Karsten Heimrich which adds missing reference and keyword for methods.</li> @@ -3281,52 +3682,6111 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=131989">131989</a>: Fixed preprocessor handling for C# code. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: -- was not rendered correctly for LaTeX output</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=157485">157485</a>: Missing link in todo page.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=318061">318061</a>: Two template functions that only differed in the number +<li> id <a href="https://github.com/doxygen/doxygen/issues/947">947</a>: Fixed preprocessor handling for C# code. </li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/966">966</a>: -- was not rendered correctly for LaTeX output</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/1327">1327</a>: Missing link in todo page.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/1837">1837</a>: Two template functions that only differed in the number of template arguments were seen as the same function.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=443939">443939</a>: HIDE_UNDOC_CLASSES did not work properly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=509348">509348</a>: Fixed problem with syncing the information of +<li> id <a href="https://github.com/doxygen/doxygen/issues/2505">2505</a>: HIDE_UNDOC_CLASSES did not work properly.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/2786">2786</a>: Fixed problem with syncing the information of declaration and definition in the presence of an extra forward declaration in the source code.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=522193">522193</a>: For C# enum values were merged together if the same enum +<li> id <a href="https://github.com/doxygen/doxygen/issues/2875">2875</a>: For C# enum values were merged together if the same enum name was used in different scopes.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523167">523167</a>: Included patch to handle PROGRAM statement in Fortran as +<li> id <a href="https://github.com/doxygen/doxygen/issues/2894">2894</a>: Included patch to handle PROGRAM statement in Fortran as subroutines/functions.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=554636">554636</a>: Remove spacing around brackets for Obj-C protocols.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557026">557026</a>: Included patch for fixing wrongly labeled items in docsets.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=560512">560512</a>: Improved parser to better disambiguate +<li> id <a href="https://github.com/doxygen/doxygen/issues/3104">3104</a>: Remove spacing around brackets for Obj-C protocols.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3131">3131</a>: Included patch for fixing wrongly labeled items in docsets.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3170">3170</a>: Improved parser to better disambiguate nested templates ending with >> from the bitshift right operator.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=570238">570238</a>: Fixed matching problem for method in nested class, where +<li> id <a href="https://github.com/doxygen/doxygen/issues/3251">3251</a>: Fixed matching problem for method in nested class, where the outer class is a template.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581746">581746</a>: Segfault/realloc error when a very long path was used.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582469">582469</a>: documented #define with guard caused wrong documentation.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582276">582276</a>: Doxywizard could crash on exit in some cases.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582676">582676</a>: Regression: a struct ivar in ObjC class screws up method +<li> id <a href="https://github.com/doxygen/doxygen/issues/3379">3379</a>: Segfault/realloc error when a very long path was used.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3388">3388</a>: documented #define with guard caused wrong documentation.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3385">3385</a>: Doxywizard could crash on exit in some cases.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3392">3392</a>: Regression: a struct ivar in ObjC class screws up method identification.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583213">583213</a>: Included patch that avoids trailing spaces in the +<li> id <a href="https://github.com/doxygen/doxygen/issues/3396">3396</a>: Included patch that avoids trailing spaces in the generated Doxyfile template.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584192">584192</a>: Included VHDL patch by Martin Klein</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585543">585543</a>: Fixed case where matching declaration and definition did +<li> id <a href="https://github.com/doxygen/doxygen/issues/3409">3409</a>: Included VHDL patch by Martin Klein</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3420">3420</a>: Fixed case where matching declaration and definition did not work correctly.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585260">585260</a>: The "more..." link for files was broken, since the anchor +<li> id <a href="https://github.com/doxygen/doxygen/issues/3418">3418</a>: The "more..." link for files was broken, since the anchor was not generated.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=586925">586925</a>: Fixed parsing problem when an unpaired apostrophe +<li> id <a href="https://github.com/doxygen/doxygen/issues/3433">3433</a>: Fixed parsing problem when an unpaired apostrophe appeared in a Python comment.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588291">588291</a>: Included fix for doxywizard makefile. </li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588587">588587</a>: Added missing virtual destructor to CompAccept base class.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588968">588968</a>: Fixed segmentation fault for specific case in PHP code.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3446">3446</a>: Included fix for doxywizard makefile. </li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3447">3447</a>: Added missing virtual destructor to CompAccept base class.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3450">3450</a>: Fixed segmentation fault for specific case in PHP code.</li> <li> Fixed some issues building for Windows.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589514">589514</a>: Fixed problem handling strings like a"\b" within a comment.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589616">589616</a>: Fixed problem matching explicitly scoped parameter in a +<li> id <a href="https://github.com/doxygen/doxygen/issues/3457">3457</a>: Fixed problem handling strings like a"\b" within a comment.</li> +<li> id <a href="https://github.com/doxygen/doxygen/issues/3459">3459</a>: Fixed problem matching explicitly scoped parameter in a template class.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590712">590712</a>: A namespaced with name "internal" (C++/CLI keyword) +<li> id <a href="https://github.com/doxygen/doxygen/issues/3473">3473</a>: A namespaced with name "internal" (C++/CLI keyword) could confuse doxygen's C++ parser.</li> -<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=591749">591749</a>: @optional/@required attributes for Objective-C were missing +<li> id <a href="https://github.com/doxygen/doxygen/issues/3477">3477</a>: @optional/@required attributes for Objective-C were missing from the XML output.</li> </ul> -<h1><a href="http://www.doxygen.org/changelog_1.5.html">Doxygen Release 1.5 and earlier</a></h1> +<p> +\endhtmlonly +\section log_1_5 1.5 Series +\htmlonly +</p> +<h1>Doxygen Release 1.5.9</h1> +<b>(release date 30-04-2009)</b> +<a name="1.5.9"></a> +<h3>New features</h3> +<ul> +<li> Added new option LATEX_SOURCE_CODE, which when enabled adds + source code also to the latex output (typically to be used in + combination with SOURCE_BROWSER)</li> +<li> Included updates for the Finnish, Romanian, Korean, German, Japanese, + and Hungarian translation.</li> +<li> Added translation support for Esperanto.</li> +<li> id 579630: Added class attribute to the \todo and \bug HTML code so they + can be customized via CSS.</li> +<li> id 578740: Added support for Æ and æ characters.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 395169: Some links via tagfiles were not correct in + combination with CREATE_SUBDIRS=YES</li> +<li> id 539080: Having the same comment for the declaration and definition + of a function could result in duplicate documentation in case the + indentation level was different.</li> +<li> id 566713: Dot font was not removed even though DOT_CLEANUP was YES.</li> +<li> id 566925: Fixed problem resolving symbolic links.</li> +<li> id 567044: Fully qualified name was not shown correctly for nested + classes.</li> +<li> id 567375: Fixed parse problem for typedefs with redundant braces.</li> +<li> id 567535: Fixed problem when parsing operator%= for CLI/C++ code.</li> +<li> id 567777: Fixed problem with latex output when using enums.</li> +<li> id 567990: Doxygen could crash when there was a symlink in project.</li> +<li> id 568237: Non-ascii values entered where not saved according to the + INPUT_ENCODING.</li> +<li> id 568505: Fixed build problem for old Linux distributions.</li> +<li> id 569478: Fixed line continuation issue with the Fortran parser.</li> +<li> id 570960: C++ class defined in a .mm file was sometimes parsed as + Objective-C code.</li> +<li> id 571013: In the wizard, editing a text field in the middle of the + text in the expert tab caused the cursor to jump to the end of the line.</li> +<li> id 571096: Fixed Objective-C parsing problem when multiple protocol + forward declarations are put on one line.</li> +<li> id 571990: Fixed compiler issue with portable_iconv by moving the + function to a C file.</li> +<li> id 572560: Fixed parse issue when a #define is inside an enum.</li> +<li> id 572740: Fixed problem parsing C++ comments using line continuation.</li> +<li> id 573057: Included update for Swedish translator and changed + the language code from SE to SV to comply with ISO 639.</li> +<li> id 578382: When referring to a static variable or function + doxygen will now look at the file context in case of ambiguity.</li> +</ul> + +<h1>Doxygen Release 1.5.8</h1> +<b>(release date 27-12-2008)</b> +<a name="1.5.8"></a> +<h3>Changes</h3> +<ul> +<li> Completely rewrote the doxywizard. Main changes: + <ul> + <li> It is now based on Qt version 4. (4.3 or higher is required) </li> + <li> Different layout that allows easy switching between wizard + and expert mode, without losing settings.</li> + <li> Running doxygen can be done without first having to save + the configuration file.</li> + <li> For HTML output, there is a button to show the results in + the default browser.</li> + <li> Option to change the default configuration that is used + when you first start the wizard.</li> + <li> Non-default options are shown with red label, and there is + context menu to reset them back to the default.</li> + </ul></li> +<li> Included Qt help update by Sebastian Pipping introducing + three new options to define custom filter sections and attributes: + <code>QHP_CUST_FILTER_NAME</code>, + <code>QHP_CUST_FILTER_ATTRS</code>, + <code>QHP_SECT_FILTER_ATTRS</code>. + Doxygen now directly generates the indices needed + by the qthelpgenerator. + Qt customers can have a look at issue 28 of the Qt Quarterly for + more information.</li> +</ul> +<h3>New features</h3> +<ul> +<li> id 131496, 522488, 541649, 554800: + Add new option EXTENSION_MAPPING, which can be used to + change the + mapping of file extension to language parser, e.g. defining + <code> + EXTENSION_MAPPING = f=C + </code> + will make doxygen parse files with the <code>.f</code> + extension as if it were C files.</li> +<li> Added support for Vietnamese (thanks to Dang Minh Tuan)</li> +<li> Thanks to Emin Ilker Cetinbas doxygen can now also produce Turkish + documentation.</li> +<li> id 143218: It is now possible to add the direction attributes + normally used with the @param command to document parameters + inline, e.g. + <code> + void foo(int v /**< [in] input parameter docs */); + </code></li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> TYPEDEF_HIDES_STRUCT did not work correctly if the typedef did a + forward declaration of the struct/union.</li> +<li> id 153222: Fixed issue following recursive symbolic links.</li> +<li> id 423223: Detailed description was not visible for group functions + when SEPARATE_MEMBER_PAGES was enabled.</li> +<li> id 437346: Fixed issue handling multibyte characters in the RTF output.</li> +<li> id 475377: Improved error handling in case of character encoding + problems.</li> +<li> id 486747: Inherited typedefs were not resolved propertly.</li> +<li> id 508752: Add support for BLOCK DATA to the fortran parser.</li> +<li> id 532695: included documentation update about the use of \public + and friends for object-oriented programming in C.</li> +<li> id 532808: References to class variables in PHP code did not already work.</li> +<li> id 536394: Warning "no matching file member found" was given for a static + variables in multiple anonymous namespaces.</li> +<li> id 537686: Fixed invalid empty section for enum in a member group.</li> +<li> id 539590: C# generics with the same name but different template + parameters where merged.</li> +<li> id 540321: A using declaration in a header file was not taken into + account in the source file that included it.</li> +<li> id 540520: Have two C# enum values with the same name in different enums + was not handled properly.</li> +<li> id 543036: //## comments were extracted even if they were not part of + Rose documentation.</li> +<li> id 547436: Fixed issue combining Python docstrings and doxygen comments.</li> +<li> id 551615: A multiline C# comment with @ was not shown correctly in the + source browser.</li> +<li> id 544598: A multiline comment as part of a #define could case + wrong line counting and missing cross-references.</li> +<li> id 545128: \overload didn't work if it was the last statement in a + comment and not followed by a newline.</li> +<li> id 553380: Removed bogus warning refering to a namespace member from + with a brief description that was converted to a tooltip.</li> +<li> id 553968: Added support for JavaDoc command {@code ... }</li> +<li> id 554444: Bullet lists were no longer correctly indented when using + IE6.</li> +<li> id 554674: Fixed index rendering bug in the RTF output.</li> +<li> id 555174: The .qch file didn't include generated images.</li> +<li> id 555200: Fixed potential crash bug when parsing special comment + inside an if at global scope level of a PHP code fragment.</li> +<li> id 556240: Tree view in HTML output was not encoded correctly.</li> +<li> id 557001: VHDL Parser got confused when -- is in a string literal.</li> +<li> id 557014: Undocumented VHDL record member's internal record prefix + was not removed.</li> +<li> id 557026: Obj-C Protocols and interfaces had wrong + type/name in DocSets.</li> +<li> id 557031: Obj-C methods no longer require a space after the + initial - or +.</li> +<li> id 557034: Fixed problem parsing property in Objective-C code.</li> +<li> id 557038: Items in tabs.css could not be overridden by custom + style sheet.</li> +<li> id 557419: $relpath$ was no longer expanded in custom HTML headers.</li> +<li> id 557735: Summary for member groups was missing for groups and files.</li> +<li> id 558078: collaboration graph of a class using std::list of another class + was not correct if the classes where inside a namespace.</li> +<li> id 558460: When using \subpage, any section in the sub page was + missing from the LaTeX output.</li> +<li> id 558525: Template classes produced invalid HTML in the tree view.</li> +<li> id 559338: PHP Parser could get confused when there was a comment inside + an array initializer.</li> +<li> id 559650: Obj-C @interface without body was handle correctly.</li> +<li> id 560623: Mixin template classes where not shown properly in the inheritance + diagram if the classes where inside a namespace.</li> +<li> id 563136: The brief sentence is not shown for groups with no children.</li> +<li> id 563384: call graphs were not generated for Qt signals and slots</li> +<li> Included VHDL fix by Martin Kreis.</li> +<li> grouping of multiple @todo's (and friends) didn't work anymore, + causing duplicate sections and labels.</li> +<li> Some issues related to the Qt help output were fixed.</li> +</ul> + +<h1>Doxygen Release 1.5.7.1</h1> +<b>(release date 5-10-2008)</b> +<a name="1.5.7.1"></a> +<h3>Changes</h3> +<ul> +<li> The dot tool is no longer part of the doxygen package for MacOSX. + Please install GraphViz separately and set the dot path + to /usr/local/bin</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added option DOT_FONTSIZE which allows to set the size of + the fonts used in dot generated graphs.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 554432: Re-added ALPHABETICAL_INDEX option.</li> +<li> id 554379: Fixed internal error for GENERATE_INDEXLOG when + GENERATE_HTML was set to NO.</li> +<li> id 554546: Included fix for handling relative includes in the + preprocessor.</li> +<li> Included several VHDL fixes related to syntax highlighting, finding + class members, and mixing upper and lower case.</li> +<li> Included patch to allow setting DEST_DIR environment variable + to determine where to install doxygen.</li> +</ul> + +<h1>Doxygen Release 1.5.7</h1> +<b>(release date 28-9-2008)</b> +<a name="1.5.7"></a> +<h3>Changes</h3> +<ul> +<li> The default CSS style sheet has been cleaned up and simplified, thanks + to the work done by Quinn Taylor.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added new config options <code>GENERATE_QHP</code> + which enables generating .qch (Qt compiled help) file via + the Qt's qthelpgenerator tool (part of Qt 4.4+). + This type of files can be read with Qt's Assisant to browse the + documentation in a similar way as is possible with Microsoft's + compiled HTML help (.chm). To further customize the output and run the + help generator from within doxygen, the following options + are available: <code>QCH_FILE</code>, <code>QHP_NAMESPACE</code>, + <code>QHP_VIRTUAL_FOLDER</code>, <code>QHG_LOCATION</code>. + Thanks to Sebastian Pipping for the patch.</li> +<li> Add new option <code>SYMBOL_CACHE_SIZE</code> to allow a different + trade off between doxygen's memory usage and the amount of disk + accesses.</li> +<li> id 532695: Added 3 new commands: \extends, \implements, and \memberof + that allow object oriented constructs to be documented as such + for languages that do not support it natively (e.g. C)</li> +<li> Added better support for one line comments after VHDL types.</li> +<li> Added new option <code>LAYOUT_FILE</code> which can be used to + specify a layout + template file that tells doxygen in which order to generate the + output and which titles to use for headings and how + the navigation index will look; + Read <a href="customize.html">this</a> for more info. + As a result the following options are now obsolete since they can + now only be controlled via the layout file: + <code>DETAILS_AT_TOP</code>, <code>ALPHABETICAL_INDEX</code>. + The following options can also be set via the layout file, but + for convenience and backward compatibility reasons they are still + also part of the configuration file: + <code>SHOW_INCLUDE_FILES</code>, <code>SHOW_USED_FILES</code>, + <code>CLASS_GRAPH</code>, <code>COLLABORATION_GRAPH</code>, + <code>GROUP_GRAPHS</code>, <code>INCLUDE_GRAPH</code>, + <code>INCLUDED_BY_GRAPH</code>. + Run doxygen with the -l option to generate the default layout file.</li> +<li> Included update for the Macedonian, Catalan, Brazilian, and Serbian + translation and also support for Serbian with Cyrilic characters.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 140264, 332187, 541924: Sections inside a \subpage where not shown as + subsection in the LaTeX/RTF output. </li> +<li> id 155098,156188: Added support for UTF-8 special characters in identifiers (which is + allowed by e.g. C#).</li> +<li> id 304598: operator-- caused invalid HTML output.</li> +<li> id 324047: parameter type [in or out] were not generated in RTF document</li> +<li> id 363499: @todo and friends did not work in a comment marked with @dir.</li> +<li> id 445485: HTML commands in a comment block with attribute values without + quotes were not handled properly.</li> +<li> id 533855: Processes were always documented as anonymous in VHDL code.</li> +<li> id 535379: Added support for %{...%} blocks in XPCOM's IDL.</li> +<li> id 536298: Last port in a VHDL port list was not correctly put in a + member group.</li> +<li> id 536385: Fixed problem matching function prototype and implementation + under certain conditions.</li> +<li> id 536629: Fixed compilation issue on NetBSD.</li> +<li> id 537393: Properties in Python were not properly handled.</li> +<li> id 538065: Added support for @optional and @required in Objective C 2.0 + protocols.</li> +<li> id 538239: Some unlabeled VHDL processes were not corrected detected.</li> +<li> id 538515: Deriving a Objective-C interface from a protocol caused + parsing problems if the interface also has a body.</li> +<li> id 539057: Part of an Objective-C expression could be missing in the + source browser under certain conditions.</li> +<li> id 539590: Generic C# classes with the same name but different + template arguments were no longer treated as different classes.</li> +<li> id 539712: Fixed code parser issue for parameter indices of procedures + and functions.</li> +<li> id 540058: Creator code was wrong in the MacOSX application bundle.</li> +<li> id 540372: Fixed problem parsing large table by increasing + YY_READ_BUF_SIZE in the generated parser files.</li> +<li> id 540247: Fixed potential memory corruption issue parsing VHDL.</li> +<li> id 541113: Fixed locale for ctype, to avoid stripping of 0xA0 + from multi-byte UTF-8 characters.</li> +<li> id 544479: <code>SORT_MEMBER_DOCS</code> did not work for class members.</li> +<li> id 546621: Fixed makefile so that .svn stuff is removed from the + tarball when doing "make archive".</li> +<li> id 546812: Using a table with row span greater than 1 did not + produce correct LaTeX output.</li> +<li> id 545098: Fixed problem parsing where clauses in combination with C# + generics.</li> +<li> id 545503: Nameless parameters of type "struct A" could end up wrongly + in the XML output.</li> +<li> id 545970: Refering to the main page did not work as advertised.</li> +<li> id 546158: The variable defined inside a foreach statement in C# code + was not considered for source linking, cause potentially incomplete call + graphs.</li> +<li> id 547361: Linking to specialized template functions did not work.</li> +<li> id 548175: Fixed problem parsing class members within a class X, + inside a namespace that is also named X.</li> +<li> id 548443: Documenting a nested namespace/classes with @namespace X.Y + did not work for C# (only X::Y worked).</li> +<li> id 548489: C++/CLI classes of type sealed abstract were not + processed correctly.</li> +<li> id 549318: Some headings in the user manual where wrongly formatted. </li> +<li> id 549581: Fixed potential buffer overflow in preprocessor.</li> +<li> id 550058: Obj-C: properties for private fields did not appear in the + output unless <code>EXTRACT_PRIVATE</code> was enabled. </li> +<li> id 550156: Corrected typo in the documentation for + <code>GENERATE_TREEVIEW</code>.</li> +<li> id 550247: Fixed problem parsing octal character literals in + the preprocessing phase.</li> +<li> id 551739: Related function with explicit namespace scope was not + properly placed if the function also existed in the global namespace.</li> +<li> id 552115: Anonymous structs and unions could produce invalid links in + the html help index.</li> +<li> id 552361: Fixed problem with operators in the LaTeX output.</li> +<li> id 552600: \copybrief ended a brief description instead of appending + to it.</li> +<li> id 553469: Removed bogus warning about internal inconsistency when + importing items via a tagfiles that are inside an undocumented scope.</li> +<li> id 553616: One can now remove the automatic line breaks in the type + part of a declaration by using a custom stylesheet with + BR.typebreak { display: none; }</li> +<li> id 553663: Aliases did not work in Fortan comments.</li> +<li> id 549022: Reimplemented in links could be wrong in case of + overloaded members.</li> +<li> id 553225: Parser was confused by arrays inside an Obj-C message.</li> +<li> Finnish translation was disabled. </li> +<li> A collaboration graph with multiple edge labels with not written to + the XML output correctly.</li> +<li> sub pages of a \mainpage were not shown in the Latex/RTF output.</li> +<li> Included some fixed for the VHDL parser.</li> +</ul> + +<h1>Doxygen Release 1.5.6</h1> +<b>(release date 18-5-2008)</b> +<a name="1.5.6"></a> +<h3>Changes</h3> +<ul> +<li> The GENERATE_TREEVIEW option is not longer a boolean, but can now + have 4 values, NONE (was NO), FRAME (was YES), HIERARCHIES, and ALL. + Thanks to Jake Colman for the patch.</li> +<li> a page marked as a sub page (\subpage) is now shown in the LaTeX and + RTF output as a section of its parent page. So the top level pages are + shown a chapters, subpages as sections, subpages of a subpage as + subsections, etc. </li> +<li> Included spec file updates by Kenneth Porter.</li> +</ul> +<h3>New features</h3> +<ul> +<li> id 514810: Added DOT_FONTNAME and DOT_FONTPATH options which allow + instructing dot to use a different font than FreeSans.ttf which doxygen + put in the output directory.</li> +<li> id 517242: Added option CHM_INDEX_ENCODING to specify the encoding + to be used for the CHM index files. Needed because CHM index files + cannot handle UTF-8 encoding.</li> +<li> id 519573: Included patch to make the font-size button visible in the + CHM output.</li> +<li> id 521288: Added new options SHOW_NAMESPACES and SHOW_FILES to + Suppress Namepace and Files Pages.</li> +<li> id 521495: Included a patch that makes it easy to modify the root of + the html treeview with an image using style sheets.</li> +<li> id 522300: Added option IDL_PROPERTY_SUPPORT to enable/disable special + propget/propput handling in IDL files.</li> +<li> Translation support for Finnish has been updated.</li> +<li> Added option FORMULA_FONTSIZE which can be used to change the font size + of the formulas included in the HTML documentation.</li> +<li> included update for Russian translation.</li> +<li> included patch to fixed some issues with VHDL code and add support + for some VHDL-93 constructs.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Regression: fixed problem handling STL classes + when BUILTIN_STL_SUPPORT was enabled</li> +<li> id 142866,377976: Added new \copybrief and \copydetails commands, + which work as \copydoc but then only copy either the brief or the + detailed part of a comment block.</li> +<li> id 312655: DISTRIBUTE_GROUP_DOC didn't always work in combination + with SORT_BRIEF_DOCS enabled.</li> +<li> id 352234: The search index could contain invalid references when + SOURCE_BROWSER=NO and CALL_GRAPHS=YES.</li> +<li> id 402447: Added support for C# method declarations with where clauses.</li> +<li> id 425029: WARN_FORMAT does no longer require all of + $file, $line, $text to be valid.</li> +<li> id 495687: Replaced MAX_DOT_GRAPH_MAX_NODES with DOT_GRAPH_MAX_NODES + in the docs & config file.</li> +<li> id 508694 Fixed problem with mixed simple and double quotes in + fortran format declaration</li> +<li> id 508752: Fixed problem where the fortran scanner didn't recognize END</li> +<li> id 510971: Fortran: parser was confused by double REAL() in processed + statements.</li> +<li> id 514488: Fixed problem matching argument lists with const qualifiers.</li> +<li> id 514891: PDF generation failed with a LaTeX error when tocdepth + was set to a value higher than 2.</li> +<li> id 515518: Links in member group documentation was broken when + CREATE_SUBDIRS was enabled.</li> +<li> id 516086: Fixed division by zero when producing RTF output for the + comment /** <table><tr></tr></table> */</li> +<li> id 516536: Fixed build issues on OSX 10.4 and earlier.</li> +<li> id 516070: Added support for simple events without accessors in C#.</li> +<li> id 516387: replace 0xA0 character in perlmodgen.cpp by a space to + avoid compilation problems with the Chinese version of Visual Studio.</li> +<li> id 517112: Regression: examples with the same name but different paths + cause "file not found" warning.</li> +<li> id 518334: Fixed problem parsing Objective-C protocol definitions.</li> +<li> id 518537: Hiding an enum with an undocumented typedef with the same + name caused explicit referencing of the enum to fail.</li> +<li> id 519661: In some cases a function prototype could incorrectly be + flagged as a variable with constructor.</li> +<li> id 520325: Fixed parse problem when comment was after an extern "C" + block and before the opening bracket.</li> +<li> id 521234: Fortran: fixed problem causing + "stack empty! when parsing code"</li> +<li> id 522225: PDF Latex output did not produce proper hyperlinks for \page + and \subpage comment blocks.</li> +<li> id 522248: Page header were wrongly displayed in the RTF output.</li> +<li> id 522415: Fixed compile errors in addon/doxmlparser.</li> +<li> id 522600: Added additional warnings to signal invalid configurations.</li> +<li> id 523138: Removed redundant paragraph in navigation section of the + HTML output. </li> +<li> id 523326: Namespace name was prepended twice to template + specializations classes.</li> +<li> id 524357: Default mentioned for REFERENCED_BY_RELATION relation + was not correct.</li> +<li> id 524359: Default mentioned for REFERENCES_RELATION relation was + not correct.</li> +<li> id 524473: Removed incorrect warnings about parameters in VHDL.</li> +<li> id 525140: Improved handling of Objective-C 2.0 properties.</li> +<li> id 525143: Properties are now listed as attributes in the UML diagrams.</li> +<li> id 525144: GENERATE_DOCSET option greyed out in doxywizard.</li> +<li> id 526155: Removed warning about QFile::setName when parsing VHDL files.</li> +<li> id 527781: Template arguments for bases class not shown in a consistent + way.</li> +<li> id 528023: Inheritance relations were not correctly displayed for + C# generics.</li> +<li> id 528424: Fixed rendering bug in HTML output when used with Opera.</li> +<li> id 528584: Using enum and enum value with the same name in C# code + caused crash.</li> +<li> id 528620: Fixed typo in French translation.</li> +<li> id 528815: Fixed problem parsing define() statements in PHP code.</li> +<li> id 528989: Leading C comment could prevent preprocessor expansion for + the rest of the line.</li> +<li> id 529803: Doxygen didn't find call(er) relations for C# when using + this.Method() calls;</li> +<li> id 529554: Putting defined() inside a macro caused the preprocessor + to get confused.</li> +<li> id 529758: C++/CLI: default inheritance is now public, nested templates + ending with >> are now handled properly as well as indexed properties.</li> +<li> id 530201: Avoided warning for undocumented self parameter in Python.</li> +</ul> + +<h1>Doxygen Release 1.5.5</h1> +<b>(release date 10-2-2008)</b> +<a name="1.5.5"></a> +<h3>Changes</h3> +<ul> +<li> Pages created with @page are now chapters in the LaTeX and RTF output + and treeviews, and directly follow the mainpage. Also the project name + is not longer repeated for each chapter. + This should make it more convenient to create normal, printable + documentation with doxygen.</li> +<li> For dot graphs with an edge with more than ten labels, only the first + ten are shown followed by an ellipsis; done to prevent very long + dot runs resulting in unreadable graphs.</li> +<li> Use of pdflatex with hyperlinks is now the default.</li> +<li> id 511116: C++ preprocessor macro names are now replaced in the + comments as well. For example, S and m are replaced in the comments for: + <code> + #define C(S,m) /** container S */ struct S { /** value m */ int m; } + </code></li> +<li> id 493923: The options SOURCE_BROWSER, CALL_GRAPH, CALLER_GRAPH, + REFERENCES_RELATION, and REFERENCED_BY_RELATION can now be indepently + enabled and disabled. By default the relations are now disabled.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for VHDL (.vhd or .vhdl extension) based on a patch by + Martin Kreis. Use OPTIMIZE_OUTPUT_VHDL when parsing VHDL code. </li> +<li> id 374699: Added support for Objective-C 2.0 properties.</li> +<li> Added compilation support for MacOSX 10.5 (Leopard) incombination with + Xcode 3</li> +<li> Added support for docsets, which allow integration of doxygen generated + API documentation in Xcode 3. new options: + <ul> + <li> GENERATE_DOCSET: enables/disables the feature</li> + <li> DOCSET_FEEDNAME: sets the provider/suite name under which the set is + listed.</li> + <li> DOCSET_BUNDLE_ID: A unique name for the docset.</li> + </ul> + See the configuration file or manual for more details.</li> +<li> id 493467: Added compilation support 64bit Solaris machines in + combination with Sun's own compiler (thanks to Heiko Jansen).</li> +<li> id 153376: Added support for the \tparam command, which works similar to \param + but is meant for documenting template parameters.</li> +<li> id 140104: Added \headerfile command which can be used to specify + the second and third argument of a \class command, when + the documentation is already in front of a class definition.</li> +<li> Added translator support for Macedonian.</li> +<li> Added language updates for German, Perian, Spanish, Taiwanese, + and Chinese, Korean, Croatian.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed potential crash bug due to wrong pointer check.</li> +<li> Using @param as the first word in a comment block did not work properly + in combination with JAVADOC_AUTOBRIEF set to YES.</li> +<li> Some character's could be missing from IDL properties.</li> +<li> Automatic abbreviations did not work for nested classes or classes + in a namespace.</li> +<li> Fixed a preprocessor bug where the line numbers of a definition could + get out of sync with the source code.</li> +<li> id 142023: Putting Qt signals or slots in a group did not + make them appear in the group documentation.</li> +<li> id 318668: Comments in Python function argument lists got messed up.</li> +<li> id 325359: Added support for C# XML-doc commands typeparam and + typeparamref.</li> +<li> id 331674: Aliases did not work in Python code.</li> +<li> id 356399: Fixed strange warning when specifying a tag file with an + anchor twice.</li> +<li> id 363828: Docstrings found at the top of a python file are handled + as module documentation again.</li> +<li> id 429437: A #include outside the input files was not searched + in the current directory of the file containing the include.</li> +<li> id 451299: Sometimes the wrong include file chosen when ambiguous</li> +<li> id 460585: @cond did not work in Python code.</li> +<li> id 477377: Function in undocumented anonymous namespace cause broken + link if EXTRACT_ALL was set to NO.</li> +<li> id 484731: Additional fixes for parsing Fortran.</li> +<li> id 488125: <code>operator->*</code> was not displayed properly in the output.</li> +<li> id 490766: Fixed compile error in fortranscanner.l which occurred for + some compilers.</li> +<li> id 492027: Ampersand (&) in front of parameter stops documenting + of PHP source</li> +<li> id 493249: using a namespace (or fortran module) caused the namespace + to appear in the documentation as if it was defined.</li> +<li> id 493434: Nested C# style XML lists in a comment block were not + handled correctly. </li> +<li> id 494187: Doxygen could crash due to an infinite recursion when + using tag files.</li> +<li> id 494599: When updating a config file an extra space was added just + before the end of a quoted string.</li> +<li> id 494760: Putting a # in a path name using Doxywizard, caused the + # to interpreted as the start of a comment in the Doxyfile.</li> +<li> id 495656: Description of default used for DOT_TRANSPARENT was wrong.</li> +<li> id 495687: Fixed typo in the description of DOT_GRAPH_MAX_NODES.</li> +<li> id 496392: Putting character entities like é in section/group + titles resulted in &acute; in the output.</li> +<li> id 498049: Improvements to .spec files for RPM creation.</li> +<li> id 498680: Callgraphs for functions in anonymous namespaces generated + invalid labels for 'dot' when EXTRACT_ANON_NSPACES was set to YES.</li> +<li> id 498711: Reference parameters in PHP were not properly parsed.</li> +<li> id 499577: Collaboration diagrams not working with typedef</li> +<li> id 500227: Wrong output generated for Objective-C methods with + multiple arguments for LaTeX or RTF output.</li> +<li> id 500635: Project name is no longer placed before each top level + item in the treeview and other indices.</li> +<li> id 500465: Fixed some issues compiling for AIX.</li> +<li> id 500928: Fixed parser issue handling a tripple quoted + string when used to initialize a Python variable.</li> +<li> id 500944: Python variables with package scope were only extracted if + EXTRACT_STATIC was enabled.</li> +<li> id 501704: Line numbering was wrong when a #include was placed inside + an array/struct initializer list.</li> +<li> id 502213: Combining a brief and detailed description in an alias + produced the warning "unknown command \_‍linebr".</li> +<li> id 502447: Single quoted PHP strings were not handled correctly + by the source code parser.</li> +<li> id 503939: Variable was checked before initialized.</li> +<li> id 504120: TYPEDEF_HIDES_STRUCT now also works for enums.</li> +<li> id 504439: Assert when marshaling a member which had an associated + example.</li> +<li> id 504650: Generated LaTeX code injected hyperlinks into section titles.</li> +<li> id 507052: Fortran function named x_function was not properly handled.</li> +<li> id 507603: Enabling FILTER_SOURCE_FILES caused strange warnings when + INPUT_FILTER is empty.</li> +<li> id 508740: Using upper case port mode specifiers did not work correctly.</li> +<li> id 508753: Fortran: Added .f as allowed fortran extension.</li> +<li> id 508759: Fortran: fixed potential memory corruption while scanning + parameter lists.</li> +<li> id 507528: XML output was not correct for pointer arrays.</li> +<li> id 508752: Fortran scanner didn't recognize lonely END</li> +<li> id 509278: Spaced before the \internal command where treated as + documentation.</li> +<li> id 509582: Fortran: Spaces in function return type were not parsed + properly.</li> +<li> id 510387: Fortran scanner didn't parse initialisation of complex type + correctly. </li> +<li> id 511921: @file command ended brief description even when + JAVADOC_AUTOBRIEF was enabled.</li> +<li> id 512620: \copydoc of a comment with @param commands could result in + warnings that parameters were not documented.</li> +<li> id 513570: Fixed cross site scripting vulnerability in the + search.php script.</li> +<li> id 514814: Included missing fromUtf8 calls to translator decoder to + prevent potential language encoding issues.</li> +<li> id 513885: Using <code>this-></code> inside a function could result in incomplete + call graph.</li> +</ul> + +<h1>Doxygen Release 1.5.4</h1> +<b>(release date 27-10-2007)</b> +<a name="1.5.4"></a> +<h3>Changes</h3> +<ul> +<li> id 469260: When setting SOURCE_BROWSER to YES, all undocumented classes also ended + up in the documentation. Now this will only happen if EXTRACT_ALL is also + enabled.</li> +<li> Upgraded included third party libs libpng and zlib to version 1.2.21 and 1.2.3 + respectively.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Included support for parsing Fortran 90, thanks to a patch by + Anke Visser and Oleg Batrashev (source: http://dougdevel.org/index.php?page=doxygen)</li> +<li> id 477548: Added config option SIP_SUPPORT to support handling SIP sources + (used for Python to C++ bindings).</li> +<li> id 475828: Added support for CLI/C++ style indexed properties.</li> +<li> Added config option TYPEDEF_HIDES_STRUCT which when enabled treats a typedef + of a struct as a struct with the name of the typedef. This behavious was + coupled to OPTIMIZE_OUTPUT_FOR_C in the previous version and is now an independent + option.</li> +<li> Included updates for the Korean, Brazilian and Chinese translations.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 314541: Fixed wrong DOCTYPE in HTML output when GENERATE_TREEVIEW was set to YES</li> +<li> id 321784: Changed scope resolution algorithm to avoid lookup failures on using + directives (thanks to Christoph Schulz for the patch).</li> +<li> id 415866: Fixed bug in preprocessor causing "More #endif's than #if's found" warning.</li> +<li> id 426971,465020: A brief description would in some cases be treated as a + detailed one.</li> +<li> id 430148: Doxygen reported "Internal Inconsistency" for class member inside + anonymous namespaces.</li> +<li> id 433449,363010: Removed Internal inconsistency when referencing enum values found + in a tag file.</li> +<li> id 438282: Line numbers were displayed when using \include inside \example.</li> +<li> id 443942,461433: mscgen was not called correctly on Windows when + generating .map files.</li> +<li> id 457346: increased the threshold for adding line breaks to the type part of a + declaration.</li> +<li> id 460294: Missing references in source browser when using the "register" keyword.</li> +<li> id 461889: Fixed bogus "no matching class member found" case. </li> +<li> id 462051: In certain cases doxygen failed to find the proper inheritance relation.</li> +<li> id 462077: Error in LaTeX index generation due to unescaped characters.</li> +<li> id 462159, 143250: Added support for parsing functions/methods returning a + pointer or reference to an array, e.g. a function of the + form: "int (*f(int))[];"</li> +<li> id 462436: Inheritance from an unknown template class was not handled consistently.</li> +<li> id 462439: Adjusted \author documentation.</li> +<li> id 462757: Fixed Latex output bug for members of anonymous struct or unions. </li> +<li> id 462861: Members references via tagfiles were sometimes broken.</li> +<li> id 463139: Doxygen failed to detect duplicate variable declarations in the same file.</li> +<li> id 465138: HTML entities in page title (such as ü) where not displayed + correctly in the HTML output.</li> +<li> id 465170: Wrong line numbers reported for errors when using multiline formulas.</li> +<li> id 465172: Fixed issues parsing <code>operator</code>.</li> +<li> id 466803: Fixed crash when parsing Java enum with empty field.</li> +<li> id 466890: Handling of CVS/RCS keywords was broken.</li> +<li> id 466910: When UML_LOOK is set to YES, the graph orientation is always top to bottom.</li> +<li> id 466991: Template argument using '?' operator breaks file generation.</li> +<li> id 468858,472310: C++ casting operator with templates was displayed wrong.</li> +<li> id 468937: .hhc and .hhk was missing the </body> and </html> tags.</li> +<li> id 469269: When HTML_DYNAMIC_SECTIONS was enabled, index.hhp missed + open.gif and closed.gif.</li> +<li> id 470029: Fixed crash while parsing a particular piece of PHP code.</li> +<li> id 471185: The word "property" was stripped from functions that started with it.</li> +<li> id 471495: Objective C category documentation was ignored in some cases.</li> +<li> id 472193: Fixed issue expanding multiple occurrences of the same alias command + argument.</li> +<li> id 472201: Removed spurious warning introduced by the fix for bug 465170.</li> +<li> id 473105: Auto link to nested class inside a base class was missing. </li> +<li> id 473140: Anonymous scope ended up wrongly in the XML output.</li> +<li> id 473402: context dependent \ref's inside a dot or msc graph did not work anymore.</li> +<li> id 473679: Doxygen skipped function if return type contained round parenthesis.</li> +<li> id 474529: index entries in LaTeX could be wrong on some platforms.</li> +<li> id 476035: Externally referenced links obtained via a tag file had an extra g in + the anchor</li> +<li> id 476562: argument of copydoc appears in XML output without proper escaping.</li> +<li> id 476766: Type of a virtual destructor was "virtual" in the XML output.</li> +<li> id 479113: Automatic links were not generated when next word started with "const".</li> +<li> id 479762: Wrong character encoding was used for dot files.</li> +<li> id 480722: File tooltips incorrect for the include dependency graph.</li> +<li> id 481168: Allow \f{environment}{ .... \f} so the number of braces matches.</li> +<li> id 481107: Using HTML_FILE_EXTENSION to set a non-default extension did not work + for the "no frames" link to main.html when GENERATE_TREEVIEW was enabled.</li> +<li> id 481827: Macro expansion removed the @ character when it appear in a C comment.</li> +<li> id 482964: The "template" word was a little too close to the rounded border in + the html output when rendered by Firefox.</li> +<li> id 484277: Adjusted the instructions to report a bug in the hope this will result + in less duplicate bugs.</li> +<li> id 484731: Fixed issue parsing unindented interface (Fortran).</li> +<li> id 486159: Fixed problem parsing \xrefitem commands in joined comment blocks.</li> +<li> id 488760: Added support for Trigraphs to doxygen's C-preprocessor.</li> +<li> id 488800: Fixed problem in perlmod generation.</li> +<li> id 488837: abstract class in PHP was not properly parsed.</li> +<li> id 489049: Setting MUTLILINE_CPP_IS_BRIEF to YES could cause wrong line number + references.</li> +<li> Call graphs were not properly synced between function declaration and definition.</li> +<li> Fixed bug in doxygen's internal caching mechanism which could make doxygen + forget enum lists for large projects. </li> +</ul> + +<h1>Doxygen Release 1.5.3</h1> +<b>(release date 27-7-2007)</b> +<a name="1.5.3"></a> +<h3>Changes</h3> +<ul> +<li> When <code>OPTIMIZE_OUTPUT_FOR_C</code> is enabled then a struct definition of the + form <code>typedef struct _S { ... } S_t</code> will be shown in the output as a + struct of type <code>S_t</code> and the typedef itself is omitted + (previousily <code>_S</code> was shown + as well as a typedef of the form <code>typedef _S S_t</code>). </li> +<li> Improved the line-breaking rules for members whose return types have many characters + (for example a function returning a pointer to a template class).</li> +<li> Multiple brief and detailed descriptions are now possible. It is still not + recommended to make use of them, but at least no documentation is silently hidden + when there are two brief or two detailed descriptions for the same entity.</li> +<li> Improved dot layout control and page sizing to better fit images on the screen + and paper.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for aliases with arguments, + see <a href="custcmd.html">the manual</a> + for more information.</li> +<li> Added <code>HTML_DYNAMIC_SECTIONS</code> option which, when enabled, + will produce sections + in the HTML output that can be expanded/collapsed. Currently used for + diagrams and graphs.</li> +<li> Added support for type constraints as available in the C# language ("where" clause)</li> +<li> id 332263: Added new option <code>EXTRACT_ANON_NSPACES</code> that when set to <code>YES</code> will extract + the contents of anonymous namespaces and show then in the output.</li> +<li> id 423765: Added support for <see cref="SomeSymbol"/> style XML comments. </li> +<li> id 426971: Added <code>QT_AUTOBRIEF</code> config option, which has the same meaning + as <code>JAVADOC_AUTOBRIEF</code> only now for /‍*! .. *‍/ style comment blocks.</li> +<li> id 435108: Reintroduced the <code>MAX_DOT_GRAPH_DEPTH</code> option as a means to further + reduce the size of a graph.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 137644: Fixed issue with "const" parsing of a typedef'ed struct where the "const" + is placed after the struct definition.</li> +<li> id 153362: A typedef of a function pointer was not shown correctly in the output.</li> +<li> id 156003: Wrong template arguments when using @related for a (template) function + with a template class.</li> +<li> id 170004: The check for PDF or DVI in the generated latex output + was not always reliable.</li> +<li> id 300022: PHP code with unknown extension was parsed as C/C++ code. Added a + detection rule for <?php to switch to PHP parsing.</li> +<li> id 317967: Setting <code>USE_PDFLATEX</code> to <code>YES</code> now generates a + Makefile with a "pdf" target, + to be consistent with the documentation.</li> +<li> id 397099: Fixed several cases where "referenced by" relation was unresolved.</li> +<li> id 423776: XML style see tag resulted in messed up documentation.</li> +<li> id 426852: \hideinitializer was sometimes ignored when using structural commands.</li> +<li> id 426977: Included a patch allow building under recent versions of Cygwin</li> +<li> id 427991: Doxygen failed to call mscgen.exe properly on Win32 platforms.</li> +<li> id 430962: struct keyword was stripped from typedefs even for C code.</li> +<li> id 431049: Fixed potential crash when <code>GENERATE_PERLMOD</code> was enabled.</li> +<li> id 431202, 333607: Quotes inside strings caused the Pythons parser to get off track.</li> +<li> id 431763: doxygen crashes when using unsupported tags in the config file.</li> +<li> id 432420: Last enum value of a Java 1.5 style enum with constructor did not appear.</li> +<li> id 432743: The "std" namespace appeared in the output when + <code>BUILTIN_STL_SUPPORT</code> was enabled.</li> +<li> id 432757: Setting <code>INLINE_INHERITED_MEMBERS</code> to <code>YES</code>, + did not inherit the group of grouped members of a base class.</li> +<li> id 433630: Using double-quotes (") inside a brief description could lead to + errors in dot files when the brief description was used as a tooltip.</li> +<li> id 434079: The number of graph nodes could still be too large despite a + conservative <code>DOT_GRAPH_MAX_NODES</code> setting.</li> +<li> id 436648: List of class members was no longer complete under certain conditions.</li> +<li> id 437218: Special characters in \brief string cause problems HTML/XML in source + listings.</li> +<li> id 438300: Fixed two cases where doxygen could access memory outside array + boundaries under certain conditions.</li> +<li> id 441114: Add support for <term> inside <list> to conform to + C# XML comments.</li> +<li> id 442313: Casing of special commands was not handled consistently.</li> +<li> id 443942: Fixed problems running mscgen.</li> +<li> id 444823: No newline after the error message when hhc failed with return code >0</li> +<li> id 445105: Fixed some issues and wrong spacing for the RTF generation.</li> +<li> id 446585: Doxygen could crash when producing a warning for undocumented C++/CLI + arguments of the type "T%".</li> +<li> id 447133: Replaced occurrences of ' by ' in the HTML output.</li> +<li> id 448210: Make rule to install manpages was broken.</li> +<li> id 451297: Fixed more issues where using double-quotes (") inside a brief + description could lead to errors in dot files when the brief + description was used as a tooltip.</li> +<li> id 452824: In the source browser linking of a local variable did not work + after a sizeof() of the variable.</li> +<li> id 452828: Missing reference to struct member in the source browser due to + incorrect bracket count.</li> +<li> id 453366: Removed bogus warning for unresolved references in brief descriptions. </li> +<li> id 453918: The __init__.py files were incorrectly treated as modules causing + scoping issues for symbols defined inside such file.</li> +<li> id 456471: Changing the installation location (--prefix) did not affect the + location were the documentation was installed. --docdir can still + be used to overrule the location for the documentation.</li> +<li> id 456475: Added support for C++/CLI style finalizers.</li> +<li> id 457857: Leading "struct" keyword is no longer stripped from the documentation of + functions that return a pointer to a struct.</li> +<li> id 458710: Expanding environment variables in the config file to a + file or path name with spaces (e.g. "$(VCInstallDir)include") was + incorrectly interpreted as a list when used with for instance <code>INPUT</code>.</li> +<li> id 458749: Undocumented constructors/destructors inside an undocumented member group + were not visible in the output.</li> +</ul> + +<h1>Doxygen Release 1.5.2</h1> +<b>(release date 4-4-2007)</b> +<a name="1.5.2"></a> +<h3>Changes</h3> +<ul> +<li> The options <code>MAX_DOT_GRAPH_WIDTH</code>, <code>MAX_DOT_GRAPH_HEIGHT</code>, and <code>MAX_DOT_GRAPH_DEPTH</code> have + been replaced by a single option <code>DOT_GRAPH_MAX_NODES</code>, which can be used to + limit the size of a graph indirectly, by specifying the maximum amount of nodes in + the graph. The main advantage is that this can be computed much faster; dot has + to be run only once per graph and never on graphs with more than the specified + amount of nodes. Note that doxygen will always render the root node and its + direct children even when <code>DOT_GRAPH_MAX_NODES = 0</code>.</li> +<li> Parameters names are now copied to reimplemented functions, avoiding warnings about + missing or wrong parameter names when <code>INHERIT_DOCS = YES</code>.</li> +</ul> +<h3>New features</h3> +<ul> +<li> id 150916,159291,166209,330109,396316 + Doxygen now uses UTF-8 internally for all strings and uses + iconv to recode the input to UTF-8. For HTML, LaTeX and man pages + the output is now always UTF-8. For RTF the encoding is local and + depends on the code page specified in the translator. + The config option <code>USE_WINDOWS_ENCODING</code> has been removed. + A new config option <code>INPUT_ENCODING</code> has been added which can be used to + specify the encoding of the input. Another config option <code>DOXYFILE_ENCODING</code> + can be used to specify the encoding of the config file itself.</li> +<li> Added support for message sequence charts (using mscgen). + For this two new commands have been added: \msc and \endmsc (similar + to \dot..\enddot), and a new config option <code>MSCGEN_PATH</code> (similar to DOT_PATH) + See the manual and <a href="http://www.mcternan.me.uk/mscgen/index.html">website</a> for more info.</li> +<li> Added support for C++/CLI. To enable it set <code>CPP_CLI_SUPPORT</code> to <code>YES</code> in the + config file (thanks to Ben Voigt for doing a lot of the work).</li> +<li> <code>IGNORE_PREFIX</code> now also works for function/members names when shown in the various + indices.</li> +<li> Doxygen will show a tooltip in the HTML output for links to classes, namespaces, + and members with the brief description (including dot graphs and source code).</li> +<li> id 321575: Added a new config option <code>EXCLUDE_SYMBOLS</code> which can be used to + exclude certain namespaces/classes/functions from the output by specifying + their name (which may include wildcards).</li> +<li> id 364536: Included patch by Ben Voigt which adds syntax highlight + support for several (managed) C++ keywords.</li> +<li> id 419349: Added two LaTeX layout enhancements provided by Stefan Pawig. </li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 132886: Included patch to fix an issue with using a sequence of xrefitems</li> +<li> id 134792: Added configure script for Cygwin autodetection.</li> +<li> id 162006: Doxygen now uses the default search path of dot for user defined + dot graphs (defined with @dot and @dotfile).</li> +<li> id 306231: Include fix for Japanese translation.</li> +<li> id 315543: htmlinclude didn't work as part of a description of a param.</li> +<li> id 322806: Doxygen now does not treat >> in a template list as a shift operator + for Java and C#.</li> +<li> id 332815: Legend generated with <code>GENERATE_LEGEND</code> did have typo.</li> +<li> id 345820: Included patch to make doxygen handle config files with + <code>@INCLUDE</code> with absolute paths correctly.</li> +<li> id 364780: Included patch to improve scope handling of nested classes/namespaces by + the code parser (thanks to Ben Voigt).</li> +<li> id 366113: Fixed configure script issue under Solaris.</li> +<li> id 367233: Non-class functions were duplicated in the xml index file.</li> +<li> id 367495: Windows build files had only support for English by default.</li> +<li> id 369499: In some cases variable names were duplicated in python source code output.</li> +<li> id 369200: Fixed parse problem when a single quote appeared in a Python comment line.</li> +<li> id 373229: Doxygen now gives a warning when it cannot inline a #include inside a body </li> +<li> id 374486: Inheriting from a template argument via an intermediate typedef could + result in invalid output.</li> +<li> id 375073: \ref could cause wrong XML output.</li> +<li> id 375753: Added missing new line to error message.</li> +<li> id 377911: Fixed problem with end of formula.</li> +<li> id 380516: Fixed line number issue in the Python parser.</li> +<li> id 381450: Tabs in the HTML output redefined the value of an "id" attribute, + which is not legal HTML.</li> +<li> id 374592: Member grouping didn't work properly for constructors.</li> +<li> id 381608: Initializer values of class variables and constants did no longer + appear in the documentations.</li> +<li> id 382274: Scanning files with <code>RECURSIVE</code> enabled ignored <code>EXCLUDE_PATTERNS</code>.</li> +<li> id 383377: C# code was not passed though the C-preprocessor.</li> +<li> id 383493: Improved the warning message for unterminated code/verbatim blocks.</li> +<li> id 384439: Made comment block parser more robust against HTML errors.</li> +<li> id 385384: <code>SEPARATE_MEMBER_PAGES=YES</code> caused broken links in Html Help index.</li> +<li> id 387781: Parsing #import statements was broken for Objective-C.</li> +<li> id 387848: Included patch to avoid LaTeX compilation issues.</li> +<li> id 389656: For C# enums in the same scope can have the same values, but doxygen's + parser got confused.</li> +<li> id 389750: Fixed alignment bug in the default html footer generated by doxygen.</li> +<li> id 390821: Fixed problem parsing Java 1.5 enums with initializers.</li> +<li> id 391619: When dot produces an non-zero return code, doxygen now prints the + return code and the command it tried to execute.</li> +<li> id 407815: Doxygen's got confused by certain combinations of " and ' s in PHP code.</li> +<li> id 409935: Fixed bug in qcstring.cpp</li> +<li> id 411300: PDF/Latex output was broken for operator[] documentation.</li> +<li> id 411328: Fixed Accessibility/Section 508 Compliance issue.</li> +<li> id 413071: Added support for Java 1.5 annotations.</li> +<li> id 415683: Two typedefs of function pointers with different names could still + resolve to the same type if the only difference was the argument list + and as a result cause "Undocumented function" warnings.</li> +<li> id 418920: Doxygen stripped leading comment chars from C# code blocks.</li> +<li> id 421131: Character encoding was not consistent for all HTML files.</li> +<li> The "list of all members" was not shown for a class with no members that derived + from a class with members.</li> +</ul> + +<h1>Doxygen Release 1.5.1</h1> +<b>(release date 29-10-2006)</b> +<a name="1.5.1"></a> +<h3>Bug fixes</h3> +<ul> +<li> id 148567: @todo at the end of a comment block caused problem when copied by @copydoc</li> +<li> id 352420: Fixed bug in LaTeX output (missing space after \bf).</li> +<li> id 363227: missing output for instance variables defined in a Python function + that has a doc string</li> +<li> id 363397: Member groups did not appear in a class when SUBGROUPING was set to YES.</li> +<li> id 364341: Parsing could become really slow if often included header files contained + using statements.</li> +<li> id 364673: The values of two enums with the same name (both in difference scopes) + where merged.</li> +<li> The version of dot shipped with the Mac binary had some non-standard dependencies.</li> +<li> Doxywizard didn't work on PC's where no Visual Studio 2005 was present, when build + with the project files (I'm now using /MT instead of /MD which fixes this issue). </li> +<li> Running 2 instances of doxygen on the same output directory caused corruption of + the temporary files generated by doxygen.</li> +</ul> + +<h1>Doxygen Release 1.5.0</h1> +<b>(release date 16-10-2006)</b> +<a name="1.5.0"></a> +<h3>Changes</h3> +<ul> +<li> cleaned up the internal structures to make them smaller, and made doxygen use + a temporary file to store the parse results (instead of keeping them in memory), + which will further reduce the memory usage, especially for large projects, and is a + first step towards incremental parsing.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added example application that shows how to configure and run doxygen from + within an application and use the information collected by doxygen without + also generating the output (see addon/doxyapp).</li> +<li> id 322467: Sections produces by \note, \warning, \remarks etc, now have a + class label in the generated HTML (<dl> tag) so you can give them a + distinct style using a non-default stylesheet (i.e. using HTML_STYLESHEET). </li> +<li> Added project files for building doxygen from Visual Studio 2005 (see winbuild dir). </li> +<li> added translator updates for Czech, Danish, German, Catalan, Croatian, French, + Japanese, and Italian.</li> +<li> added translator support for Arabic (thanks to Moaz Reyad)</li> +<li> added translator support for Persian (thanks to Ali Nadalizadeh)</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 131445: Fixed autolinking for related functions.</li> +<li> id 137236: Updated documentation to make it clear that a lower-case only word + is not a candidate for autolinking.</li> +<li> id 141758: Fixed a problem parsing <?=...?> contructs outside of functions in PHP.</li> +<li> id 319169: Second level index not shown when DISABLE_INDEX=YES.</li> +<li> id 325337: Added "optimize output for C#" option to Doxywizard.</li> +<li> id 325426: Partial C# class inside a namespace where not handled properly.</li> +<li> id 327358: Fixed wrong link to the search engine when CREATE_SUBDIRS was set to YES.</li> +<li> id 326885: Leading ///'s ended up in code fragments when using indented + /// comments.</li> +<li> id 330513: For file documentation, the scope not stripped for namespace members + even if HIDE_SCOPE_NAMES was set to YES.</li> +<li> id 335131: Fixed "internal inconsistency" warning related to use of nested + classes defined outside a used namespace.</li> +<li> id 338475: Added support for Q_SIGNALS and Q_SLOTS macros (thanks to Thomas + Zander for the patch). </li> +<li> id 340973: Improved performance of "Computing template instances" step + significantly in case of (large) Java projects.</li> +<li> id 342090: Fixed missing cross-reference to "m" for code of the form f(a[s.f]->m) </li> +<li> id 344443: Code font commands where not treated properly in C# style comments.</li> +<li> id 344445: Made it more clear in the documentation where the XML commands in the + comment blocks are for, and how <code> works in C#.</li> +<li> id 345322: DOTFONTPATH was corrupted in mingw builds.</li> +<li> id 345519: Fixed problem parsing attributes in C#.</li> +<li> id 345660: Python class members that spanned multiple lines could confuse the parser.</li> +<li> id 345742: enum values were shown twice in some cases.</li> +<li> is 346095: Forced a newline before \normalsize in the LaTeX to avoid + font size issues.</li> +<li> id 346848: Under certain conditions nesting of groups did not work properly.</li> +<li> id 347444: paramref XML command did not render properly.</li> +<li> id 348259: Doxygen now keeps the _formulas.log file when there is a problem + generating bitmaps for formulas. This can help to identify the problem quicker.</li> +<li> id 348481: friend class in unnamed namespace produced bogus error.</li> +<li> id 348537: Fixed internal inconsistency warning that could occur when reopening + an anonymous namespace </li> +<li> id 349867: Fixed issue handling brief and detailed description when + both are positioned after an item. </li> +<li> id 350168: Doxygen didn't parse C# type contraints properly.</li> +<li> id 351890: In some cases C# attributes were treated as properties.</li> +<li> id 353044: C99 style variadic macros were not handled properly by doxygen.</li> +<li> id 353195: Member grouping with SUBGROUPING = YES now works the same for files + and namespaces as it does for classes.</li> +<li> id 354765: A command like \ingroup now ends a brief description as was the case + in the pre 1.4.x series.</li> +<li> id 355922: When a function was found in a namespace but also in the global + namespace, doxygen could make the wrong cross-reference.</li> +<li> id 356204: Setting HIDE_UNDOC_RELATIONS to NO could result in + argument mismatches in certain cases.</li> +<li> id 357092: Spurious doxygen warning when using a class that ends with 'const' + or 'volatile'.</li> +<li> id 357438: tabs and newlines were not parsed properly for html attributes inside + a comment block.</li> +<li> id 357646: objcache.cpp did not compile cleanly on a system with 64 bit pointers.</li> +<li> id 361812: whitespace after the colon at the end of a Python definition caused + parsing issues.</li> +<li> "struct Foo operator+()" was not parsed properly due to the "struct" keyword.</li> +<li> As a side-effect of bug 329861 Obj-C protocols and categories were no longer + extracted. </li> +<li> Fixed an problem with cross-referencing Obj-C code.</li> +<li> Removed the memory leaks reported by valgrind and tuned some data structures + to reduce the memory usage.</li> +<li> enums in a used namespace could cause arguments not to match.</li> +<li> fixed several cases where arguments of function/method declaration and definition + did not match while they should.</li> +</ul> +<p> +\endhtmlonly +\section log_1_4 1.4 Series +\htmlonly +</p> +<h1>Doxygen Release 1.4.7</h1> +<b>(release date 11-06-2006)</b> +<a name="1.4.7"></a> +<h3>Changes</h3> +<ul> +<li> The stylesheet has changed, so if you use your own, you will need to + update it or the output will look ugly.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for universal binaries on MacOSX (only the non-GUI part).</li> +<li> Added CALLER_GRAPH config option and \callergraph command to add + a caller (or called-by) graph to a function or all functions. + (thanks to Daniel Sherwood for the patch)</li> +<li> Added REFERENCES_LINK_SOURCE config option which allows to selected + if reference relations should point to the source or to the + documentation (thanks to Daniel Sherwood for the patch).</li> +<li> Included patch by Christoph Pesch to mention the member type in the + warning "Member ... of ... is not documented".</li> +<li> included update for Spanish, Italian, Norwegian, and Czech translations.</li> +<li> Added support for get/set properties in IDL (thanks to a patch by + Sander Stoks).</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 151959: incremental "using" of nested namespaces could prevent + that doxygen matched function declaration against definition.</li> +<li> id 310521: HIDE_IN_BODY_DOCS was longer working.</li> +<li> id 315039: Improved handling of members in an anonymous scope. </li> +<li> id 322415: Under certain conditions a scrollbar appeared in a HTML page + while this was not needed.</li> +<li> id 325845: Documentation parser was confused when starting a HTML list + directly after a \b command.</li> +<li> id 325866: SORT_BY_SCOPE_NAME=YES did not always work if SORT_BRIEF_DOCS + was also enabled.</li> +<li> id 326023: CHM files had @ signs in CHM index for anonymous class enums</li> +<li> id 326250: Fixed incorrect regular expression in constexp.l</li> +<li> id 326688: Added better support for PHP5 style constructors + and destructors.</li> +<li> id 326885: Using multi-line //!-blocks did not work nicely together with + @code...@endcode blocks anymore.</li> +<li> id 327242: Python: Methods starting with _ are now marked private, + except for special method names (i.e. starting and ending with __).</li> +<li> id 327666: Fixed parse issue that resulted in a missing call graph.</li> +<li> id 328435: When enabling USE_PDFLATEX a blank line appeared in the + makefile</li> +<li> id 328849: Added clarification to the manual about the use of //!< + comments.</li> +<li> id 328635: Text of the HTML output didn't always wrap properly anymore + after "fixing" bug 322415.</li> +<li> id 329343: Fixed segment in Python parser caused by @var or @fn with + a missing argument.</li> +<li> id 329530: An apostrophe in ##-comments inside a Python class confused + the parser.</li> +<li> id 329534: Fixed problem resolving inheritance relations for nested + Python classes.</li> +<li> id 329537: Corrected the Python example to show how modules should be + documented.</li> +<li> id 329719: # comment in PHP containing a ' caused doxygen to ignore + rest of input.</li> +<li> id 329861: Fixed problem parsing embedded structs in an Objective-C + interface.</li> +<li> id 329905: PDF manual produced a LaTeX error because style sheet + was not up to date.</li> +<li> id 330209: A typedef in an Obj-C implementation file could obscure + class implementation later in the file</li> +<li> id 331511: no matching class member found error for class template + instance in combination with "using" of said class.</li> +<li> id 331751: Fixed problem parsing a function typedef.</li> +<li> id 332110: method matching failed for equivalent template instance + types.</li> +<li> id 332178: Fixed malformed XML output for readable properties.</li> +<li> id 333270: Fixed BoundingBox problem with PostScript graphs generated + with dot using graphviz-2.9.20060302.0540 and later (thanks to + John Ellison for the patch)</li> +<li> id 332875: Enabling SEPARATE_MEMBER_PAGES could lead to bogus warning + messages about undocumented parameters if only the HTML output was + enabled.</li> +<li> id 333330: Patch the reorganizes the treeview.</li> +<li> id 333831: "typedef const struct { } NAME" construction was not + properly parsed.</li> +<li> id 334716: Doxygen could hang when calling latex with invalid formulas.</li> +<li> id 336467: Latex formula could prevent /// comment blocks to be properly + converted to /** */ blocks.</li> +<li> id 336782: Prevented crash when providing code with illegal/redundant + class scope.</li> +<li> id 337344: Configure now accept system's /usr/bin/install on FreeBSD.</li> +<li> id 341365: @endcode comment was skipped in a specific case.</li> +<li> id 341453: Under certain conditions @cond did not stop at @endcond</li> +<li> id 341456: Fixed crash when feeding doxygen /dev/null as config file</li> +<li> id 342329: Text such as "dir/file.cpp" was not auto-linked.</li> +<li> id 342946: Anonymous enums couldn't be grouped using separate @var block</li> +<li> id 344118: Inbody documentation could hide the detailed description.</li> +<li> id 344172: Class Hierarchy appeared in a C-Code-Documentation.</li> +<li> Protection level of inner classes was not written to the XML output + (thanks to Shachar Itzhaky for the patch)</li> +<li> Included patch by Ernst Giessmann, which prevents most of the underfull + hbox warnings that are produced when compiling doxygen's LaTeX output.</li> +<li> Fixed potential crash during preprocessing if C-macros are defined + with /* (thanks to Günther Haslauer for the patch).</li> +<li> Anonymous struct members could end up in the wrong scope + (thanks to Bruno Andrillon for the patch).</li> +<li> saving to an existing file in doxywizard now requires a confirmation.</li> +<li> Fixed potential crash in case a template class with a redundant + namespace qualifier was used: + e.g. "namespace N { template<> class N::C<G::H> {}; }"</li> +</ul> + +<h1>Doxygen Release 1.4.6</h1> +<b>(release date 30-12-2005)</b> +<a name="1.4.6"></a> +<h3>New features</h3> +<ul> +<li> id 317773: Improved .spec file and better support for building rpms + (thanks to Kevin McBride)</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 145294: Boolean expression with '<' as template argument confused + doxygen.</li> +<li> id 303297: The class hierarchy was sometimes incorrectly shown.</li> +<li> id 317819: Updated the documentation concerning the creation of PDF + output.</li> +<li> id 317967: @‍htmlonly..@‍endhtmlonly type of blocks (including formulas) + were not always working properly if used in inline parameter + documentation.</li> +<li> id 318008: The base class name was missing from the XML output.</li> +<li> id 318208: Enabling SUBDIRS resulted in the tabs at the top of certain + pages not be styled as tabs. Also, links to include dependency graphs + had wrong links or were incomplete.</li> +<li> id 318564: Python: parser skipped comment blocks in some cases.</li> +<li> id 318565: Python: single quote doc strings did not get parsed properly + if there was no space before the closing '''.</li> +<li> id 318567: Python: parse problem when () appear in default value of a + function parameter.</li> +<li> id 318618: If INLINE_INHERITED_MEMB = YES constructors of a + template class were shown in the derived class.</li> +<li> id 318678: Python: A referenced variable that + was not found using docstring could lead to memory corruption.</li> +<li> id 319170: The CHM file did not include the stylesheet material needed + to properly render the tabs at the top of each page.</li> +<li> id 319341: Doxygen crashed while generating call graph under certain + circumstances.</li> +<li> id 319539: Fixed parse problem with Python/Objective-C code.</li> +<li> id 319586: tabs.css not correctly included with CREATE_SUBDIRS option + set.</li> +<li> id 318460: Multiply-defined labels if two function specializations + differ only on the name of a template parameter.</li> +<li> id 319219: Spurious space was inserted after inlined math formulae.</li> +<li> id 319826: The file name for template classes could become too + long causing files that cannot be created by some file systems.</li> +<li> id 320026: undocumented "typedef struct foo baz" causes subsequent + variables appear as typedefs.</li> +<li> id 320543: If enabled the alphabetical class list is now the default + item under the classes tab.</li> +<li> id 320587: Links in brief file descriptions shown in directory pages + were broken if CREATE_SUBDIRS was enabled.</li> +<li> id 320693: First sentence in mainpage was missing with + JAVADOC_AUTOBRIEF enabled.</li> +<li> id 320740: Added support for documenting individual elements of an + associative array in PHP.</li> +<li> id 320813: The if() statement with space after the if confused the + code parser and resulted in partial call graphs.</li> +<li> id 320960: redundant line continuation characters were not removed + by doxygen's C-preprocessor.</li> +<li> id 321165: Doxygen choked on Qt properties with namespaced types</li> +<li> id 321197: using a namespace that contains a nested class, where the + inner class was forward defined, could introduce a bogus namespace + with the name of the outer class.</li> +<li> id 321256: Installation path mentioned in the documentation was wrong.</li> +<li> id 321349: In typedefs like "typedef struct {} T, *pT, the pT typedef + appeared wrongly in the documentation.</li> +<li> id 321540: An array of type an anonymous struct was not parsed + properly if there was a space between the name and the size, i.e. + struct {} Var [10];</li> +<li> id 321682: Fixed typo in the HTML output of the search page.</li> +<li> id 321743: Cross-references were missing to members of + anonymous structs.</li> +<li> id 311833: A template specialization of a private class member was + marked as public.</li> +<li> id 312329: @link label @endlink, i.e without link text now shows + the label as text, and space after label is omitted.</li> +<li> id 312624: \verbatim block could cause wrong line numbers while + parsing the source code.</li> +<li> id 322752: Fixed specific case where aliases were incorrectly expanded + inside environment formulas</li> +<li> id 322997: Putting function-style macros in a parameter of a + template return type of a function confused doxygen's parser.</li> +<li> id 323320: An enum name that also appears as a typedef + (i.e. typedef T {} T; }) is now linked as an enum and the typedef is + omitted from the output.</li> +<li> id 323557: Bit field information was missing from the XML output.</li> +<li> id 323627: Fixed compiler warning when using gcc 4.x.</li> +<li> id 323628: Improved warning when documenting #defines while the + preprocessor is disabled.</li> +<li> id 323988: FILE_VERSION_FILTER incorrectly handled command parameters</li> +<li> id 324076: Fixed some typos in the documentation.</li> +<li> id 324153: The configure script didn't work for SunOS 5.8.</li> +<li> id 324163: \todo paragraph did not end at \author (or similar commands).</li> +<li> id 324313: Added support for having a Linux system where libraries are + located in lib64 by adding a new platform to tmake: linux-64</li> +<li> id 324521: Autolinking to classes in a group which itself was in a + namespace didn't work without explicit scoping.</li> +<li> id 324558: Null pointer dereference in namespacedef.cpp</li> +<li> id 324565: References and callgraphs missing for some functions + (thanks to a patch by Dave Dodge).</li> +<li> id 324566: Fixed problem matching + f(unsigned long const a) against f(unsigned long)</li> +<li> id 324568: Fixed problem were some function prototypes were detected + as variable constructor calls (thanks to Dave Dodge for the patch).</li> +<li> id 324601: Cross referencing and call graphs were broken by + certain bracket positions for functions.</li> +<li> id 324823: Doxygen's code parser lost track in some cases, causing + function definitions not being found in some cases.</li> +<li> id 324891: Doxygen crashed on circular python imports.</li> +</ul> +<h1>Doxygen Release 1.4.5</h1> +<b>(release date 4-10-2005)</b> +<a name="1.4.5"></a> +<h3>Changes</h3> +<ul> +<li> Changed to way the index looks (I hope you like it!). + It now is a list of items styled (with CSS) as a row of tabs. + Also class/namespace/file related items are now grouped together and + presented as a second row of tabs to prevent clutter (the latter is + based on the suggestions/patch in bug report 162968). + Note that if you use a custom HTML header you need to add + <link href="tabs.css" rel="stylesheet" type="text/css"> + to the head section!</li> +<li> Copydoc now copies the brief description as well.</li> +</ul> +<h3>New features</h3> +<ul> +<li> id 306889: Added new config option BUILTIN_STL_SUPPORT. When enabled, + doxygen will assume that STL classes exist (without the need to include + the STL headers as INPUT). + This helps with matching of argument lists for function declarations and + definitions and also helps to improve the collaboration and inheritance + diagrams that involve STL classes.</li> +<li> id 317010: Added support for the following new HTML entities: + &lsquo; &rsquo; &ldquo; &rdquo; &ndash; + &mdash; (thanks to a patch by madalexonline)</li> +<li> Included update for Chinese translation.</li> +<li> included update for the VC++ project files (in wintools dir), thanks + to Johan Eriksson.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 304339: Using \dot in latex formulas conflicted with the doxygen's + \dot command.</li> +<li> id 306076: Using a namespace inside an example listed with + @example did not work.</li> +<li> id 306069: Search engine required lower case names in order to find + something, which made pasting of names difficult.</li> +<li> id 308395: Doxygen could crash when producing a warning that included + a %s sequence.</li> +<li> id 311191: Default values for parameters weren't shown in the detailed + documentation.</li> +<li> id 311198: If JAVADOC_AUTOBRIEF was set to YES, a \todo or \bug like + command always ended at the first dot.</li> +<li> id 311207: The /* and */ inside a \code ... \endcode code fragment + were stipped.</li> +<li> id 311577: Putting a documentated class name in the title of the main + page caused a LaTeX error if pdf hyperlinks were enabled.</li> +<li> id 311665: Fixed compile issue for Solaris.</li> +<li> id 312688: Typedefs of arrays were auto-linked to the base type + i.s.o the typedef.</li> +<li> id 312678: Fixed excessive memory usage for @fn commands + due to a memory leak of the scanner buffer 256K of memory was leaked + for each command!</li> +<li> id 312791: Undocumentated members did not result in warnings if + SOURCE_BROWSER was enable and the member's definition was part of + the INPUT.</li> +<li> A C-comment inside a \code block could lead to parse problems in the + preprocessor, resulting in #defines that are not found.</li> +<li> Fixed problem documenting Python code using docstrings where the module + documentation was not picked up. Also fixed several other Python + related issues. Also included Python examples in the documentation.</li> +<li> id 312805: Using BUILTIN_STL_SUPPORT could result in dead links for + STL classes.</li> +<li> id 312807: Added support for STL exceptions (when BUILTIN_STL_SUPPORT + is enabled).</li> +<li> id 313011: Item after the closing of a nested group was ignored in + some cases.</li> +<li> id 313103: Member groups within other nested groups did not work + anymore.</li> +<li> id 313298: Code parser didn't handle function-try-blocks correctly.</li> +<li> id 313572: Fixed lockup issue when generation code for Python files.</li> +<li> id 313695: Fixed parsing issues for the constructs + "\f$n\f$" and "operator <CODE>". </li> +<li> id 313805: '@' characters in a string literal were lost during + macro expansion.</li> +<li> id 313906: added support for "import" and "from ... import" to the + Python parser so cross module inheritance works.</li> +<li> id 313908: Fixed python parser problem: If there are two classes + defined in one module there needed to be a comment between them.</li> +<li> id 314165: Python functions starting with _ are not marked as public, + whereas variables starting with _ are marked private.</li> +<li> id 314194: Brief description containing 'i.e., ' ended after the + comma.</li> +<li> id 314237: You can now also use \ref on directories documented with + \dir.</li> +<li> id 314288: Using \ref with an ambiguous filename didn't work.</li> +<li> id 315006: C++ comments at the start of a line and + inside a <pre>..</pre> block were stripped.</li> +<li> id 316264: Fixed typo in the inline config file documentation.</li> +<li> id 316266: Included update for the Japanese translation (thanks to + Katsuhiro Hermit Endo)</li> +<li> id 316759: Fixed problem in the Makefile of doxywizard so that the + right version appears in the about box.</li> +<li> id 316944: An inline formula (or other special command) did not get + executed if it was within an inline documentation block and + put after a parameter.</li> +<li> id 317052: The alphabetical class index was not sorted properly if + multiple prefixes were specified using IGNORE_PREFIX. </li> +<li> id 317105: Latex output expanded &szlig; as "s instead of {\ss} which + only worked if german.sty was included. Thanks to Stefan Pawig for the + patch)</li> +<li> id 317397: Copying of images from subdirectory within the IMAGE_PATH + didn't work properly since doxygen didn't remove the subdirectory + from the destination path.</li> +<li> id 317446: Documenting an enum with \enum while there is also a function + with the same name in the same scope could make the enum documentation + appear at the wrong spot or the enum in the wrong member group.</li> +<li> id 317490: A variable of a nested class, forward declared in a template + class, which in turn was in a namespace, caused the variable to end + up in the global scope. </li> + +</ul> + +<h1>Doxygen Release 1.4.4</h1> +<b>(release date 21-7-2005)</b> +<a name="1.4.4"></a> +<h3>New features</h3> +<ul> +<li> Added support for parsing Python code. + Special comment blocks in Python are of the + <pre> + ## + # Some comment + # + </pre> + or you can rely on Python docstrings. + This code uses the new parser interface and was based on the work done + by a group of students as part of a compiler design project.</li> +<li> Added support for C# style XML tags in the comments. + See the manual or the C# language specification for more details. + Thanks to Talin for doing most of the work.</li> +<li> Added support for the JavaDoc command {@inheritDoc}.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 166254: SORT_BY_SCOPE_NAME didn't work anymore.</li> +<li> id 304380: New argument matching algorithm didn't handle the case + where "const int" needed to be matched against + "const int a" correctly.</li> +<li> id 304435: Superfluous backslash in the makefile caused problems for + Japanese locale.</li> +<li> id 304476: A #define directly after a //!< style comment block was not + parsed properly.</li> +<li> id 304598: Using operator-- in resulted in broken HTML output due to the + embedded doxytag that include the end of a HTML comment.</li> +<li> id 304623: Spreading a @fn command over multiple lines didn't work + anymore without using line-contination characters.</li> +<li> id 304666: Attributes of the same class appeared separated with \n in + collaboration diagrams</li> +<li> id 304751: A define "foo()" was indisguishable from a define "foo" in + the XML output.</li> +<li> id 304752: XML location tag attribute "file" could have the + syntactially wrong value "<generated>" in some cases.</li> +<li> id 305334: INPUT_FILTER tag did not work properly anymore due to + additional quotes.</li> +<li> id 305364: Improved argument matching routine to avoid cases where + declaration and definition of functions/methods could not + be matched.</li> +<li> id 305439: @link command did not work if the link text started with + "const" as part of a longer word. </li> +<li> id 305638: operator& was only usable with @copydoc if the method was + fully qualified.</li> +<li> id 305672: Title of a paragraph was not properly rendered for the + RTF output when using \par in ALIASES.</li> +<li> id 305740: When putting a \b command in a HTML table cell, doxygen got + confused by the cell end tag, causing the rest of the table + to be displayed wrongly.</li> +<li> id 305768: @todo, @bug, @deprecated, etc, did not always end at the + next paragraph.</li> +<li> id 305770: For overloaded global functions only the first appeared + in the file documentation.</li> +<li> id 306028: The text after /*@{ and //@{ was treated as source code + instead of a comment block.</li> +<li> id 306136: Structural commands were executed even though they appeared + within quoted text.</li> +<li> id 306200: Putting a command like \author before \brief caused the + long description to be glued to the \author command.</li> +<li> id 306235: Punctuation is not automatically added to brief + descriptions for Japanese, Chinese, and Korean anymore. </li> +<li> id 306637: @endcond did not properly end a conditional section + when @cond was used without label.</li> +<li> id 306711: Brief descriptions ended at a new paragraph even if no + content was found and @name didn't work without explicit + @{ ... @} block commands.</li> +<li> id 306851: Under certain conditions bogus argument documentation could + appear.</li> +<li> id 306943: Certain constructs could get the code parser off track and + could lead to memory corruption.</li> +<li> id 307579: Fixed argument matching problem where "unsigned int" + did not match "unsigned int i".</li> +<li> id 307613: Documented struct fields declared as a comma separated list + caused the documentation of all fields to be appended.</li> +<li> id 307618: Reference in the source file did not appear if a variable was + documented with \var and also had a brief description.</li> +<li> id 307954: Parse problem when a /* was nested inside a C-style comment.</li> +<li> id 308053: It is now possible to put multiple structural commands into + a single comment block. Doxygen will treat them as + separate comment blocks internally. Example: + <pre> + /** @file + * File documentation. + * @defgroup grp A Group + * Group documentation. + */ + </pre></li> +<li> id 308059: &nbsp; was written as "\ " to the LaTeX output instead + of ~.</li> +<li> id 308400: The parameter names are now used based on whether the + documentation is in front of the declaration or definition.</li> +<li> id 309022: Conversion operators inherited from a template class + did not appear with the proper type substitution.</li> +<li> id 309148: The search index page was not correct if DISABLE_INDEX was + set to YES.</li> +<li> id 309446: Files beginning with one or more digits were not autolinked.</li> +<li> id 309461: Made the configure script look for qt in places like + /usr/share/qt3 (debian) and /usr/qt/3/ (gentoo)</li> +<li> id 309711: Aliases were expanded inside formulas.</li> +<li> id 310012: Made the allowed suffixes for constants in the constant + expression evaluator of the C-preprocessor more strict.</li> +<li> id 310025: Added explicit type conversion to avoid problems with + compiler bugs in Sun's Forte 6.1 and Studio 10 compiler.</li> +<li> Fixed argument matching issue exposed by the template example in the + examples directory.</li> +</ul> + +<h1>Doxygen Release 1.4.3</h1> +<b>(release date 16-5-2005)</b> +<a name="1.4.3"></a> +<h3>Changes</h3> +<ul> +<li> For Developers: Added an abstract interface for language parsers + (see src/parserintf.h), which can be used implement new programming + language parsers. There is also a manager class, where a parser + instance can be bound to a certain file extension.</li> +<li> Changed the algorithm for matching function/method declarations against + their definitions. The new algorithm should be faster, more powerful, + and more accurate.</li> +</ul> + +<h3>New features</h3> +<ul> +<li> Included new config option HTAGS. When enabled in combination with + SOURCE_BROWSER=YES, the source browser of GNU's Global source + system (via htags) is used instead of doxygen's own (thanks to + Shigio Yamaguchi for the patch).</li> +<li> Added language updates for Indonesian, Catalan, Russian, Korean, + German, Hungarian, Polish, and Lithuanian.</li> +<li> Included update of the .spec file (thanks to Stephane Gourichon).</li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li> id 163705: Using \image for latex without caption but with size + parameter "width=\textwidth" did not work.</li> +<li> id 163783: Items of an autolist could be wrongly indented if put + directly after @name.</li> +<li> id 163928: Class section was missing in the file documentation.</li> +<li> id 164072: When using tag files unneeded external + classes could appear in the class hierarchy in some cases.</li> +<li> id 169755: page title was omitted in the XML output if + CASE_SENSE_NAME was set to NO.</li> +<li> id 170592: Using \ref for Objective-C methods did not work if the + name contained a colon.</li> +<li> id 171795: Refering to Objective-C methods now follows Apple's + conventions. </li> +<li> id 171878: When JAVADOC_AUTOBRIEF = YES and there was no blank line + after a page command, the first sentence did not appear in + the documentation.</li> +<li> id 171923: Doxygen failed to match arguments for a function documentated + out-of-line with @fn and using @relatesalso.</li> +<li> id 172118: Doxywizard now shows the version of doxygen it is for.</li> +<li> id 172133: Doxygen did not longer ignore preceding C++ comments inside a + comment block.</li> +<li> id 172217: 'using namespace' declarations with spaces resulted + in duplicate namespaces.</li> +<li> id 172329: The index of the CHM did not always link to groups correctly.</li> +<li> id 172456: Fixed case where doxygen had problems differentiating const + and non-const member functions.</li> +<li> id 172494: @code blocks were not poperly ignored by the preprocessor + in some cases.</li> +<li> id 172622: Fixed parse problem for Objective-C method implementations + whole declaration part ended with a semicolon.</li> +<li> id 172723: Namespace members appeared in the file documentation without + proper links to the namespace.</li> +<li> id 172778: A single colon after retval caused a crash.</li> +<li> id 172783: Doxygen will now put quotes around a filter name before + calling it so it will work with filters with spaces in the + name or path.</li> +<li> id 172818: Improved translation of Todo List to German.</li> +<li> id 172937: FILE_VERSION_FILTER failed for filenames containing spaces.</li> +<li> id 173034: The \elseif command was not handled properly.</li> +<li> id 173110: \ingroup did not work with multiple group labels anymore.</li> +<li> id 300204: Doxygen disobeyed Cygwin's 'text/binary mount mode' + (thanks to Max Bowsher for the patch).</li> +<li> id 300466: Improved the documentation for FILTER_SOURCE_FILES.</li> +<li> is 300473: Added a browse button for several of Doxywizard's + fields of the expert dialog where a file was expected.</li> +<li> id 300532: consecutive @todo items were joined together even if they + are in different sections.</li> +<li> id 300745: A disabled @cond section did not omit #define documentation.</li> +<li> is 301409: autolinks to undocumented files did not work correctly when + SOURCE_BROWSER was enabled.</li> +<li> id 301437: Fixed a typo in an example that is part of the preprocessor + documentation.</li> +<li> id 301478: Fixed some cases where cross-references were not properly + detected anymore.</li> +<li> id 301616: Added "+" or "-" to the Objective-C method lists in the + summary section of a class.</li> +<li> id 302100: An enum could not be grouped by grouping out of line + documentation.</li> +<li> id 302158: When enabling SEPARATE_MEMBER_PAGES and CREATE_SUBDIRS + the member index contained invalid links.</li> +<li> id 302160: list directly after @brief not parsed properly if there + were spaces before the @brief command.</li> +<li> id 302713: Updated doxytag so it works better with recent versions + of Qt3 and the Qt4 beta versions.</li> +<li> id 303305: When using \subpage the page hierarchy wasn't reflected + in the tree view or .chm index.</li> +<li> id 303511: Documenting a class in a namespace with a comment block + inside the namespace containing a @class command did + not work properly.</li> +<li> id 303911: Links from todo list items to Objective-C categories were + broken.</li> +<li> id 304026: A class/struct/interface can now be turned into something + else of the same kind using the proper command (i.e. + @interface could by used to turn a class into an interface).</li> +<li> Doxygen did not honor the "All members of an interface in Java are + implicitly public" rule.</li> +<li> An enum of a class could not be documented with @enum from inside a + namespace.</li> +<li> Fixed problem handling unname member groups (useful in combination + with DISTRIBUTE_GROUP_DOC = YES, which didn't work anymore).</li> +<li> Updated Doxygen.dsp (thanks to Gerik Rhoden).</li> +<li> For a word marked with a #, the # is now also removed when no link + could be generated.</li> +<li> Using '<' (or '\<') in a <pre> section cause '$<$' + to appear in the Latex output.</li> +</ul> + +<h1>Doxygen Release 1.4.2</h1> +<b>(release date 28-3-2005)</b> +<a name="1.4.2"></a> +<h3>Changes</h3> +<ul> +<li>If the class/namespace/file member indexes get too long they are now + automatically split over multiple pages (one page per index letter).</li> +<li>Internal: I've split the input scanner (scanner.l) in a part that scans + the supported programming languages and passes the comment blocks to a + second scanner. This should clean up the code a lot and make + the handling of structural commands (like \class and \section) + more consistent. It is also a first step towards supporting dedicated + scanners for other programming languages. </li> +<li>Made doxygen parse .as files (Action Script) as Java code.</li> +</ul> + +<h3>New features</h3> +<ul> +<li>Added a new option SEPARATE_MEMBER_PAGES. When enabled doxygen will + generate a separate page for each documented member, instead of putting + all members on the class/file/namespace page. An index for other members + of the same compound is rendered on the left hand side of the page.</li> +<li>Added new command \subpage that can be used to build a hierarchy of + pages. For pages this is more convenient than using \defgroup + and \ingroup. See the documentation more details and an example.</li> +<li>Included man pages for doxygen and doxywizard.</li> +<li>Language updates for Czech, Swedish, Russian, Italian, Catalan, + German, Brazilian, Korean, Ukrainian, Romanian, Croatian and Chinese,</li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li>id 124214: #'s inside a single quoted PHP string could lead to parse + problems.</li> +<li>id 142339: Doxygen did not using the LATEX_CMD_NAME setting when + generating formulas.</li> +<li>id 163180: Extension specific filters did not work.</li> +<li>id 163940: Labels in dot graphs containing quotes where + not escaped properly.</li> +<li>id 164198: \overload text was always English, it is now translatable.</li> +<li>id 164498: Fixed problem where doxygen ignored the documentation for + members of Objective C class categories when put in the + implementation section.</li> +<li>id 164563: \anchor didn't work inside a <pre>...</pre> section.</li> +<li>id 164812: fix compile problem for certain language selections.</li> +<li>id 165097: Fixed problem with wrong syntax color in \code section.</li> +<li>id 165188: in index.xsd the refid attribute type (xsd:Name) was + not broad enough and has been replaced by xsd:string.</li> +<li>id 165339: Fixed some issues in the code parser causing missed + cross-referencing relations and/or call graphs.</li> +<li>id 165428: ALIASES containing @section commands where not + handled properly.</li> +<li>id 165503: grouped classes did not appear as such in the XML output.</li> +<li>id 165793: input filter was applied to \verbinclude.</li> +<li>id 165816: Grouped functions referenced via tag files had broken links</li> +<li>id 165821: Tag file parser produced bogus errors for nested classes and + namespaces and no line number was reported.</li> +<li>id 166043: static initializer block in Java made doxygen ignore the + rest of the file.</li> +<li>id 166161: More documentation to make the \code command more clear.</li> +<li>id 166756: Fixed a number of issues with the new comment scanner. + It should be much more usable now.</li> +<li>id 166782: XML output: Simple types in a namespace are also + listed at file scope in index.xml</li> +<li>id 166863: @class required fully qualified name even if the comment + block was in the right scope already.</li> +<li>id 166898: Forward declaring a template class added the template + argument to next class defined</li> +<li>id 167037: The method names were non-informative in the todo like + lists when HIDE_SCOPE_NAMES was set to YES (thanks to Luigi Ballabio + for the fix).</li> +<li>id 167040: Related functions were listed as members in the todo list.</li> +<li>id 167462: Doxygen doesn't recognize references to methods of classes + that come as parameter</li> +<li>id 168159: Sometimes enums don't have hyperlinks in the source code.</li> +<li>id 168243: Doxygen produced an unclear warning when putting multiple + @page commands in one comment block.</li> +<li>id 168693: A C-style comment ending with a brief description (including dot) + and a **/ as end marker, caused strange warning.</li> +<li>id 168734: Nested C comments in a \code block confused the preprocessor.</li> +<li>id 168754: //@{ was not working with the new comment block scanner.</li> +<li>id 168871: \~ did not work in C++ style documentation and aliases.</li> +<li>id 168961: Fixed problem parsing arrays of unnamed structs.</li> +<li>id 169003: cross-references were make to global variables even if the + global variables were hidden by local ones or + undocumented/private member variables.</li> +<li>id 169069: static C++ variables with initializers were detected as + functions.</li> +<li>id 169188: static functions were not extracted from PHP classes even + though EXTRACT_STATIC was set to YES.</li> +<li>id 169495: const Qt properties were not parsed properly.</li> +<li>id 169535: spaces after \ref command were not preserved + in <pre> context when the command had only one argument.</li> +<li>id 169547: Removed bogus warning for friend classes inside classes in + an anonymous namespace.</li> +<li>id 169549: Previous fixes introduced flattening of the class hierarchy.</li> +<li>id 169640: File suffix check for the D language was broken.</li> +<li>id 169641: D contructors and destructors were not detected.</li> +<li>is 169657: Fixed the way import is treated in D to prevent recursive + lockup.</li> +<li>id 169784: Objective-C methods with a variable number of arguments were + are not parsed properly.</li> +<li>id 169789: Images specified via \image are now also copied to the + XML output.</li> +<li>id 170612: documenting members of nested anonymous compounds did no + longer work.</li> +<li>id 170833: <code> ended a brief description.</li> +<li>id 170835: doxygen didn't match members of classes in unnamed + namespaces with their definitions</li> +<li>id 170846: template instance friend classes could not be documented + externally. </li> +<li>id 171260: In some cases doxygen produced an incorrect warning about + duplicate detailed descriptions.</li> +<li>id 171295: It now possible again to link to a (enum)value of a @retval using + #name.</li> +<li>id 171376: \else command was not properly parsed if the corresponding + \if was disabled. </li> +<li>id 171749: Using @relatesalso for functions in a namespace didn't work + correctly.</li> +<li>It is now possible again to use Thing%s to auto-link to a class + Thing and put a non-linked "s" after it.</li> +<li>Nested anonymous namespaces appeared as @<num> in the + documentation of the parent namespace.</li> +<li>aliases containing @brief were not handled correctly.</li> +<li>The class name in the HtmlHelp index was linked to the + first member function of that class instead of the class itself.</li> +</ul> + +<h1>Doxygen Release 1.4.1</h1> +<b>(release date 11-1-2005)</b> +<a name="1.4.1"></a> +<h3>Bug fixes</h3> +<ul> +<li> id 163058,163401: Due to a memory corruption bug doxygen could crash under certain conditions + (the Windows binary was the most sensitive to this).</li> +<li> id 163003,163495: Doxygen crashed when GROUP_GRAPH and UML_LOOK were enabled.</li> +<li> Book icon in the treeview is now clickable and has the appropriate action (thanks to + Will Bateman).</li> +<li> Entering the expert dialog in doxywizard now only requires saving the config file + if actual changes were made.</li> +</ul> +<h1>Doxygen Release 1.4.0</h1> +<b>(release date 31-12-2004)</b> +<a name="1.4.0"></a> +<h3>Changes</h3> +<ul> +<li> In the HTML help output (.chm files) the index items with only one + subitem are now collapsed into one item (thanks to Antony Pranata for + the patch).</li> +<li> Some minor tweaks to the style sheet.</li> +<li> @relates can now not only be used for functions, but also for + other members (i.e. enums, types and variables).</li> +<li> Static members do have have explicit "static" in the declaration + part of the documentation. This is useful for grouping where it + is otherwise not obvious that a member is static.</li> +<li> typedefs and enumeration are no longer shown in the "referenced by" + list as these are types (based on patch by Antoine Tandin). </li> +<li> Make configure script use solaris-g++ by default (Sun's own compiler + generates faulty code for doxygen).</li> +</ul> +<h3>New features</h3> +<ul> +<li> Included language update for Serbian, German, and Korean.</li> +<li> For directories dependency graphs are now generated (controlled + by the DIRECTORY_GRAPH switch). For a given directory, the graph will + show its parent directory and the sub directories as nested boxes. + For the directory and its sub directories it will show the relations + with other directories. Relations are based on #include relations of + the files contained in the directories. Each dependency arrow has an + associated number. This number indicates the number of + different #include relations. Clicking on the number will show a page + with the exact #include relations (the latter is for the HTML output + only). </li> +<li> Added \cond and \endcond commands, which can be used to + (conditionally) exclude a part of a file. See the manual for an + example.</li> +<li> Added "-d ExtCmd" debug option, which when used shows what doxygen + will execute when invoking an external command (such as dot). </li> +<li> New option WARN_NO_PARAMDOC that warns about the absence of function + parameter or return type documentation.</li> +<li> Nested classes are now listed in their containing class.</li> +<li> Extended the \f command to support different environments, i.e. + \f{eqnarray*} for equation arrays. The end command is \f}. The + documentation has an example.</li> +<li> Added support for group dependency graphs + (thanks to a patch by Antoine Tandin): New option: GROUP_GRAPHS</li> +<li> New option DOT_TRANSPARENT to enable dot graph with a transparent + background. Thanks to Maik Hinrichs for the patch.</li> +<li> New option FILE_VERSION_FILTER which allows an external tool to + provide version information per file, which is then used in the + file documentation. Thanks to Maik Hinrichs for the patch.</li> +<li> id 162295: New option DOT_MULTI_TARGETS which when set to YES, + will run dot with multiple output files if possible. This was added + to support older version of dot (<=1.8.10) which do not support multiple + output targets. If you use a recent version of dot, you probably want + to enable this (default is NO).</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 119868: Removed warning when </li> ended a @c or similar command.</li> +<li> id 120367: \~lang didn't work correctly around brief descriptions + and certain commands. It is now implemented as an early filter + operation like \cond.</li> +<li> id 135311: Recursive ALIAS definitions now work again.</li> +<li> id 151012: <td> tag in HTML function documentation missed 'class="md"'</li> +<li> id 154689: Wrong link to members of namespaces imported from tag + files when CASE_SENSE_NAMES is set to NO.</li> +<li> id 154700: anchors in pages imported via tag files could not be + linked to.</li> +<li> id 154755: Files were missing from Doxygen.dsp project file. + (thanks to Gerik Rhoden).</li> +<li> id 154758: Fixed typedef resolution bug that could crash doxygen + (thanks to Gerik Rhoden for the analysis and fix).</li> +<li> id 154862: Fixed problem matching array parameters that include + template parameters as the array size.</li> +<li> id 154863: Fixed parsing problem in the preprocessor when an + expression contained the division operator.</li> +<li> id 154469: Referring to Objective-C messages was broken if the full + scope was used.</li> +<li> id 155086: Typedef for member-function pointers of template classes + not recognized</li> +<li> id 155272: Image filenames in RTF output were not quoted causing problem + with custom images whose name contained spaces.</li> +<li> id 155322: Fixed parse problem for php code containing '#'. </li> +<li> id 155224: Java interfaces did't resolve across packages w/o FQN.</li> +<li> id 156411: Return type of a function was not hyperlinked in some cases + (typical with nested namespaces or Java packages).</li> +<li> id 156445: function seen first in header and doc'ed in + source broke autolinking depending on the order of the input.</li> +<li> id 157085: Autolinks for const/volatile operators didn't work.</li> +<li> id 157229: Upper case letters in \page "<name>" breaks title on page.</li> +<li> id 157433: Multi-variable declarations were not parsed properly.</li> +<li> id 157485: @todo's inside the body of a function were not handled + properly.</li> +<li> id 158961: Set EXTRACT_ALL to NO resulted in no directory information + unless the directory and files were documented. This is now controlled + by SHOW_DIRECTORIES.</li> +<li> id 158481: I did some memory usage analysis with valgrind's massif tool, + which indicated that a lot of memory was used by QCString objects. + This made me decide to reimplement the class and optimize it for + memory usage. The resulting class saves a "new" operation of 12 bytes + per string object, which seems to reduce the overall amount of + memory used by doxygen by a factor 2 to 3! The implementation seemed + more expense to use (as it always copies the content instead of sharing + it), but the performance has improved nevertheless (probably because + "new" is much more expensive operation than copying small strings).</li> +<li> id 158637: Links to classes in brief description in index pages were + wrong when CREATE_SUBDIRS was set to YES.</li> +<li> id 158884: "typedef [something] enum" in IDL was not handled properly.</li> +<li> id 159487: @ref's to Objective-C class categories were not possible.</li> +<li> id 159973: @todo item in anonymous enum resulted in broken link.</li> +<li> id 160642: Fixed problem parsing multi-dimensional C arrays.</li> +<li> id 160673: Borland's __property keyword was not handled correctly.</li> +<li> id 160824: UML Collab diagram did't show fields in user defined groups.</li> +<li> id 160931: Made configure script use /bin/bash as it apparently didn't + work with /bin/sh anyway.</li> +<li> id 161048: Latex output for directories could contain unescaped + underscores when SHOW_DIRECTORIES was set to YES.</li> +<li> id 161167: /// \file was not parsed properly.</li> +<li> id 161247: If CALL_GRAPH was enabled references were shown even if + REFERENCES_RELATION was set to NO.</li> +<li> id 161320: An incorrect line number was given for inherited comments + which have an error.</li> +<li> id 161321: Fixed problem parsing '"' in PHP code.</li> +<li> id 161394: Fixed problem with inheritance tree showing the same + undocumented base class multiple times.</li> +<li> id 161556: Fixed two parse bugs related to member specializations.</li> +<li> id 162149: URLs with commas were not handled properly.</li> +<li> id 162271: Doxygen was confused by read-only Qt properties.</li> +<li> id 162434: void function gave rise to warnings when WARN_NO_PARAMDOC + was set to YES.</li> +<li> id 162446: Fixed parse problem in code.l, causing it to get off track.</li> +<li> id 162517: A @ref command was not parsed properly if the argument + between quotes was found on the next line.</li> +<li> Dot would not run if doxygen was installed in a path which contained + spaces (Mac OS X).</li> +<li> Functions inside inline methods were not always cross-referenced anymore.</li> +<li> Latex output was broken in some cases where anonymous structs were used.</li> +<li> Fixed bug in doxywizard: if the wizard was used some settings + were not remembered.</li> +<li> Using \n inside an ALIAS definition caused line numbers for + source browsing to become misaligned.</li> +<li> For included-by graphs files with the same name all had the same + node label.</li> +<li> The following typedef was not parsed properly: + typedef function<void (int,int)> ptr_t;</li> +<li> Fixed problems with the WARN_NO_PARAMDOC command.</li> +<li> Struct members of the form "enum a b;" where not properly parsed.</li> +<li> Fixed a couple of memory leaks.</li> +<li> Fixed crash problem on Windows related to the new string implementation.</li> +<li> Fixed problem with Visual Studio project files (in wintools).</li> +<li> Included patch by Antoine Tandin to fix problem with GROUP_GRAPHS + in combination with CREATE_SUBDIRS = YES.</li> +<li> Included patch by Mikhail Glushenkov to make HTML look prettier.</li> +<li> Parsing operator[]s was broken.</li> +<li> Referencing constants via #CONST did not work anymore.</li> +<li> Fixed problem handing multiline ALIASES containing @defgroup and + @ingroup.</li> +<li> Fixed problem handling \n in ALIASES.</li> +<li> @section's in non-page documentation blocks did not work.</li> +<li> Referencing a group label in a @see section, now shows the group's + title i.s.o. the label name (this was already done for @ref).</li> +</ul> +<p> +\endhtmlonly +\section log_1_3 1.3 Series +\htmlonly +</p> +<h1>Doxygen Release 1.3.9.1</h1> +<h3>Bug fixes</h3>(ids refer to the old buzilla issue, just use it in the search box of the <a href="https://github.com/doxygen/doxygen/issues">issue tracker</a>)<br/> +<ul> +<li> Due to an error in the packaging script, an old version of doxywizard + was bundled with the Mac OS X version of doxygen.</li> +<li> Dot would not run if doxygen was installed in a path which contained + spaces (Mac OS X).</li> +<li> id 151012: <td> tag in HTML function documentation + missed 'class="md"'</li> +<li> id 154689: Wrong link to members of namespaces imported from tag + files when CASE_SENSE_NAMES is set to NO.</li> +<li> id 154700: anchors in pages imported via tag files could not be + linked to.</li> +<li> id 154755: Files were missing from Doxygen.dsp project file. + (thanks to Gerik Rhoden for sending an update).</li> +<li> id 154758: Fixed typedef resolution bug that could crash doxygen + (thanks to Gerik Rhoden for the analysis and fix).</li> +<li> id 154862: Fixed problem matching array parameters that include + template parameters as the array size.</li> +<li> id 154863: Fixed parsing problem in the preprocessor when an + expression contained the division operator.</li> +</ul> +<h1>Doxygen Release 1.3.9</h1> +<h3>Changes</h3> +<ul> +<li> Changed the stylesheet so font usage is more uniform and consistent.</li> +<li> Changed the colors of the doxygen logo at the bottom of a HTML page. + Let me know if you prefer this one or the old one.</li> +<li> Improved rendering of template functions and methods in the HTML output + (previously these could push the method names to the right side of the page).</li> +<li> id 149899: A macro defined in the config file (see PREDEFINED) can now + prevented from being undefined (via a #undef in the code) when its + value is assigned via the := operator (e.g. PREDEFINED = A(x):=x ).</li> +<li> id 150631: if HIDE_SCOPE_NAMES is enabled the scope of a method in a + call graph is only shown when the method is of a different + class.</li> +<li> id 151911: Stylesheet is generated earlier in the process.</li> +<li> id 152164, 152166: Improved the way search results are sorted.</li> +<li> Changed the way function pointer arguments are represented in the + detailed description.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Directory information is now extracted by doxygen. Files are + automatically grouped by directory. You can use + the SHOW_DIRECTORIES option to enable/disable this feature. + Added a new command \dir which can be used to document directories.</li> +<li> Language updates for Czech, Swedish, Hungarian, Danish, Russian, Italian, + German, Chinese, Croatian, and Polish.</li> +<li> Applied a patch by Arend van Beelen which adds support for the + new features introduced in PHP5.</li> +<li> Applied a patch by Ferdinand Wess for better handling of #import + statements in Obj-C code.</li> +<li> Applied a patch by Adam Treat to add read and write accessors + of a Q_PROPERY to the XML output.</li> +<li> Arnaud Bercegeay has added platform support for the Atari MiNT OS. </li> +<li> Included patch by James Ahlborn which improves the way nested numbered + lists are layouted in the HTML output.</li> +<li> Included update for Hungarian translation.</li> +<li> Added patch to improve support for Debian + (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=263542)</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 123772: putting an example inside a group caused broken links to + in the example list.</li> +<li> id 125737: Fixed link error when a @todo item was placed in the + documentation of a variable inside a anonymous union/struct.</li> +<li> id 126344: Added initial support for member template specializations.</li> +<li> id 126448: Argument passed to input filter was not always quoted.</li> +<li> id 126745: Anchors of grouped members were wrong in some cases.</li> +<li> id 128585: Lists were not always rendered properly in the man page + output format.</li> +<li> id 128809: Hidden files (starting with a dot) could not be included + with for instance \verbinclude.</li> +<li> id 130431: Prevented recursive loop in the call graph when a function + declares a local variable with the name of the function.</li> +<li> id 131299: \copydoc with argument A#func() didn't work.</li> +<li> id 131354: Fixed bug matching function declaration/implementation with + using declarations.</li> +<li> id 135448: Improved autodetection of Qt by the configure script + some more (thanks to Michael Henry).</li> +<li> id 135808: Removed reference to doxysearch.cpp from Doxyfile included + with the source distribution.</li> +<li> id 138629: Included patch to make the HTML output more conformant to + the XHTML standard (thanks to Jan Nijtmans).</li> +<li> id 144865: Variables in anonymous unions/structs did not appear as + data fields.</li> +<li> id 148547: Added a workaround for a compile problem in pngrutils.c + on AIX 5.2.</li> +<li> id 148671: Using "publicsomething" as a name for a base class resulted + in the "public" part being stripped.</li> +<li> id 148707: <a href> and <br> tags are now allowed inside html headings.</li> +<li> id 149023: Fixed template inheritance through typedefs problem.</li> +<li> id 149045: Fixed several small problems related to template handling.</li> +<li> id 149106: Fixed problem parsing enum declarations.</li> +<li> id 149164: Fixed problem in the configure script when used with perl + version 5.6 (thanks to a patch by Joerg Schlichenmaier)</li> +<li> id 149258: Example sources could be wrongly indented.</li> +<li> id 149263: Fixed copy/paste error in HTML_FOOTER documentation.</li> +<li> id 149698: Multiple lines of //!< comments were not handle correctly.</li> +<li> id 149711: Title of a namespace page/section was not generated.</li> +<li> id 149797: Forgot to turn off debug mode for the RTF output.</li> +<li> id 149880: Brief description of one variable could appear in the + the description of the next under certain circumstances.</li> +<li> id 150264: linking to Obj-C protocols did not work.</li> +<li> id 150427: "virtual" and "const" were not nicely formatted when + followed by unary scope resolution operator (e.g "const ::A")</li> +<li> id 150629: Enabling OPTIMIZE_OUTPUT_JAVA did not help for call graphs.</li> +<li> id 151457: Fixed compile problem on Solaris 4.2.</li> +<li> id 151452: Bug in LaTeX output for anonymous structs/unions whose + members have brief descriptions.</li> +<li> id 151246: Parse error when using in-body comment blocks.</li> +<li> id 152005: Objective-C string constants appear in output with @"@"</li> +<li> id 152182: Spaces mess up type in Objective C functions.</li> +<li> id 152184: label-less parameters in Objective C functions were not + parsed properly.</li> +<li> id 152383: Objective-C categories showed methods twice.</li> +<li> id 152572: \brief inside an argument description caused a bogus warning.</li> +<li> id 152681: Call-graphs were generated inside a table environment in + the HTML output.</li> +<li> #include after a @file comment made the #include appear on the same line + when DETAILED_AT_TOP was enabled.</li> +<li> User specified images & stylesheets did not work with + CREATE_SUBDIR.</li> +<li> Nested using directives did not work for C#.</li> +<li> Grouped classes did not always appear in the modules section of the + navigation tree.</li> +<li> "internal" classes appeared in the XML output.</li> +<li> friend classes did no longer appear in the output even when + HIDE_FRIEND_COMPOUNDS was set to NO.</li> +<li> Fixing bug in code parser when encountering arrays and some other + related problems.</li> +<li> Array initializers did not show up regardless of the + MAX_INITIALIZER_LINES setting.</li> +<li> Improved support for classes with the same name but in different + namespaces in combination with "using" of namespaces.</li> +</ul> +<h1>Doxygen Release 1.3.8</h1> +<h3>Changes</h3> +<ul> +<li> Rewrote doxywizard. It should be more easy to use and has much better + support for running doxygen from the GUI. Feedback is welcomed!</li> +<li> Members of a namespace are now also added to the file in which they + appear (thanks to Mike Morearty for the patch).</li> +<li> Included patch by Mikhail Glushenkov that fixed item 5 on the todo list + (titles of html pages are now internationalized).</li> +<li> A macro defined in the config file can now be undefined in the + source code via a #undef.</li> +<li> Optimized calling of dot using multiple -T flags at a couple of places + (note that doxygen now requires graphviz >=1.9)</li> +</ul> +<h3>New features</h3> +<ul> +<li> New option FILTER_PATTERNS which can be used to specify multiple + input filters, and let doxygen select the right one based on + matching the source file name with a specified pattern (thanks to + a patch by James Ahlborn).</li> +<li> id 142939: New commands \protocol and \category which can be used + to document Objective-C protocols and categories in the same way + the \class command does for classes.</li> +<li> Included patch that removes some cosmetic annoyances in the man page + output (thanks to Chris Croughton).</li> +<li> Added internationalization support for Afrikaans and + Lithanian. Included language updates for Dutch, + Czech, Italian, Brazilian, Croatian, Japanese, Norwegian and + Russian.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 120810: \code fragment has links first time, but then no more.</li> +<li> id 124214: Fixed parse problems with single quoted strings in PHP.</li> +<li> id 135508: Using a namespace in C# did not get interpreted correctly.</li> +<li> id 137842: Using @todo/@bug/... and disabling the generation of the + list, still caused a colon to appear in the output.</li> +<li> id 138075: A comment block containing a \code block with C style + comments was not properly parsed.</li> +<li> id 138307: Fixed parse problems with single quoted strings in PHP.</li> +<li> id 138394: C style comments placed on the same line after a macro + definition appeared as part of the macro's value.</li> +<li> id 138429: Fixed language setting for HTML output when using + traditional chinese.</li> +<li> id 140259: Using @dotfile in a comment block could cause broken @refs + to sections defined after the @dotfile command.</li> +<li> id 141915: Fixed a couple of problems with the RTF output.</li> +<li> id 141918: Fixed a couple of problems with the RTF output.</li> +<li> id 142118: Fixed compile issue with the mingw compiler.</li> +<li> id 142288: Doxywizard crashed when started (fix was applied to version + 1.3.7 as well).</li> +<li> id 142741: Links in todo/bug/... lists were broken if CREATE_SUBDIRS + was enabled. Same was true for the built-in diagrams.</li> +<li> id 142925: Autolinking to a member of a class from a page inside a + namespace did not work.</li> +<li> id 142940: Due to a misplaced break statement a examples included + with \example was shown twice in the output.</li> +<li> id 143107: Made some cosmetic changes to the HTML and HTML output, + (thanks to David Baird for the patch).</li> +<li> id 143340: Fixed autolink problem for names ending with a colon or + a <br> tag.</li> +<li> id 143412: Fixed problem parsing Objective C class methods.</li> +<li> id 143413: Fixed problem parsing Objective C root classes.</li> +<li> id 143593: Under certain conditions the XML output could contain a + reference to a non-existing class.</li> +<li> id 145295: Variable of a templated type was mistaken for a function.</li> +<li> id 145583: Fixed problems handing formulas and graphs defined using + @dot in combination with CREATE_SUBDIRS = YES.</li> +<li> id 147253: Quotes in a class initializer could confuse the source + code parser.</li> +<li> id 147425: The class diagram did not show the relation to the template + specialization when inheritance was done via one or more typedefs.</li> +<li> Fixed case where template classes "used" via typedefs were not + properly shown in the collaboration diagram.</li> +<li> Variables explicitly declared external were reported being defined + at the place they were actually declared external.</li> +<li> Fixed bug in the XML schema for enum values with initializers.</li> +<li> Documentation of a member group did not appear in the XML output + (thanks to Chris Croughton for the patch).</li> +<li> Command line build process failed under windows if the name of the + directory in which sources are located contained spaces (thanks to + Mikhail Glushenkov for the patch).</li> +<li> Improved cross-referencing to methods of a template instance variables + (thanks to a patch by Jeff Apple).</li> +<li> Included a patch by Enrico Schnepel that puts the same output files + in the same subdirectories (with SUBDIRS = YES) for subsequent runs + (on slightly modified input files) and also renumbers the dot nodes + so they are only regenerated when actually changed.</li> +<li> Unsupported HTML end tags and unsupported begin tags with attributes + are now copied to the output as is.</li> +</ul> + +<h1>Doxygen Release 1.3.7</h1> +<h3>Changes</h3> +<ul> +<li> The \param command now has an optional input and/or output attribute. + The syntax for an input & output parameter is for example: + \param[in,out] name Description.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added new option CREATE_SUBDIRS which when enabled makes doxygen + distribute the generated output evenly over 100 subdirectories.</li> +<li> Added support for Qt's properties (i.e. Q_PROPERTY) which can be + documented by putting a documentation block in front of the macro or + by using a comment block with the new \property command. </li> +<li> Added new commands \manonly and \endmanonly to enter man page specific + text and commands in the generated man pages (thanks to Carsten Stiborg).</li> +<li> Included new python based translation report script, which now + replaces the old perl based version (thanks to Petr Prikryl).</li> +<li> Improved parser to also support parsing of Objective-C implementation + files.</li> +<li> Added new config option EXTRACT_LOCAL_METHODS which can be used for + Objective-C code to extract methods definition in the implementation + section that are not present in the interface.</li> +<li> Added new config option STRIP_FROM_INC_PATH which allows to + specify a list of paths that, if matched, will be striped from the + #include statement in the generated documentation of a class.</li> +<li> Added new command \includelineno with works as \include except it will + add line numbers to the code (thanks to Giancarlo Niccolai for the patch).</li> +<li> Added BeOS support, thanks to a patch by Mark Hellegers.</li> +<li> Included update for the French translation, thanks to Jacques Bouchard.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 133388: Fixed problem parsing '"' inside multi-line C++ style + comment blocks</li> +<li> id 134265: Doxygen now outputs unrecognized HTML tags instead of + removing them (thanks to Éric Malenfant for the patch).</li> +<li> id 134869: When HIDE_SCOPE_NAMES was set to NO, the methods of an + Objective-C class did not have the right name.</li> +<li> id 134876: Fixed problem with forward declaration of a protocol in + Objective-C.</li> +<li> id 134647: using a parameter name ending with "const" was not + accepted by doxygen.</li> +<li> id 134639: Fixed parse problem in the preprocessor.</li> +<li> id 137398: add \% command to the documentation.</li> +<li> id 137730: Fixed problem for man pages with non numeric extension + (thanks to a patch by Joe Schirmer).</li> +<li> id 138652: Line numbers for defines with /* */ comments were wrong + (thanks to J. Noack for the patch).</li> +<li> id 139591: Fixed problem parsing nested template arguments with + comments.</li> +<li> id 140012: a variable could appear in a group twice if it was + declared externally somewhere.</li> +<li> id 140540: Fixed problem parsing "@" in the source code parser.</li> +<li> id 141133: Spaces were stripped in default arguments such as + f(const char *t=" \t")</li> +<li> id 141364: Members of an anonymous nested structure had no brief + comment and no link to the detailed description if available.</li> +<li> Fixed recursive lockup problem that was caused by two or more + namespaces using each other (i.e. a cycle in the usage relation).</li> +<li> Included patch by Erik Zeek to allow the explicit setting of QTDIR to + override the "search for Qt" algorithm in the configure script.</li> +<li> Parsing of tag files produced for Objective-C code now works.</li> +<li> Objective-C: Improved hyperlinking of source code, handling of + prototypes and the list of all members of a class now also contains the + members of class categories.</li> +<li> Third argument of @class was ignored (thanks to Mahadevan for the patch).</li> +<li> Fixed problem with collaboration diagrams for template instances + whose template parameter list contained qualified scope names + (e.g A<B::C>).</li> +<li> Removed bogus warning about undefined documented function for + classes that were made friends of other classes.</li> +<li> Spaces where not preserved for @code block inside a @example block.</li> +<li> Undocumented dependency relations where not shown in some cases + even though HIDE_UNDOC_RELATIONS was set to NO.</li> +<li> Fixed two bugs that resulted in invalid HTML output. </li> +<li> For Unix the default FILE_PATTERNS did not include upper case versions + such as .C and .H</li> +<li> Fixed incorrect character encoding problem for the generated tag files.</li> +<li> Fixed problem that could lead to memory corruption/crashes.</li> +<li> Included a patch by Bernhard Rosenk to fix a compile problem with + doxywizard using a recent Qt version.</li> +<li> Call-graphs were missing if a file name ended with ".C" and K&R + function definitions were used.</li> +<li> Improved source code generation performance when there are many + typedefs with the same name in different scopes.</li> +<li> Linking to a section resulted in the wrong label in the XML output.</li> +</ul> +<h1>Doxygen Release 1.3.6</h1> +<h3>Changes</h3> +<ul> +<li> For projects with many nested classes, namespaces, typedefs and using + statements, doxygen could become very slow. This should + now be improved significantly.</li> +<li> Made some cosmetic changes to the HTML output (thanks to Ben Harper).</li> +<li> STRIP_FROM_PATH now by default strips the path from which doxygen is + run (i.e. $(PWD)/ on Unix)</li> +</ul> +<h3>New features</h3> +<ul> +<li> Make a start with adding support for Objective-C. Doxygen can now + parse Objective-C header files (including protocols and categories). + Thanks to Apple for donating hardware.</li> +<li> Include a patch by Hauke Duden which adds preliminary support for + the D programming language (see http://www.digitalmars.com/d).</li> +<li> C Comments inside #defines are now preserved. This could be useful + to document boilerplate code.</li> +<li> Included patch to replace tabs by the proper amount of spaced inside + code fragments in the XML output (thanks to Alexandr for the patch). </li> +<li> Included Gerik Rhoden's fixes for the .dsp/.dsw files found in the + wintools dir.</li> +<li> Examples (documented via \example) are now included in the XML output.</li> +<li> New option SORT_BRIEF_DOCS which when enabled will list the + declaration section of the documentation (with the brief descriptions) + in alpabetical order, instead of declaration order (thanks to + Akos Kiss for the patch).</li> +<li> Included patch for Hungarian translation (thanks to Akos Kiss) + and for the Serbian language. Added support for mixed Korean/english + (thanks to Jihoon Chung). + The translator report script was also updated (thanks to Petr Prikryl)</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 120070: Included workaround for build problems with RedHat 9 + (thanks to Tim van Holder)</li> +<li> id 128054: Fixed rare case where doxygen crashed due to a recursive + lock-up.</li> +<li> id 131404: Fixed problem cross-referencing PHP member functions.</li> +<li> id 131434: Clarified confusing warning message.</li> +<li> id 131446: Extra attributes of a <a href> tag (like target) are now + copied to the HTML output.</li> +<li> id 132535: Fixed problem with generating man page output for groups + with brief descriptions.</li> +<li> id 132772: Fixed compile problems on HP-UX using acc compiler + (thanks to Clyde Gerber).</li> +<li> id 133300: Fixed missing cross-reference to "c" in constructs such as + "a[b].c"</li> +<li> id 133482: Fixed spurious cross-references to member function which + was shadowed by a parameter name.</li> +<li> id 133986: Attributes of the <img> tag where not written to the + HTML output.</li> +<li> id 134123: Fixed problem with multiple arrows between nodes + in the graphical class hierarchy.</li> +<li> \ref in dot graphs was not working correctly (thanks to + Eoin MacDonell for the fix).</li> +<li> Grouped pages in the XML output did have the same id as their group.</li> +<li> Fixed problem handling environment variables inside a + quoted string in the config file (e.g. "$(HOME)/My Path/").</li> +<li> Using "\mainpage notitle" caused the "notitle" to appear in the treeview.</li> +<li> Page references where wrong in the latex output when PDF_HYPERLINKS + was disabled.</li> +<li> Words inside a hyperlink could be hyperlinked, resulting in invalid + HTML.</li> +<li> Fixed parse error handling function pointer arguments in K&R-style code.</li> +<li> Doxygen could crash when it failed to enter a directory.</li> +</ul> +<h1>Doxygen Release 1.3.5</h1> +<h3>Changes</h3> +<ul> +<li> Doxygen now only regenerates a dot image if it has actually changed! + This could significantly reduce the time of any run after the first. + Checking if a graph has changed is done by computing an md5 hash for + the graph description which is then stored along with the + image generated by dot and compared in subsequent runs.</li> +<li> Improved the way lists look in the man pages (thanks to Silke Reimer).</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for parsing K&R style function prototypes. + Please try it on your favourite legacy C project and report any + problems.</li> +<li> Included languages updates for Traditional Chinese, + Danish, German, Korian translation.</li> +<li> id 120464: doxygen's XML output does now assign a prot="..." + attribute for nested classes (thanks to Paul Ross for the patch).</li> +<li> Added new configuration switch XML_PROGRAMLISTING to enable/disable + generating source code listings as part of the XML output (thanks to + Paul Ross for the patch). </li> +<li> Added new config option ABBREVIATE_BRIEF which makes the + abbration process of brief descriptions configurable and language + independent (thanks to Jake Colman for the patch).</li> +<li> The alphabetical class list now comes with a quick index + (thanks to Marcin Zukowski for the patch).</li> +<li> An XSLT script "combine.xslt" is now generated in the XML output + directory. It can be used to combine XML files into one big file.</li> +<li> The source code is now indexed and thus searchable when the source + browser and search engine options are enabled.</li> +<li> Added "dist" target to the makefile (thanks to Erik Zeek)</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> id 119778, 123385: Documentation in the body of a function could not be + combined with a detailed description before the declaration.</li> +<li> id 122852: References to grouped functions were wrong in certain cases.</li> +<li> id 123031: problem matching f(const char) with f(const char cc).</li> +<li> id 123140: typedef'ed enums whose tag name was the same as the typedef + name did not appear in a group.</li> +<li> id 123145: Under certain circumstances an assertion failed message + was produced.</li> +<li> id 123206: Fixed problem in qtools when opening files in text mode.</li> +<li> id 123322: The search page did not honor DISABLE_INDEX.</li> +<li> id 123420: Functions with a brief description caused bugus </em> tags + in the HTML output.</li> +<li> id 124114: typo in the generated PHP search script could cause errors + in the search result page.</li> +<li> id 124187: Setting EXTRACT_LOCAL_CLASSES to NO, could result in a + broken "More..." link in documented local classes inside a namespace.</li> +<li> id 124214: Fixed problem in search indexer, which could crash doxygen + (thanks to Daniel Koebbing for the patch).</li> +<li> id 124545: fixed a number of problems in the generated search script.</li> +<li> id 124815: Fixed compile problem in filedef.h for aCC on HP-UX.</li> +<li> id 125369: Fixed inconsistency of showing files in the tree view + (thanks to a patch by Alexey Neyman).</li> +<li> id 125424: Font size was not reset after @endcode or verbatim block + in the latex output.</li> +<li> id 125654: Character encoding was not correct for html help treeview + (thanks to Sawada Kentaro for the fix).</li> +<li> id 125367: Fixed problem with producing links in case files with + the same name (but in different directories).</li> +<li> id 126968: Fixed problem parsing verbatim string literals such as + @"\" in C#.</li> +<li> id 127094: Fixed character encoding problem in the XML output.</li> +<li> id 131364: Fixed parse problem when initializing a function pointer.</li> +<li> Links to classes, files, namespaces and groups in the search results + were broken (missing file extension).</li> +<li> Doxygen logo is now transparent even when viewed with IE.</li> +<li> Using a character with ascii code 0x06 in a comment block could crash + doxygen if the preprocessor was enabled.</li> +<li> Fixed problem handling conditional commands and grouping (thanks to + Silke Reimer for the patch).</li> +<li> Fixed problem using \dotfile in combination with RTF output + (thanks to Vegard Larsen).</li> +<li> Fixed several problems related to the new md5 hash feature.</li> +<li> Undocumented functions referenced in a comment block were linked to + anyway.</li> +<li> Fixed a number of typos in the config file documentation (thanks to + Boaz Kelmer)</li> +<li> Workaround for toupper() bug for Russian (thanks to cav@cryptopro.ru)</li> +<li> Fixed problem that HTML image maps ended up in the RTF output.</li> +<li> Fixed bug in code fragment parser that could cause memory corruption + in certain cases.</li> +<li> Fixed problem matching definition and declation of functions, which + could cause bogus warnings for functions with the same name but in + different namespaces.</li> +<li> Using "/// @file" to document a file quickly was not possible, while + "/** @file */" did work. Now both work.</li> +</ul> +<h1>Doxygen Release 1.3.4</h1> +<h3>Changes</h3> +<ul> +<li> Rewrote the search engine. The doxysearch CGI binary has been + replaced by a PHP script which is generated by doxygen. Also the + index file is now generated by doxygen and requires way less memory. + This should make it much easier to use the search facility. + All that is required is a web server with PHP 4.1 or higher. + Please report any problems you find.</li> +<li> Changed the way class names are resolved. This can result in + a significant speedup for projects that use namespaces and typedefs + (including Java projects). Thanks to Edmund Green for the performance + analysis and ideas.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for the &oslash;, and &Oslash; character entities.</li> +<li> Added language updates for Korean, Swedish, German, Russian, + Croatian, Brazilian, Spanish, Japanese, French and Italian.</li> +<li> Added new \relatesalso command, which can be used to put a file member + also in the documentation of a class (thanks to Ian Scott for the patch).</li> +<li> Added support for pseudo IDL files with the .pidl extension + (as used in TAO). Thanks to Éric Malenfant for the patch.</li> +<li> Added new commands \dot ... \enddot to include a dot graph in a + comment block (thanks to a patch by Eoin MacDonell). Inside the + URL attribute of a node you can use \ref to make links to documented + items. See the documentation of the \dot command for an example.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed recursive lock-up problem handling "using" of namespaces.</li> +<li> Doxygen incorrectly translated \\htmlonly and \\latexonly to + \verbatim in the output. </li> +<li> Using the -d Time option caused: + message.cpp<100>: Internal error: Requested unknown option QUIET + at the end of the run.</li> +<li> Static members appeared in the todo list even if EXTRACT_STATIC was + set to NO.</li> +<li> Fixed problem matching f(const int *i) with f(const int * const i),</li> +<li> Fixed case where a variable could get by assigned a bogus "()" in the + heading of the detailed description.</li> +<li> Fixed problem handling extern"C" (without the space). </li> +<li> \ref file.c ended up as file::c in the output.</li> +<li> Special characters in generated texts were not always translated into + proper LaTeX commands in the LaTeX output.</li> +<li> Fixed problem parsing "const ::Class *func()" and "static ::Class *func()". + The keywords were seen as namespaces. + due to the use of more than one const keyword.</li> +<li> Fixed two bugs in compound.xsd schema, thanks to Ademar Aguiar.</li> +<li> Fixed some more problems linking typedefs in combination with namespaces.</li> +<li> id 120637: Fixed parse problem handing character literals such + as '"' inside the initializer list of a constructor.</li> +<li> Fixed file handle leak when INLINE_SOURCES was set to YES.</li> +<li> Fixed problem handling Java packages (Internal inconsistency warnings).</li> +<li> Fixed problem preprocessing @verbatim blocks containing C comments.</li> +<li> Fixed problem handling preprocessor statement just before a function + body when ENABLE_PREPROCESSING was set to NO.</li> +<li> id 122457: INLINE_SOURCES feature was broken (only showed the + first line)</li> +</ul> +<h1>Doxygen Release 1.3.3</h1> +<h3>New features</h3> +<ul> +<li> Included update for VC++ 6.0 project/workspace files (can be found + in wintools). Thanks to Simon Goodwin & Johan Eriksson.</li> +<li> Added new debug flag "-d Time" which will report the elapsed time + for each message printed, and will also show the total running time + along with the time spend on external tools such as dot. + Note: If you have a project that takes doxygen a long time to process, + please send me the output so I get a global idea where to optimize.</li> +<li> New option SUBGROUPING which can be set to NO to have \nosubgrouping + for all classes (thanks to Torben Koch for the patch).</li> +<li> Added XML schemas for validating the XML output, and to help + writing XSLT files. + The generated index.xml now has a complete schema, the compounds + not yet. Thanks go to Alexej Humbach for doing a lot of the work. + Note that a couple of "id" attributes in the XML output have been + changed to "refid", and section tags are now nested.</li> +<li> Included language updates for Traditional Chinese and Japanese.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Doxygen crashed when parsing a comment block with only a \mainpage + command.</li> +<li> Fixed problem matching namespace members.</li> +<li> Fixed scanner push back error for ALIASES with long definitions.</li> +<li> Default main page was wrong if DISABLE_INDEX was set to YES.</li> +<li> Argument of type array were not properly parsed in Java, causing + problems when documenting them with @param.</li> +<li> \image with "" as caption didn't work.</li> +<li> If the last \section in a comment block was empty, doxygen produced + warnings.</li> +<li> Call graphs were only generated if REFERENCES_RELATION was set to YES.</li> +<li> Link could be wrong if a member's name was found in multiple namespaces. </li> +<li> A function returning "struct s *" caused a bogus recursion relation + in the call graph.</li> +<li> Improved handling backslashes for the perlmodgen (thanks to Miguel + Lobo).</li> +<li> Page anchors did not appear in the tag files.</li> +<li> \ref's to grouped pages were not generated correctly.</li> +<li> Fixed parse bug when putting \image inside a HTML table. </li> +<li> Made the documentation parser more tollerant to spaces inside HTML + commands.</li> +<li> Doxygen now issues a warning if invalid commands are used inside + a single-line C++ comment (such a @see and @image).</li> +<li> Fixed parse problem for the semicolon in the following: + Class A : a(";") {};</li> +<li> Doxygen now resolves links to classes imported in a namespace + via using declarations or directives.</li> +<li> Doxygen now issues a warning when @code, @verbatim, @htmlonly, or + @latexonly are not properly terminated.</li> +<li> Fixed "Internal inconsistency" messages when parsing Java packages.</li> +<li> A member did not appear in its group if it was first declared without + documentation and then defined with documentation (with \ingroup).</li> +<li> The <caption> tag was put at the end of a <table> + in the HTML output, while it should be the first tag + after <table>. This is now corrected.</li> +<li> In the LaTeX output, the page references were missing for the links + in the documentation when PDF_HYPERLINK was set to NO.</li> +</ul> +<h1>Doxygen Release 1.3.2</h1> +<h3>Changes</h3> +<ul> +<li> The main page (\mainpage) can now be completely customized, by using + no project name or using "notitle" as argument for \mainpage.</li> +<li> Changed the look of the quick index on top of each page using CSS.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added new command \callgraph which can be put in the documentation + of a function to get a callgraph. In the config file a + new option CALL_GRAPH is added which can be set to YES to enable + callgraphs for all functions (note that this will slow doxygen down!).</li> +<li> Added new boolean config option UML_LOOK which can be enabled to give + class and collaboration diagrams a more UML conformant look + (thanks to Dominick Paniscotti).</li> +<li> Added new commands \xmlonly and \endxmlonly which can be paired + to form blocks of text that only appear in the XML output.</li> +<li> Added sub-indices for the lists of all class/file/namespace members + to filter out just of type of members.</li> +<li> Included language update for Czech, Italian, Portuguese, and French.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Doxygen could crash if a namespace and a class with the same + name were found in the global scope.</li> +<li> Fixed problem handling multiple \xrefitem's in one comment block + (could crash doxygen).</li> +<li> Added check for recursive group relations to prevent lock-up/crash while + generating the group index.</li> +<li> Doxygen could crash if a group contained only undocumented members.</li> +<li> Putting a #include inside a function body would cause the + line numbering to be off.</li> +<li> Fixed cause of a failed assertion when @retval or @param was the last + text in a comment block.</li> +<li> Improved scope detection for code parser when dealing with examples + (imported via \example).</li> +<li> Fixed preprocessor bug handling "#if!defined(VALUE)" (note the lack of + a space).</li> +<li> Added warning if @subsection, @subsubsection or @paragraph were found + in the page context.</li> +<li> French translation was broken (probably due to a dos2unix accident).</li> +<li> Underscores inside a <pre> section did not appear correctly in the + LaTeX output.</li> +<li> Fixed several typos in the generated config file (thanks to a patch + by Justin Zaglio)</li> +<li> Formula's inside comments directly in front or behind function arguments + did not work.</li> +<li> Fixed code parser problem when //<! was nested in a normal C comment.</li> +<li> Included a number of fixes for typos found and corrected by Justin + Zaglio.</li> +<li> For #define values that were constant strings, doxygen tried to link + the text inside the string when shown in the documentation.</li> +<li> The source-browse parser did not link to class variables used in + inline function if the variables were defined before the functions. </li> +<li> The first paragraph after a <h1> or similar heading was not put in + a paragraph context in the generated output.</li> +</ul> + +<h1>Doxygen Release 1.3.1</h1> +<h3>Changes</h3> +<ul> +<li> A multi-line C++ comment block now has to be aligned in order to + make doxygen treat it is one block. As a result the + following is treated as one comment block: + <pre> + int var; //!< variable. + //! more info about var. + int anotherVar; + </pre> + while this results in two comment blocks: + <pre> + int var; //!< variable. + //! info about second variable + int anotherVar; + </pre> + Hopefully this will give more intuitive results. Tabs are replaced + by spaces according to the value of TAB_SIZE in the config file.</li> +<li> Modified the CSS to change the look of the HTML output, and made the + stylesheet a little more powerful (thanks to a patch by Ben Harper).</li> +<li> Formula alignment in the HTML output is now controlled via CSS + (thanks to a patch by Vassilii Khachaturov).</li> +<li> The option TEMPLATE_RELATIONS now defaults to NO.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added new command \xrefitem which enables user-defined commands + that act like \todo and \bug, i.e. produces a related page containing + all items, which is cross-referenced with the documentation blocks + where the items are placed.</li> +<li> Added support for package scope in Java.</li> +<li> Added alt attributes to user included images in the HTML output + (thanks to patch by Vassilii Khachaturov)</li> +<li> Added XML_OUTPUT option to allow a user defined location for + generating XML output (thanks to a patch by Emmanuel Guerin).</li> +<li> Included language updates for French, German, Czech, Italian, and + Brazilian.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Occurrences of <span> and <div> tags in the documentation + were not properly handled.</li> +<li> Fixed problem parsing the following pattern + "namespace { .... } typedef ....", which could crash doxygen if + IGNORE_PREFIX was used.</li> +<li> The project name is now put in front of each title of a HTML page + for easier bookmarking.</li> +<li> In C# enums, classes and structs without (optional) ; were not + properly parsed.</li> +<li> Though still not perfect, I Improved the way namespace aliasing is + handled. It should now work inside other namespaces and for + computing class and usage relations.</li> +<li> Fixed problem documenting typedefs of function pointers using + \typedef.</li> +<li> Links to groups imported via tag files were broken.</li> +<li> Fixed problem resolving class relations for nested classes within + namespaces.</li> +<li> Static members can now be documentated in a separate file using \fn + as long as they have unique names. If the names are not unique the + documentation must be located in the same file (as was required before).</li> +<li> In arguments and return types of the form NA::A were not linked if NA + was a namespace alias to a documentation namespace and A a documented + class name.</li> +<li> Matching a declaration f(NA::C c) with f(C c) did not work if NA was + a namespace alias.</li> +<li> Undocumented classes had wrong links in the treeview frame.</li> +<li> Pages whose title contained < or >'s were not written correctly to the + tag file.</li> +<li> Fixed preprocessor bug: "a##b" was not correctly expanded if + argument "a" or "b" was empty.</li> +<li> Putting \todo and friends inside the documentation of enum values + did not result in an entry on the todo list page.</li> +<li> Fixed some problems compiling with versions of flex >2.5.4, but + also added a #error if these are used, since they produce incompatible + parsers (a bug report has been filed, but no feedback was received).</li> +<li> Characters >=128 are now written as &#nnn; to the XML output. + (thanks to a patch by Michiel Ouwehand).</li> +<li> The table row backgroup color of the "all member" list was hard-coded + in the HTML output. This is now controlled by the stylesheet.</li> +<li> Fixed problem handling omission of the optional arguments of + the \image command.</li> +<li> Enabling HIDE_IN_BODY_DOCS did not work properly if C++-style special + comments were used inside the body of a fucntion.</li> +<li> Fixed problem cross-referencing variables used as a + guard (i.e. if (var) ...) </li> +<li> Setting ENUM_VALUES_PER_LINE to 0 caused a division by 0 error.</li> +<li> Autolinking did not work for members that were grouped and imported + via tag files.</li> +<li> The divide symbol "/" did not appear in the output for array/define + initializers</li> +<li> Fixed paring problem parsing "operator <b>new</b>" + in the documentation.</li> +<li> Fixed problem with resolving template relations (as reported by + Kris Thielemans).</li> +<li> Members in the todo list were not shown correctly (with dot separators) + if OPTIMIZE_OUTPUT_JAVA was set to YES.</li> +<li> Fixed problem handing "class A { public: A::f(); };" which is accepted + as valid C++ by a number of compilers.</li> +<li> Putting a /* inside a C-comment without matching */ caused the + preprocessor to ignore the rest of the file.</li> +<li> Improved the way typedefs are resolved.</li> +<li> Fixed parse problem for the following PHP code: $color='#FFFFFF'</li> +<li> Using @dontinclude could cause broken LaTeX output.</li> +<li> Links to examples (using \example) were broken.</li> +<li> Class members appeared twice in the index of the latex output.</li> +<li> Fixed problem putting \if..\else..\endif around a pair of \defgroup's</li> +</ul> + +<h1>Doxygen Release 1.3</h1> +<h3>Changes</h3> +<ul> +<li> Increased internal buffer size from 16K to 256K for a number of + scanners, so the "input buffer overflow, can't enlarge buffer because + scanner uses REJECT" error should occur less easily.</li> +<li> Style commands like \e, \a or \c will now be terminated when + one of the characters in the following string is + found: ".,()[]:;?", example: "a point (consisting of @a x and @a y)"</li> +<li> Setting OPTIMIZE_OUTPUT_JAVA to YES, will automatically set INLINE_INFO + to NO.</li> +<li> Quotes strings (like "\0" or "%H.%d.%Y") are now considered to be + words (hence the \ and % do not have to be escaped).</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added new configuration option USE_WINDOWS_ENCODING which can be + used to select windows specific character encodings for some languages. + (thanks to Piotr Kaminski).</li> +<li> Added new configuration option LATEX_HIDE_INDICES which can be + used to suppress the various indices that are normally generated in + the LaTeX output (thanks to Ken Yarnall for the patch).</li> +<li> Added new option MAX_DOT_GRAPH_DEPTH to set the maximum distance + from a root node after which the class or include graph will be + truncated. Setting this to a low value should considerably reduce the + time doxygen needs on large projects.</li> +<li> Included updates for French, Korean, Polish, Croatian, and + Danish translations.</li> +<li> Access to title of user defined user defined sections is now + possible from the doxmlparser.</li> +<li> <div> and <span> commands can now by used in the + documentation. Their effect is limited to the HTML output though + (thanks to Frank Schimmel for the patch)</li> +<li> Added inline, virtual, explicit and mutable attributes to XML output + (thanks to patch by Michiel Ouwehand).</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed out-of-memory bug for files containing using directives and + including themselves (indirectly).</li> +<li> Doxygen could crash if two \todo-like commands appeared on the + same line.</li> +<li> Non-inline cast operator was not properly parsed.</li> +<li> Fixed preprocessor problem with parsing /*//*/</li> +<li> URL's in the docs using <a href=""> caused a nested link. </li> +<li> "using namespace A::B;" confused the code parser.</li> +<li> Interface keyword was not recognised in C# (thanks to Onorio Catenacci + for the patch).</li> +<li> Line counting was incorrect when parsing multi-line formulas.</li> +<li> \section's in a \mainpage are now correctly numbered in the LaTeX + output (nesting level was one too deep).</li> +<li> \ref to lower case names did not work + (thanks to Herman ten Brug for the patch)</li> +<li> escaped quotes (") were not preserved in the config file when it was + updated (thanks to Herman ten Brug for the patch).</li> +<li> PHP related fixes contributed by Vaclav Dvorak: + <ul> + <li> #-style comment handling, </li> + <li> adds (problematic) support for define() constants, </li> + <li> adds ".phtml" as a supported file extension for PHP code + (not very common, but still...), </li> + <li> fixes handling of code like "include 'file.inc';" (was parsed + as a variable definition), </li> + <li> removes the variable insidePHPCode (was not needed), </li> + <li> fixes spaces in function argument lists (the '$' was the problem).</li> + </ul></li> +<li> Functions documented with \fn did not get transferred to declaration or + definition (depending on where the comment block was put).</li> +<li> If a function definition was documented and grouped the declaration + was not even if the same documentation block was used for it. </li> +<li> Fixed bug in code parser that could crash doxygen under + certain conditions.</li> +<li> Fixed some spacing problems in the LaTeX output + (thanks to patches by Roberto Bagnara).</li> +<li> Mail address containing the '+' character were not properly parsed + (thanks to Jon Parise for the patch).</li> +<li> Fixed duplicate/wrong id's of grouped members in the XML output.</li> +<li> Docparser reported wrong error if unknown command was found inside + \c (or similar command).</li> +<li> Preprocessor got confused when parsing a special comment as + part of a #define and containing a ' or ".</li> +<li> subgroups defined with @defgroup could be reordered if + @addtogroup was used.</li> +<li> Projects name was not shown as the root of the treeview anymore.</li> +<li> Links to pages imported via tag files were broken in the treeview + frame.</li> +<li> removed leading and trailing whitespace within a \code ... \endcode + block.</li> +<li> Constant class variables with constructor were parsed as functions.</li> +<li> Autolinks of the form class#member were not shown as class::member or + class.member in the documentation.</li> +<li> Fixed problem parsing things like echo('!$tar' . '"'); (PHP).</li> +<li> Fixed problem distinguishing f(__true_type) and f(__false_type)</li> +<li> Fixed lack of translation of some latin2 characters in the latex output + (thanks to Aleksander Kupiec for the patch).</li> +<li> Group members appeared in the treeview or html help index regardless + if they were documented.</li> +<li> The treeview page was not rendered with the right character set (it was + always English).</li> +<li> Explicit template instantations appeared as a variable in the output.</li> +<li> Java instance and static initializer blocks are now correctly parsed + and can be documented.</li> +<li> Fixed bug in the LATEX_HIDE_INDICES option.</li> +<li> Fixed bug parsing simple lists (last word or token could get repeated).</li> +<li> \section titles did not appear in the RTF output.</li> +<li> Tables were not correctly rendered in the RTF output.</li> +<li> Verbatim fragments were not properly rendered in the RTF output.</li> +<li> Fixed some cases where collaboration relations were not visible due + to typedefs.</li> +<li> Fixed some compiler warnings that occurred with more recent versions + of gcc.</li> +<li> Auto-links to files were shown with as file::c instead of file.c. </li> +<li> @ref namespace::class was not parsed correctly.</li> +<li> Undocumented enums could appear in the declaration part of the output + even though HIDE_UNDOC_MEMBERS was set to YES.</li> +<li> \anchor tags now appear in the tagfiles as <docanchor> again.</li> +<li> Hyperlinks in the LaTeX were broken in some cases.</li> +<li> Fixed case where a global variable was not linked from within a function + body.</li> +<li> Include dependencies graph was shown at the place where the + "included by" graph should have appeared.</li> +<li> A // comment following by a //! comment was not handled properly by + the source browser.</li> +<li> If the definition of nested class was found before the definition of the + outer class, its name was displayed without scope.</li> +<li> If a parameter of a prototype was documented (with a separate + documentation block) and the name of the parameter in the definition + was different, the wrong name could be shown in the documentation.</li> +<li> Fixed bug handling \line, \skipline, and \until</li> +</ul> +<h1>Doxygen Release 1.3-rc3</h1> +<h3>Changes</h3> +<ul> +<li> Rewrote the implementation of the tree view feature + (see GENERATE_TREEVIEW). The new implementation should be much faster, + but does require a browser that supports JavaScript, DHTML, and CSS. + Please report any problems you find.</li> +<li> Changed the way dot is launched under Linux/Unix (vfork i.s.o. fork) + so less memory is required (thanks to a patch by Thorsten Behrens).</li> +<li> Changed "Methods" to "Member Functions" in the output (thanks to patch + by Tom Emerson).</li> +<li> STRIP_FROM_PATH now ignores the exact casing of characters, which + makes things simpler on Windows.</li> +<li> Style modifiers such as <b>, <em> and <pre> are now + capable of spanning multiple paragraphs.</li> +<li> Made some improvements to the documentation, including a diagram + showing the information flow between the doxygen and various other + tools (see the getting started section).</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for comment blocks generated by + Rational Rose's ANSI C++ code generator (thanks to a patch by + Martin Beaudoin).</li> +<li> Included language update for the Serbian and Japanese.</li> +<li> Included patch by Ryunosuke Satoh to reduce size of the executable when + building for Cygwin.</li> +<li> Tables in the docs were ended with a bogus row in the LaTeX output.</li> +<li> A \link to a member variable that is grouped using \defgroup can + now be done from another member without specifying the full scope.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> @addindex now works on the whole line instead of a single word (as + was already suggested in the docs).</li> +<li> source code line in the XML output didn't escape special characters + like & anymore.</li> +<li> Fixed small bug in german translation (thanks to Jens Seidel).</li> +<li> e-mail addresses with multiple dots got truncated when linked.</li> +<li> Attributes of html commands with value "" where not properly parsed + causing the image in the legend page not to appear.</li> +<li> Fixed excessive memory usage in the "Building member list" phase while + using todo/test/bug items (thanks to Gerik Rhoden).</li> +<li> Fixed parsing problem in PHP. Doxygen was expecting classes to end with + a semicolon (thanks to Jaime Uriel Torres for the patch).</li> +<li> Using <dt> with also adding a <dd> caused a parse error while it is + legal HTML.</li> +<li> The identifier "package" in C/C++ code was wrongly interpreted as + a Java keyword.</li> +<li> \todo item at the end of a comment block caused "unexpected character" + error while generating the XML output.</li> +<li> \ref did not work when the argument was a file name.</li> +<li> \ref and \link are now allowed inside a <td>..</td> section.</li> +<li> Argument matching routine was not able to distinguish between + f(long n) and f(long long n).</li> +<li> Classes were listed in the alphabetical index with full scope.</li> +<li> \copydoc did not work recursively for members.</li> +<li> Fixed a number of small memory leaks (I used ccmalloc to detect them).</li> +<li> The HTML command <SUP> was not parsed correctly if it was prefixed + with an identifier (i.e. blah<SUP>).</li> +<li> HTML tags were not properly parsed if there was a linebreak after + the tag name.</li> +<li> The \~id command was not working properly. The section was always + generated regardless of the OUTPUT_LANGUAGE setting.</li> +<li> id attribute was missing from the sect tag in the XML output.</li> +<li> Links to files or file members could be wrong if SHORT_NAMES was set + to YES and the file was imported via a tag file.</li> +<li> Attribute lists inside an enum in an IDL file were not properly parsed.</li> +<li> Fixed problem in code browser that prevented linking to global + variables defined in other files.</li> +<li> When putting a "using namespace X" in a header file doxygen did not + recognise this in files that included the header file.</li> +<li> Fixed bug in parsing sections without title.</li> +<li> doxytag did not include anchor in the search index. Thanks to + Joerg Schlichenmaier for the fix.</li> +<li> Using an auto-list as an argument of @todo and friends did not work.</li> +<li> A class with all members in a section grouped could result in broken + LaTeX output (empty CompactItemize list).</li> +</ul> +<h1>Doxygen Release 1.3-rc2</h1> +<h3>New features</h3> +<ul> +<li> Added support for importing members via using declarations.</li> +<li> Anchors and sections (and references to them) are now supported in + all comment blocks, not just \page blocks.</li> +<li> Dot files imported via @dotfile now produce images maps in the + HTML output. Use the URL node attribute in the dot file to make a link + (thanks to Marco Dalla Gasperina for the patch).</li> +<li> New config option WARN_IF_DOC_ERROR which allows documentation problems + to be shown, while other warnings (such as warnings about + undocumented members) can be hidden (thanks to Miguel for the patch).</li> +<li> Included language update for German and Italian.</li> +<li> Added support for &tm; (trademark) and &reg; (registered). </li> +<li> Added "static" attribute to methods in the XML output to ease parsing.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> A <pre> .. </pre> section with included blank lines + causes warning about missing </pre> marker.</li> +<li> "typedef enum { a };" confused doxygen's parser, while most compilers + seem to accept it without warnings.</li> +<li> \deprecated item alone in a comment block caused a crash.</li> +<li> Putting @todo (and similar commands) inside a function body + did not result in correct cross-references with the todo list.</li> +<li> Java interfaces were not detected as such.</li> +<li> Fixed some localization problems in the XML output.</li> +<li> Fixed problem handling multiple \par commands (headings were wrong).</li> +<li> Fixed array out of bounds assert that was triggered while parsing.</li> +<li> Links to pages were not properly resolved in hyperlinked PDF.</li> +<li> Using a \name command without //@{ .. //@} scoping could cause + a segmentation fault. </li> +<li> Including images with @dotfile caused problems in the LaTeX output.</li> +<li> Local variables and parameters now properly hide globals with the + same name in the source browser, reducing wrong references.</li> +<li> Verbatim blocks in the documentation could break the RTF output.</li> +<li> RCS/CVS tags did not appear in the output.</li> +<li> @note section result in section with type "bug" in the XML output.</li> +<li> Dot graphs were truncated too quickly in some cases.</li> +<li> Files with a .php4 extension are now recognised as PHP files.</li> +<li> Source browser could get out of sync causing wrong cross references.</li> +<li> Text after @} could end up in another documentation block.</li> +<li> Putting a style command such as \c or \b at the end of a line, before + a auto list item, caused the list item to be ignored.</li> +<li> Autolinks to files did not work anymore.</li> +<li> @copydoc of a target without documentation could cause a crash.</li> +</ul> +<h1>Doxygen Release 1.3-rc1</h1> +<h3>Changes</h3> +<ul> +<li> New validating parser for documentation blocks that replaces the + old parser (which was actually only a lexical scanner).</li> +<li> The new documentation parser will now pass attributes of html tags + to the html output. Example: + <pre> + /*! \mainpage A Dutch Table + * <table bgcolor="black" border="0" cellspacing="2" + * cellpadding="2" align="center"> + * <tr><td bgcolor="red">red + * <tr><td bgcolor="white">white + * <tr><td bgcolor="blue">blue + * </table> + */ + </pre></li> +<li> Doxywizard will now run doxygen from the directory where the + config file is found, so paths can be made relative + in the config file. This will now also work if the config file's + path or name contains spaces.</li> +<li> Doxygen style comment blocks found in the body of functions are + now appended to the function's documentation block.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added rudimentary support for C#. Parsing should work, + but not all attributes are handled correctly.</li> +<li> Included perl module generator by Miguel Lobo. Setting + GENERATE_PERLMOD to YES in the config file will produce + a perl module in the output dir.</li> +<li> Included language updates for French, Czech, and Russian.</li> +<li> Included a number of enhancements to the xml parser (thanks to + a patch by Tree).</li> +<li> Locally documentated parameters now appear in the XML output + (thanks to Cormac Twomey for the patch). </li> +<li> The preprocessor now inserts line control commands where appropriate.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Aliased \if .. \endif commands around a \brief section were not handled + properly.</li> +<li> Warnings for undocumentation members were not generated anymore + in certain cases.</li> +<li> A member of a group linked with \ref showed the group's title + as link text instead of the member's name.</li> +<li> Using aliased commands whose definition contained \n's caused the + code browser to put definition links at the wrong line numbers.</li> +<li> Todo items inside related pages appeared in tag files, causing warnings + about duplicated labels.</li> +<li> Included a patch by Ryunosuke Satoh that fixes some issues when + compiling in a cygwin environment.</li> +<li> The presence of using declarations could result bogus entries in the + class hierarchy.</li> +<li> Links in the hyperlinked sources could point to the wrong global + function depending on the order in which files were parsed.</li> +<li> Using \retval in combination with parameters that are documented + on the spot, caused bogus warnings about undocumented parameters.</li> +<li> id attributes of references/referencedby relations are wrong in + the XML output.</li> +<li> Links could wrongly point to a class in an outer scope instead of a + typedef with the same name in the inner scope.</li> +<li> A reference in the code to a member of a derived class that is defined + in a base class is now resolved properly even if both classes are + imported via tag files.</li> +<li> Language codes were wrong in the html help output for some languages + (thanks to Erwin Hoffmann for the patch).</li> +<li> Fixed case where function was detected as a variable.</li> +<li> if HIDE_UNDOC_CLASSES is set YES, doxygen will not complain about + undocumented classes.</li> +<li> Included RTF output fixes by Gorden Machel.</li> +<li> Global variables of complex types were not properly cross-referenced.</li> +<li> Fixed argument matching bug for nested template classes; + matching <code>"f(A::B<T>::C c)"</code> with + <code>"f(C c)"</code> within context <code>A::B<T></code></li> +<li> Fixed preprocessor bug handling nested comment blocks + (the */ of the inner block was eaten).</li> +</ul> +<p> +\endhtmlonly +\section log_1_2 1.2 Series +\htmlonly +</p> +<h1>Doxygen Release 1.2.18</h1> +<h3>Changes</h3> +<ul> +<li> Running doxygen with the "-d Validate" option will activate a + new documentation parser. The parser will produce output for + Html, Latex, XML and RTF output (man page output still needs to be done). + For XML output this new parser will <em>always</em> be used. + Please try it and let me know if you see unexpected errors or + invalid output. This parser will replace the old one in the + next release. + <p> + The main advantages of the new parser are that it actually checks the + syntax of the documentation blocks and will produce valid output + by design. </p> + <p> + For debugging purposes, adding "-d PrintTree" along + with "-d Validate" will let doxygen dump the abstract syntax tree of + each documentation block to the output in a pretty printed way + (this reflects the structure built-up by the parser).</p> </li> +<li> A number of new XML tags are introduced along with the new parser, + these include: umlaut, acute, grave, circ, tilde, szlig, cedil, ring + nonbreakablespace, toclist, tocitem, xrefsect, xrefdescription, + and xreftitle.</li> +<li> Changed the way code fragments are represented in XML to simplify + validation.</li> +<li> Changed the way \page, \section, and \subsection are handled in LaTeX + (and RTF). + <ul> + <li> + \page now results in a section in latex (of the related pages chapter)</li> + <li> + \section is now a subsection within that page section (used to be a + section, so at the same level as \page)</li> + <li> + \subsection is now a subsubsection within a subsection (used to be a + subsection).</li> + </ul></li> +<li> Included a number of patches by Kristian Ede: + <ul> + <li> Undocumented private friend classes no longer cause warnings</li> + <li> Undocumented private classes no longer cause warnings</li> + <li> Undocumented members are now hidden if they are + default constuctors, destructors or reimplemented.</li> + </ul></li> +<li> Pages introduced via \page are now context aware. This means that + if you put them inside a class or namespace, names do not have + to be prefixed with a full scope to create a link in the documentation.</li> +<li> Boolean values in doxywizard can no longer be toggled by clicking + anywhere on the line on which they appear, but only by clicking on + the name or checkbox.</li> +</ul> +<h3>New features</h3> +<ul> +<li> @deprecated is now treated as @todo, @test, and @bug, which means + that a list of all deprecated items is generated. + Thanks to Angela Marshall for the patch.</li> +<li> Enum value documentation was added to the XML output.</li> +<li> Files ending with ".inc" are now recognised as PHP files + (thanks to Marcus Ahlfors).</li> +<li> Included updated documentation for language translators + (thanks to Petr Prikryl).</li> +<li> Included language updates for Czech, Slovak, Brazillan, Croatian, + Portuguese, Russian, Polish, Japanese and Serbian. + Include language support for Catalan (thanks to Albert Mora)</li> +<li> Included .dsp update by Simon Goodwin (already needs to be updated + again :-( )</li> +<li> Added new configuration options XML_DTD and XML_SCHEMA to set the + DTD or Schema used in the XML output.</li> +<li> Include new commands \subsubsection and \paragraph which add two + section level below \section and \subsection (thanks to + Dirk Reiners for the patch) </li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed lock-up bug in RTF output when using tables.</li> +<li> The internal comment conversion routine was confused by lines of the + form //*************</li> +<li> Fixed recursive lockup for template arguments of the form + "typename A = ::A"</li> +<li> Description part of @name did not (always) appear in the resulting + documentation.</li> +<li> Alphabetic index showed package scope using "::" even when + OPTIMIZE_OUTPUT_JAVA was set to YES. The same happened for class and + namespace HTML page titles.</li> +<li> New versions of dot (graphviz >=1.8.8) broke clickable images + for versions of doxygen <=1.2.17. Now fixed for newer doxygen + releases in a backwards compatible way thanks to a patch by John Ellson.</li> +<li> Fixed compile problem for 64 bit machines (pointer to int cast).</li> +<li> Included patch to build Doxygen 1.2.17 on AIX 4.3 by Russ Allbery</li> +<li> \if ... \else ... \endif blocks now also work in //!< style comments.</li> +<li> Fixed a couple of memory leaks in the code parser.</li> +<li> Fixed case where member function was put in the member variable + section (thanks to Mahadevan R)</li> +<li> Fixed bug causing link targets not to appear in the output.</li> +<li> Setting BRIEF_MEMBER_DESC set to NO for a member that did not have + a detailed description while setting ALWAYS_DETAILED to YES caused the + documentation not to appear in the output at all.</li> +<li> Fixed todo list linking problems for hyperlinked pdf output and + grouped pages.</li> +<li> Putting a function declaration and its definition in the same group + could lead to wrong links using @ref.</li> +<li> Undocumented but grouped members did not appear in the output.</li> +<li> The declaration and definition of overloaded global functions + was not always properly matched, causing functions not to appear + in the documentation.</li> +<li> Nested C-comments were confusing the preprocessor, causing it to + incorrectly skip comment blocks.</li> +<li> An empty line was not always being recognized as a paragraph break + (thanks to Stephen Pope for the fix).</li> +<li> An aliased \endif in a skipped section was not handled properly. </li> +</ul> +<h1>Doxygen Release 1.2.17</h1> +<h3>Changes</h3> +<ul> +<li> XML: The index of the XML output now has @refid instead of @id's, + and includes a "kind" attribute for the compounds and members for easier + filtering.</li> +<li> Improved dot image generation speed for large projects by changing + the way the best-fitting graph is computed (thanks to Philip Bergen + for the suggestion).</li> +<li> @name now automatically starts a member group section (previously + a @{ command was needed). The member group continues until a new @name + command is found or until the end of a compound is reached. @{ ... @} + commands can still be used for backward compatibility or to end a member + group before the end of a compound. @defgroup and friends still require + explicit @{ ... @} blocks.</li> +<li> Changed the way \todo, \bug, and \test are handled internally. + This should have no visible effect on the outside, but makes it much + easier to add similar commands and also saves a bit of memory on average.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added initial support for parsing PHP code (thanks to a patch by + Jan Borsodi). For a PHP file the following additional commands are + available: + <dl> + <dt>\private </dt><dd> makes the current item private</dd> + <dt>\protected </dt><dd> makes the current item protected</dd> + <dt>\public </dt><dd> makes the current item public</dd> + <dt>\privatesection </dt><dd> changes to private section(same as private: in C++)</dd> + <dt>\protectedsection </dt><dd> changes to protected section(same as protected: in C++)</dd> + <dt>\publicsection </dt><dd> changes to public section(same as public: in C++)</dd> + <dt>\static </dt><dd> changes the current item to static</dd> + <dt>\pure </dt><dd> changes the current item to pure virtual</dd> + </dl></li> +<li> New command @copydoc that can be used to copy a documentation block + of some item and paste it in another documentation block.</li> +<li> i18n: Added support for the Serbian language (thanks to Dejan Milosavljevic). + Included a new language option Japanese-en for combined Japanese + and english.</li> +<li> Included patch for dealing with variable argument macros in @param + (thanks to Alfred Heggestad).</li> +<li> Added new option MULTILINE_CPP_IS_BRIEF to make doxygen treat + a multi-line brief comment block as a brief description. Set this to + YES to obtain the behaviour of version 1.2.15 and earlier. Default as + of version 1.2.16 is to treat multi-line C++ comment block as a + detailed description.</li> +<li> New option CHM_FILE to set the .chm file (and path) to use for + Html Help output.</li> +<li> New option HHC_LOCATION to set the location of the Html Help compiler. + If given doxygen will automatically run the compiler to create the + .chm file.</li> +<li> Included .dsp & .dsw files to build doxygen from DevStudio in the + wintools dir. Thanks to Simon Goodwin for providing these.</li> +<li> Included new command $year that can be use in header and footer + files to produce the current year (thanks to Michael Beck for the patch).</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed lock-up bug when writing RTF output with verbatim sections.</li> +<li> The tree view showed entries in C++ style even if OPTIMIZE_OUTPUT_JAVA + was set to YES.</li> +<li> Documentation blocks for function arguments in a documented header + file did not show up if the function definition was parsed first.</li> +<li> Inheritance relations in Java where not always correctly resolved if + the base class was explicitly scoped.</li> +<li> Fixed some non-standard conformance issues in the HTML output (thanks to + John Levon for the patch).</li> +<li> Usage relations for variables whose type was a qualified typedef were + not properly resolved.</li> +<li> Fixed potential crash bug (null-pointer dereference) in source browser + parser.</li> +<li> Comment blocks ending with an empty /// comment line were not + properly handled by the comment conversion code.</li> +<li> @relates is no longer needed for a friend function documented in + the source file (thanks to Johan Eriksson for the fix).</li> +<li> Doxygen could link include files to non-existing source files, if they + pointed to external files but were also found in the include path.</li> +<li> "make install_docs" was broken.</li> +<li> Fixed parse bug for conversion operators of the form "operator ::X*()"</li> +<li> XML output fixes: + <ul> + <li> derivedcompoundref was not terminated properly. </li> + <li> innerpage and innergroup were closed twice.</li> + <li> Removed auto-generated section titles from the detailed descriptions + in the XML output.</li> + <li> para tags in simple section in the XML output were not properly matched</li> + </ul></li> +<li> PDF output fixes: + <ul> + <li> Fixed pdflatex reruns in the Makefile when USE_PDFLATEX was YES. It + should now run the proper amount of times (thanks to Simon Goodwin + for the fix).</li> + <li> Links to items in the bug list were broken for the PDF output.</li> + <li> Fixed bug in PDF output that resulted in links to non-existing + source pages.</li> + <li> Fixed bug in URL parsing that caused invalid PDF output for the + doxygen manual.</li> + <li> Doxygen logo did not appear in the PDF manual.</li> + </ul></li> +<li> RTF output fixes/improvements by Janet Swisher, + Gordon Machel & Martin Vuille: + <ul> + <li> Included fix for loading RTF style-sheets</li> + <li> reference list and title were merged</li> + <li> First word of company name was lost.</li> + <li> Main page title was not substituted.</li> + <li> There were two pages numbered "i" in the document.</li> + <li> Added a heading to the table of contents page.</li> + <li> Depending on the order in which things are + documented, there were extra, empty paragraphs + thrown in.</li> + <li> Added a number of debugging comments + and changed some existing ones to make it easier + to relate the comment in the RTF to the name of + the method that generates it.</li> + </ul></li> +<li> operator|() caused invalid entries in the latex index.</li> +<li> Fixed bug parsing URLs with curly braces in documentation blocks.</li> +<li> Html help output now uses the correct language code if non english + language is selected.</li> +<li> Fixed bug in generate makefile for latex output (thanks to Petr + Prikryl)</li> +<li> Fixed source browser bug: a comment just before a function body + confused the parser.</li> +<li> Fixed problem handling function typedefs.</li> +<li> \endif appeared in output when used via ALIASES in a brief description.</li> +<li> Included heuristic to distiguish between a variable definition + with initialization via a constructor and a function prototype + (e.g. "Test var(initVal);", v.s. "Test func(SomeType);").</li> +<li> Fixed lock-up problem when to @brief were put after each other in a + comment block.</li> +<li> Images for include dependency graphs were unclickable.</li> +<li> Members in source fragments and examples were not linked to their + member group documentation if available.</li> +<li> For initializers of the form ' ', the space was removed in the output. </li> +<li> \dotfile generated files did not get generated correctly because dot + could not find the specified font.</li> +<li> Third argument of \class did not always work.</li> +<li> The pattern argument for the @skip, @skipline, @until and @line commands + now extents until the end of the line (as suggested by the documentation) + instead of just the first word. </li> +</ul> + +<h1>Doxygen Release 1.2.16</h1> +<h3>Changes</h3> +<ul> +<li> Verbatim and preformatted sections + are now represented with a new "preformatted" tag in the XML output.</li> +<li> The HIDE_UNDOC_RELATIONS option is no longer depending on + HAVE_DOT being set to YES.</li> +<li> A dot is only added after a brief description if it starts + with a capital (thanks to Ondrej Jombik for the patch).</li> +<li> Doxygen now treats blocks of C++ comments such as + //! Detailed + //! Description + as a detailed description + (such blocks used to be treated as brief descriptions!). + A single line C++ comments still represents a brief description, + for multiline brief description an explicit @brief can be used. + See the updated documentation for more examples.</li> +<li> XML: Added class name to inheritance relations that are written to the + XML output.</li> +<li> Images included with \dotfile are now centered in the latex output + (thanks to Nils Strom for the patch).</li> +</ul> +<h3>New features</h3> +<ul> +<li> Included language update for Slovene.</li> +<li> CGI_URL now allows URLs that start with cgi: (for KDE KIO slave support)</li> +<li> Made include dependency graphs available from the XML parser API.</li> +<li> Added patch to support multi-byte RTF output (thanks to Sato Ryunosuke)</li> +<li> Gary Lee added language support for Chinese-Traditional. </li> +<li> Thanks to a patch by Loïc the RTF output now supports (non-nested) + tables.</li> +<li> Added compilation support for cygwin (win32-g++ target). + Thanks to Ryunosuke Sato for the patch.</li> +<li> Added new option DETAILS_AT_TOP to put the detailed documentation + at the top of a documentation page where normally only the brief + descriptions would be shown (based on a patch by Elliott Hughes).</li> +<li> XML: Added member template parameters to the XML output.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Improved portability of the png code: updated zlib to version 1.1.4, + replaced K&R style code by ansi code, fixed compile problem with + pngenc.cpp on some platforms.</li> +<li> Fixed recursive lock-up problem that could occur for certain cases + in which recursive template inheritance was used.</li> +<li> The cross-package inheritance relations were broken for Java code. + I fixed this by treating Java import statement as C++ using statements. + Please report any problems that remain.</li> +<li> Alias commands put in separate parameter documentation blocks + were not resolved.</li> +<li> The documentation for arguments, documented with a seperate + documentation block, was not consistently shown in source and header + files, depending on the order of the input files. </li> +<li> The characters '(', ')', '$', ''', and ';' were not recognised + as part of an URL.</li> +<li> Grouped enum values could not share the same documentation block + even when DISTRIBUTE_GROUP_DOC is YES. </li> +<li> The end caption tag was missing a closing > in the XML output.</li> +<li> Fixed bug with table captions in XML output.</li> +<li> Removed warning when documenting include guard-like defines. </li> +<li> The \package command was broken. Fixed cases where :: appeared in + the output when OPTIMIZE_OUTPUT_JAVA was set to YES.</li> +<li> Fixed scoping problem using \class for documenting nested classes inside + template classes.</li> +<li> Fixed invalid output bug when putting "-" items inside @arg or @li + lists.</li> +<li> Fixed problem referencing functions using {@link ... } with explicit + argument lists.</li> +<li> Fixed bug when parsing "typedef struct{}TypeName;" (i.e. without + a space before the struct).</li> +<li> Fixed argument matching bug for global functions having undocumented + classes, imported via using declarations, as their parameter type.</li> +<li> Fixed bug in conditional section handling for cases like: + @if guard text @else more text @endif</li> +<li> The html help files did not honour the HTML_FILE_EXTENSION settings.</li> +<li> Removed bogus warning when using @param for function-type + parameters.</li> +<li> Include statements in the source browser output now link to the + right include file in case of ambiguities. </li> +<li> The include lines in the file documentation didn't link to files that + were imported from tag files. </li> +<li> The include dependency graph did not show include files if they + were directly or indirectly imported from tag files. Existing tag + files need to be regenerated to make use of this.</li> +<li> XML: The refid of members in listofallmembers section in the XML output + was wrong. The ulink tag did not end properly in the XML output. + The Value of ambiguityscope in the XML output was not properly escaped. + LaTeX page reference texts appeared in the XML output.</li> +<li> Included language update for Brazilian.</li> +<li> Doxygen now treats "const int *" and "int const *" (i.e. with + reordered const) as equivalent types.</li> +<li> The preprocessor now avoids recursive includes, which helps + to parse files that do not have proper #ifndef-#define .. #endif guards.</li> +<li> Matching arguments with types "unsigned long int" and + "unsigned long int blah" removed argument name. + Same for "int" and "const int blah".</li> +<li> Fixed LaTeX output bug that occurs when using \dotfile in combination + with USE_PDFLATEX = YES (thanks to Nils Strom for the patch).</li> +<li> Links to static functions in the documentation, now point to the + local file in case of ambiguities.</li> +<li> Comments of the form /*/**/ confused the source browser.</li> +<li> Fixed bug parsing "class C : public ::C {};" inside a namespace.</li> +<li> Fixed bug in tag file reader when parsing includes.</li> +<li> The include dependencies were wrong if an include file name was part of + the input but the #include specifically asked for another file + not part of the input but with the same name.</li> +</ul> +<h1>Doxygen Release 1.2.15</h1> +<h3>Changes</h3> +<ul> +<li> On request of Richard Stallman and others I replaced all + generated GIF images with PNG images. + See <a href="http://www.burnallgifs.org">http://www.burnallgifs.org</a> + for the motivation.</li> +<li> The Documentation of function definitions and declarations are now + always merged. References/Referenced by relations are now equal + for function declarations and definitions.</li> +<li> When @retval commands are used to document parameters, doxygen will + no longer produce a warning message for that parameter. @retval can + still be used to document non parameters such as the return values + of a function.</li> +<li> <pre>#define A(x) x /**< a define */</pre> + will document a define, while + <pre>#define A(x) /** an argument */ x</pre> + will document the argument of the define</li> +<li> Links in the documentation to const/volatile members are now + possible by explicitly specifying "f() const" or "f() volatile" + in case a non-const/volatile "f()" also exists.</li> +<li> Doxygen now warns about undocumented compounds (thanks to Itai Frenkel + for the patch).</li> +</ul> +<h3>New features</h3> +<ul> +<li> Included language update for Russian and Romanian translations.</li> +<li> EPS images included with "\image latex" are automatically converted + to pdf's when USE_PDFLATEX is set to YES.</li> +<li> Added two new commands: LATEX_CMD_NAME and MAKEINDEX_CMD_NAME to + set the name of the latex and makeindex tools to be used for latex + output (thanks to Konno Akihisa for the patch).</li> +<li> Improved support for Java. Packages are now treated like + C++ namespaces and there is a new option OPTIMIZE_OUTPUT_JAVA + that, when enabled, provides more Java-oriented output. Please + report any Java-related problems that remain.</li> +<li> Extended XML parser API (see addon/doxmlparser/include/doxmlintf.h) + with full access to documentation blocks. + Made inheritance/collaboration diagrams accessible via the + XML parser API (see addon/doxmlparser/include/doxmlintf.h). + Reorganised the internals of the XML parser so the API does + not require destructors. Made the parser more portable (it should + compile with gcc and M$ visual C++ now).</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Using "@param x,y,z" resulted bogus warnings about undocumented + parameters.</li> +<li> "doxygen -w latex header.tex doxygen.sty Doxyfile" caused a segmentation + fault (thanks to Aric Cyr for the patch).</li> +<li> Fixed argument matching problem that occurred in some rare cases + that involved "using" of namespaces.</li> +<li> Using /**< Brief.\ more brief. Details. */ with ENABLE_JAVADOC = YES, + now removes the slash just like it did with /**...*/ style comments. </li> +<li> Using an ordered, html-style list inside a @param command + resulted in invalid output if list item contained blank lines.</li> +<li> STRIP_FROM_PATH now also works with Windows style paths + (e.g. C:\MyPath\)</li> +<li> A module can now appear more than once in the module tree + (thanks to Itai Frenkel for the patch).</li> +<li> In some cases the tree view showed leaf elements as non-leafs. </li> +<li> Fixed a number of cases where illegal characters could end up in + the XML output.</li> +<li> If a function in a base class was (re)implemented by serveral classes + only one of them appeared in the "(re)implemented in" list. </li> +<li> graph_legend.gif was hardcoded in translator_*.h files. + Note to translators: this has affected all translator files, so please + update your local translator file!</li> +<li> In some cases a grouped member within a namespace did not appear + in the group's documentation.</li> +<li> Namespace members were not properly cross-referenced with in the + source browser output.</li> +<li> Using directives inside anonymous namespaces had no effect.</li> +<li> Fixed bug in the preprocessor when parsing '"' as the argument to + a function macro.</li> +<li> The argument of commands like \c did not produce a link to + external documentation if possible, while links to local + documentation were generated.</li> +</ul> + +<h1>Doxygen Release 1.2.14</h1> +<h3>Changes</h3> +<ul> +<li> Split up the XML output into an index (index.xml) and one page per + compound. This allows for faster processing and less memory consumption, + when using DOM style parsers.</li> +<li> Include files are now shown in the class documentation if + and only if SHOW_INCLUDE_FILES is YES. </li> +<li> Doxygen-style C comments inside macro definitions are now preserved + in the output. Example: + <pre> + #define INIT(x) /*! Initializes x. */ void Init() { x = 0; } + </pre></li> +<li> When deriving from pure virtual members or IDL interfaces, doxygen will + now put an "implements/implemented in" list in the documentation instead + of "reimplements/reimplemented by".</li> +<li> Doxygen now filters out duplicate input files.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added a very simple metrics utility + (see addon/doxmlparser/examples/metrics) which can compute some + figures based on the XML output generated by doxygen.</li> +<li> Added autodetection for Darwin (MacOSX) to the configure script.</li> +<li> Added option EXCLUDE_SYMLINKS. + The EXCLUDE_SYMLINKS tag can be used to select whether or not files or + directories that are symbolic links (a Unix filesystem feature) are + excluded. </li> +<li> Added option EXTERNAL_GROUPS. + If the EXTERNAL_GROUPS tag is set to YES all external groups + will be listed in the modules index. If set to NO, only the + current project's groups will be listed. (thanks to Darren Oldag + for the patch).</li> +<li> Included update for translator.pl (thanks to Petr Prikryl)</li> +<li> updated .spec file (thanks to Emilio Riva).</li> +<li> Included patch by Jochen Hanff to make the index headings configurable + via style-sheets.</li> +<li> If a comment block contains at least one @param command, doxygen now + produces warnings if not all parameters of a function are documented or + if the names of the parameters do not match the argumentlist. + (Please report any false alarms).</li> +<li> Added new command \~language_id to create sections that + are outputted for the language >language_id> only: + Example: + <pre> + /** \~czech Cesky komentar \~english English comment text \~dutch + Nederlands commentaar \~ Common comment for all languages, + this tag switches off the language filter... + */ + </pre> + Which of the language specific fragments is outputed depends + on the setting of OUTPUT_LANGUAGE (Thanks to Milan Rusek for the patch).</li> +<li> Added build support for Cygwin (thanks to Ryunosuke Sato). </li> +<li> Added new option HTML_FILE_EXTENSION to allow different file extension + for the html file outputted by doxygen (like .php). Thanks to + Rob Olsthoorn for the patch.</li> +<li> Added option DOT_IMAGE_FORMAT that can be used to set the image + format of images generated by dot (possible formats: gif, png, jpg).</li> +<li> In the documentation of class, namespace, file and group items a + list of groups to which the item belongs is put between brackets ([..]) + under the title (HTML only).</li> +<li> Added "list of all members" and template parameter lists for + classes to the XML output.</li> +<li> Included language updates for Chinese, Czech, French, Italian, + Brazilian, Japanese, Russian and German.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> The start of a comment (/*) embedded in a page or example block + caused parse problems.</li> +<li> operator%= member caused latex error when in pdf hyperlink mode.</li> +<li> fixed parse problem for global function typedefs like "typedef int f()"</li> +<li> Qt slots weren't included in the reference/referenced by relations + (thanks to Gordon Machel for the patch).</li> +<li> Fixed parse problem that occurred when the <SUP> tag was used in + a brief description. </li> +<li> Private members sometimes showed up in the all member list even though + EXTRACT_PRIVATE was NO.</li> +<li> Doxygen now exits with code 0 if there is no error (previously it + returned 1 in some cases were no error occurred).</li> +<li> Calling "doxygen -g -" now writes the config file to stdout + (this already worked when using "doxygen -g-").</li> +<li> Undocumented classes exposed when setting EXTRACT_ALL to YES, could + result in broken links in the class hierarchy.</li> +<li> Exception specifications in Java were not parsed properly.</li> +<li> If INLINE_INHERITED_MEMB was YES, pure vitual members of base classes + reachable via multiple paths appeared more than once in the + documentation.</li> +<li> Removed potential recursive loop when computing reimplements relations + for template instances.</li> +<li> Fixed argument matching problem when matching "a<int *>" with + a<int * >"</li> +<li> Links in the documentation of grouped namespace members were not + pointing to the group but to the namespace.</li> +<li> For template specializations the title of an html page contained + plain < and > characters.</li> +<li> When computing source references undocumented members could introduce + non-existing relations for documented members in front of it.</li> +<li> Fixed escaping problem in Makefile generated for latex output.</li> +<li> File names were sometimes prefixed for undocumented classes in the + class hierarchy.</li> +<li> When computing the list of all members, interface members are now + treated as virtual.</li> +<li> Protected members of a base class did not appear as such in the list of + all members of derived classes.</li> +<li> Fixed problem with ending itemized lists before paragraph commands + (like @see), which resulted in invalid output.</li> +<li> The version number in config files generated by doxywizard was + always 0.1.</li> +<li> Having a macro function and typedef with the same name confused doxygen.</li> +<li> An \endverbatim command at the end of a \name section was not parsed.</li> +<li> Stars (*) at the start of a line in /**< ... */ style comments + after a parameter were included in the result.</li> +<li> Putting a C-style comment in a @code block was not handled properly.</li> +</ul> + +<h1>Doxygen Release 1.2.13.1</h1> +<h3>Bug fixes</h3> +<ul> +<li> Links to grouped members were broken.</li> +<li> The Module index was broken in HTML and subgroups were still not + sorted properly.</li> +<li> Selecting a non-default language was not possible in doxywizard + (thanks to Heiko Schaefer for the patch).</li> +<li> Ending a dash-style list was not possible by starting a new paragraph + anymore.</li> +<li> Fixed "exceptions" tag mismatch in the XML output.</li> +<li> extern "C" blocks inside source files incorrectly included header files + during preprocessing.</li> +<li> Compiling doxywizard on Unix with Qt-3.x didn't work because + libdoxycfg was linked with qtools from Qt-2.x.</li> +<li> Fixed potential memory corruption when generation the graphical class + hierarchy (nodes were deleted more than once).</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for multi-method declarations such as: int func1(),func2();</li> +<li> Included updated DTD for validating the XML output produced by doxygen, + thanks to Angelo Hulshout.</li> +<li> Included support for Japanese-ShiftJIS translation, + thanks to Ryunosuke Sato.</li> +<li> Included update for Slovak translator, thanks to Stanislav Kudlac.</li> +<li> Thanks to a patch by Pascal Flammant tables in the documentation + can now have captions using <caption> ... </caption> + within a table definition.</li> +<li> A dash-style list can now be ended without ending the paragraph. + See the list-section of the documentation for an example.</li> +</ul> +<h1>Doxygen Release 1.2.13</h1> +<h3>Changes</h3> +<ul> +<li> Changed the way @internal works. The "For internal use only" message, + now appears (along with the internal documentation) + if and only if INTERNAL_DOCS = YES. </li> +<li> Subgroups are no longer sorted but presented in declaration order.</li> +<li> Members inside todo/test/bug lists are now shown with qualified + names again. </li> +<li> Reorganized the XML parser. It is now structured as a library, + a header file, and a test application. See addon/doxmlparser for + details.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Included languages updates for French, Portuguese, + Korean, Italian, Dutch, Slovene, Brazil, German and Portuguese. + Thanks to Harry Kalogirou doxygen now has support for output in + the Greek language.</li> +<li> Included patch by Adam Doppelt to make doxysearch work + better with windows/IIS.</li> +<li> Added more info to the XML output: include dependencies, + member groups, re-implement relations, const/volatile specifiers, + namespace info, related pages, inner classes, inner namespaces.</li> +<li> Added some logic to deal with member specializations. + They should now be added as additional members to a class instead of + being ignored and producing a warning.</li> +<li> Thanks to a patch by Bruce Korb, author of + <a href="http://autogen.sourceforge.net/">autogen</a>, doxygen now + has output support for producing autogen definition files. To do + this set GENERATE_AUTOGEN_DEF to YES in the config file. </li> +<li> The \relates command can now be used for macros as well.</li> +<li> New option INLINE_INHERITED_MEMB which can be enabled to include all + directly and indirectly inherited members inside the + documentation of a class as if they were real members (inspired by + a patch sent by Ted Drain). </li> +<li> Added option EXTRACT_LOCAL_CLASSES which can be used to show + or hide classes and structs defined in source files.</li> +<li> Thanks to an install script written by David Greig, the windows + version of doxygen now comes with a windows installer based on + Jordan Russell's + <a href="http://www.jrsoftware.org/isinfo.htm">Inno Setup</a>.</li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li> Fixed potential bogus link in the references list.</li> +<li> Auto detection of idl files was broken.</li> +<li> Preprocessor did not parse hexadecimal values correctly.</li> +<li> Fixed XML output problem (too many </highlight> tags).</li> +<li> Documentation for nested classes inside other nested classes was + not written to the output.</li> +<li> Fixed problem mixing paragraph commands (like \param) with + hyphen-style lists.</li> +<li> Modules index in LaTeX was broken.</li> +<li> STRIP_FROM_PATH now works for windows-style paths as well. + Thanks to Joël Conraud for the patch.</li> +<li> For functions whose declaration was grouped and whose definition + contained a documentation block with a todo/test/bug item, + the item did not appear in the todo/test/bug list.</li> +<li> In the source browser output, the "=" in variable initializers + was outputted as "==". </li> +<li> Fixed parse problem for typedefs of function pointers returning + a template instance.</li> +<li> Fixed bug in parsing method pointer function arguments of the + form "void f(void (C::*m)() const)"</li> +</ul> +<h1>Doxygen Release 1.2.12</h1> +<h3>Changes</h3> +<ul> +<li> Improved the speed of the todo/test/bug list generation considerably.</li> +<li> The list of all members of a class now shows for each member, + the class in which the member is defined.</li> +<li> Rewrote a substantial part of the source code parser + (SOURCE_BROWSER = YES). It is now more context sensitive and + will generate more/better links.</li> +</ul> + +<h3>New features</h3> +<ul> +<li> Added new option HIDE_UNDOC_RELATIONS that can be set to NO to show + any undocumented inheritance and usage relations from the various + graphs.</li> +<li> Included updates for translations to Chinese (thanks to Charlie Liu) + Slovene (thanks to Matjaz Ostroversnik), Russian + (thanks to Alexandr Chelpanov), Czech (thanks to Petr Prikryl) + and Croatian (thanks to Boris Bralo). Included Petr's translator + adapter simplifications. Included Latin2 patch by Mitja Udovc.</li> +<li> Updated the graph legend page.</li> +<li> Added option REFERENCES_RELATION that can be enabled in combination + with SOURCE_BROWSER to produce for each function + a list of all called/used members/functions/variables. + The reverse list can now be enabled/disabled using the + new REFERENCED_BY_RELATION option.</li> +<li> Added native support for typedefs of the form + "typedef void (__stdcall *name)()", where __stdcall can be any + identifier.</li> +<li> Included a patch by Stephen Goudge which adds an option + EXAMPLE_RECURSIVE to indicate whether or not example files should + be searched recursively.</li> +<li> Included patch by Erik Zeek to add EOL translation to the + config file output.</li> +<li> Doxygen now searches the current directory for source files if + the INPUT and FILE_PATTERNS are empty (thanks to Johan Eriksson + for ideas and code)</li> +<li> Reference to/referenced by information is now included in the XML + output.</li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li> Fixed more RTF problems and added an RTF integrity check that + is performed on the generated RTF output (bracket matching).</li> +<li> Refined the macro detection in the preprocessor a little, so it does + not match constructors and functions so easily.</li> +<li> the % prefix didn't work for scoped items.</li> +<li> References to groups defined in tag files did not work.</li> +<li> documentation for classes inside namespaces was generated multiple + times.</li> +<li> Running doxytag on qt-3.0.0 resulted in a tag file containing + non-breakable spaces.</li> +<li> The \package statement did not work correctly for packages whose name + contained a dot.</li> +<li> Fixed Parser bug for java initializers of the form = "\"/*";</li> +<li> Fixed LaTeX output problem when using \par followed by a (-) list.</li> +<li> Fixed LaTeX output bug in the related page index.</li> +<li> Commands inside a conditional section would still appear in the + result even if the section was disabled.</li> +<li> Included idea by Roberto Bagnara to make running "make" in the LaTeX + output autodetect how many times latex has to be run.</li> +<li> Included a patch by Johan Eriksson to fix a link problem in the + "list of all member" for grouped members.</li> +<li> Fixed potential crash when \todo was used without arguments.</li> +<li> The HIDE_UNDOC_CLASSES option did not work correctly for template + instances when set to YES.</li> +<li> \line, \skipline and \until introduced too many new lines.</li> +<li> Doxygen did not parse "struct {} typedef S;" correctly.</li> +</ul> + +<h1>Doxygen Release 1.2.11.1</h1> +<h3>Changes</h3> +<ul> +<li> Included update for Slovak translation (thanks to Stanislav Kudlac)</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed RTF output bugs.</li> +<li> When preprocessing was disabled, the input was truncated for sources + containing CR's (i.e. sources edited on Windows).</li> +<li> Syntax highlighting C-style comments was broken.</li> +<li> Links to members in undocumented groups were broken.</li> +<li> Deep class hierarchies caused "nested too deep" error in LaTeX output.</li> +<li> providing one documentation block for grouped, related members did + not work.</li> +<li> Documentation pages for documented classes nested inside + undocumented classes or namespaces were not generated.</li> +</ul> +<h1>Doxygen Release 1.2.11</h1> +<h3>Changes</h3> +<ul> +<li> Undocumented friend class declarations now link to their class + if documented.</li> +<li> Undocumented template classes (and other "used" types) + are now shown in the collaboration diagram.</li> +<li> Changed the look of the various indices (file/class/namespace/...) + in the HTML output.</li> +</ul> +<h3>New features</h3> +<ul> +<li> The source browser option now generates links to (documented) + globals and fields. Especially useful for C code.</li> +<li> Input containing CR+LF (DOS/Windows) or CR only (Mac) are now + automatically converted to LF. </li> +<li> New config option SKIP_FUNCTION_MACROS that when set to YES + (the default) makes doxygen's preprocessor automatically remove all + function macros that are alone on a line and do not end with a + semicolon. These are typically used as boiler-plate code and + confuse the parser if not removed.</li> +<li> Added class collaboration and inheritance diagram descriptions + to the XML output. Also added source browser output for each file.</li> +<li> Added a developers part to the manual, with some information on + how doxygen is structured internally.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Using HIDE_UNDOC_MEMBERS=YES and ENUM_VALUES_PER_LINE=1 resulted in + blank lines in the HTML-output.</li> +<li> "friend class A::B" caused a bogus warning.</li> +<li> Fixed problem generating tag files for the Qt-3.0.0 beta releases.</li> +<li> Fixed parameter list layout problem in the HTML output.</li> +<li> Fixed some (all?) compile problems on Solaris.</li> +<li> Class hierarchy was not correct if a template class inherited from + a template argument, which was also a documented class.</li> +<li> When substituting template arguments, default values of + template arguments were not substituted themselves.</li> +<li> Fixed a number of XML output bugs (thanks to Christian Hammond).</li> +<li> Fixed bug parsing character literals.</li> +<li> Fixed bug in RTF output (bracket mismatch).</li> +<li> Inializer of the last enum value of an enum did not always appear.</li> +<li> Dots were removed from return types in Java.</li> +<li> In some cases a broken "More..." link was generated after + a brief class description.</li> +<li> Text of a section title containing was truncated if it contained an + asterix.</li> +<li> Fixed crash bug when filtering CR+LF's from input (thanks to Petr + Prykril).</li> +<li> Fixed generated makefile dependencies for USE_PDFLATEX = YES + (thanks to Marcus Holland-Moritz)</li> +<li> "\retval #VALUE" now links to VALUE if documented. The same works + for \exception and \throws + (and since the argument is a class no # is needed).</li> +<li> Sorting the alphabetical list was broken for nested classes.</li> +</ul> +<h1>Doxygen Release 1.2.10</h1> +<h3>New features</h3> +<ul> +<li> Relations between templates and their instances are now visualized + in the inheritance and collaboration graphs. Can be disabled + by setting TEMPLATE_RELATIONS to NO in the config file.</li> +<li> A Java package can now be documented using a comment block containing a + @package command or by putting a documentation block in front of a + package statement.</li> +<li> Added new command \dotfile which can be used to include a user + specified dot file as an image in the documentation. The new config + option DOTFILE_DIRS should be used to specify directories in which + doxygen should look for dot files (thanks to Samit Basu for the patch).</li> +<li> Added new build target macosx-c++ to build doxygen for Mac OS X + (Thanks to Jason Harris for telling me what needed to be changed).</li> +<li> Added --enable-langs option to the configure script which can be used + to compile-in support for a specified set of languages (thanks to + Vitaly Repin for the patch).</li> +<li> Included update for Russian & Italian translation.</li> +<li> Included translator.pl update received from Petr.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fix compile problem for the Irix compiler (thanks to Dirk Reiners)</li> +<li> Some generated &nsbp; entities where missing a ; in the HTML output. + For some browsers this resulted in argument types & names being + glued together.</li> +<li> The heading of parameter and return value lists was not bold anymore in + the HTML output. </li> +<li> "Reimplemented to/from" member links now work between template base + classes and their derived classes.</li> +<li> Not all documented templates class were regarded as documented + (unless EXTRACT_ALL was set to YES).</li> +<li> Fixed recursive lock-up problem for recursive templates of the form: + template<class T> class A : public A<typename T::B> {}</li> +<li> The labels in the alphabetical list were broken when namespaces were + used.</li> +<li> An error was given for import statements in Java sources.</li> +<li> The "list of all members" was no longer generated for nested classes.</li> +<li> Fixed bug in XML output causing mis matched <para> tags.</li> +<li> Fixed parse problem for enum initializers like: "enumVal = A<T,C>::val" </li> +<li> \hideinitializer did not hide the initializer of enum values.</li> +<li> Undocumented enums and enum values now behave correctly when + HIDE_UNDOC_MEMBERS is set to YES.</li> +<li> Fixed a problem with using \if inside alias definitions.</li> +<li> Fixed & changed the layout of function arguments a little.</li> +<li> Typedef struct{}Name was not parsed properly without adding more spaces.</li> +<li> Static initializer blocks were not properly parsed in Java classes.</li> +<li> Members of an unnamed namespace are now treated as static, and will + only appear in the documentation if EXTRACT_STATIC is set to YES.</li> +<li> Classes are sorted by their name, i.s.o. full scope again.</li> +<li> Improved argument matching for members defined within (nested) + namespaces.</li> +</ul> + +<h1>Doxygen Release 1.2.9.1</h1> +<h3>Changes</h3> +<ul> +<li> Bug/test/todo items of members are now grouped + together with their compound.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added three new conditional commands: \ifnot, \else and \elseif + (thanks to Fabian Cenedese).</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> The .spec file still assumed the --with-xmlgen switch was available.</li> +<li> Template instances caused double entries in the class list + (in LaTeX) and broke RTF output.</li> +<li> \if and \endif can now be used to make structural commands like + \brief, \ingroup, and \defgroup conditional.</li> +<li> The "const" in "func(B * const)" was parsed as a variable name.</li> +<li> Template specializations of the form A<N::C> where not handled + properly.</li> +<li> Putting \relates in a function documentation block that was + within a namespace, while referring to another namespace did not work.</li> +<li> Doxywizard always complained it could not read the config file.</li> +<li> Doxywizard did not properly update boolean and integer values.</li> +<li> Fixed recursive lock-up problem when recursive templates were used.</li> +<li> LaTeX output was broken when PDF_HYPERLINKS was enabled and templates + were used.</li> +<li> Private friends were hidden even though friends have no access control.</li> +<li> Argument matching was sensitive to spaces in some cases.</li> +<li> Bug/test/todo item in class members did not always result in the + generation of the list. </li> +</ul> + +<h1>Doxygen Release 1.2.9</h1> +<h3>Changes</h3> +<ul> +<li> Friend class declarations are now treated as normal members.</li> +<li> Completely rewrote the way templates are handled. + Doxygen now (internally) computes all template instances it encounters. + This has the following advantages: + <ul> + <li>Template instances are now shown in the hierarchical index + and in all class diagrams in a uniform way.</li> + <li>The list of all members is now correct for classes deriving + from a template.</li> + </ul> + Since there is a lot of new code, some more testing won't hurt + to mature the code. If you are using templates, please try this + version for me and report any problems.</li> +<li> Started moving the XML output generator back into doxygen. + As a result the GENERATE_XML option has reappeared.</li> +<li> Function arguments names are now nicely aligned in the generated + HTML output. Thanks to Joe Bester for doing most of the work. </li> +</ul> +<h3>New features</h3> +<ul> +<li> Added GNU install tool auto detection to the configure script.</li> +<li> Included update for French translation (thanks to Xavier Outhier) + Olexij Tkatchenko has added support for the Ukrainian language. + Included update for Portuguese and Brazillian.</li> +<li> Added --docdir option to the configure script.</li> +<li> Using the non-commercial version of Qt for windows, it is now + possible to build doxywizard for windows.</li> +<li> Made preprocessor parse error messages somewhat more informative.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Image references to dot images were broken in the RTF output + (thanks to Henning Moll for the fix).</li> +<li> Linebreaks are now done with \par instead of \line in the RTF + output (thanks to Henning Moll).</li> +<li> Removed bogus warnings when parsing tag files.</li> +<li> The detailed description in a @name block can now be more than + plain text.</li> +<li> Included fix for the tree view script for the mozilla browser + (thanks to Alec Panovici).</li> +<li> Grouping members with the same signature but with a different scopes + is now possible.</li> +<li> Related functions could not be grouped.</li> +<li> MAN_LINKS option was broken (fixed by Patrick Ohly).</li> +<li> Including a file with \include in LaTeX caused the leading text + to appear in a smaller font size.</li> +<li> Improved the documentation and spec file (thanks to Jens Seidel). + Fixed some typos in the docs. Thanks to Wouter Slegers.</li> +<li> JavaDoc style links such as @{link #var} and @{link #var label} + now work.</li> +<li> "doxygen -g -s" now creates a file named Doxyfile i.s.o "-s" </li> +<li> Fixed a null pointer referencing problem (thanks to Nick Pratt)</li> +<li> 8-bits characters are now correctly handled within the argument + of \b, \c or \e.</li> +<li> Reimplemented links were broken for grouped members (thanks to + Johan Eriksson for the fix).</li> +<li> Enabling the Tree view didn't result in proper RTF and LaTeX output + (thanks to Paul Sydney for the fix).</li> +<li> Merged patches by Joe Bester: + <ul> + <li>Could not link to @anchors in the main page on external packages.</li> + <li> All external modules and pages were linked to or appended + (even the TODO page, etc), even when EXTRACT_ALL is set to NO.</li> + <li> The section containing structs and unions is labeled + "Class Documentation" (in the English translation) even when + the OPTIMIZE_OUTPUT_FOR_C was set to YES.</li> + </ul></li> +<li> using the IDL keyword "import" in other languages did not work + correctly.</li> +<li> members of a privately inherited base class were not shown in the + list of all members, while they were accessible from the derived class.</li> +<li> Reworked part of the template handling. Doxygen should now be + capable of handling nested template classes correctly. Please test + this if you are using these contructs. Thanks to Christoph Koegl + for providing some difficult test cases.</li> +<li> Fixed parse problem when parsing << as part of the first + argument of a typedef.</li> +<li> Further improved typedef resolution.</li> +<li> The LATEX_HEADER-config option disabled the \mainpage-output + (thanks to Eric Reinhart for the fix).</li> +<li> Merged a patch by Erik Zeek, to allow compilation under BCB5</li> +<li> Spaces in arguments of preprocessor macros were not treated properly.</li> +<li> Fixed argument matching bug that caused doxygen to treat + f(type t) and f(type_t t) as the same function. + "void func(const ::A)" was interpreted as "void func(const::A)", + where "const" would have to be a class name.</li> +<li> static file members were not auto-linked even if EXTRACT_STATIC was set + to YES.</li> +</ul> + +<h1>Doxygen Release 1.2.8.1</h1> +<h3>Changes</h3> +<ul> +<li> Enum values of a grouped (with @ingroup) enum are now automatically + added to the same group.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Included update for Brazilian translation.</li> +<li> Add support for &lt; &gt; &amp; &apos; &quot; + in the documentation, + since these commands after occur in Java documentation.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Parameters appeared in the documentation for undocumented + arguments (and twice if they were also documented with @param). </li> +<li> Specifying boolean tags twice in the config file resulted in + an invalid value (both boolean values were appended).</li> +<li> Fixed a number of typos (thanks to Jens Seidel).</li> +<li> When a paragraph header was directly followed by an + item list doxygen did not render the first item properly.</li> +<li> The "More..." link was often omitted for grouped members. </li> +<li> "dangerous" characters like ":" are now escaped from man page + file names</li> +</ul> +<h1>Doxygen Release 1.2.8</h1> +<h3>Changes</h3> +<ul> +<li> Doxygen now uses a more natural naming scheme for man pages.</li> +<li> Man page and rtf output are now disabled by default.</li> +</ul> +<h3>New features</h3> +<ul> +<li> The dot generated inheritance and collaboration graphs for classes + should now show the proper template instantation for the derived/used + classes. For instance it should show that class S uses class V + (indirectly) in the following example: + <pre> + class V {}; + template<class T> class U1 { T *m_t; }; + template<class T> class U2 { U1<T> *m_t; }; + template<class T> class B1 { U2<T> *m_t; }; + template<class T> class B2 : public B1<T> {}; + class S : public B2<V> {}; + </pre> + Please report any example of class hierarchies that are not shown + properly.</li> +<li> Added doc/translator.pl script created by Petr Prikryl. + Its main purpose is to extract information from doxygen's sources + related to internationalization (i.e. the translator classes), to + avoid duplication of information (i.e. doc/language.doc is now + generated) and to generate reports about the status of the translations + (e.g. missing methods). </li> +<li> Stanislav Kudlac added support for Slovak language and + Erik Søe Sørensen added support for Danish. + Applied language updates for + Italian, Croatian, Spanish, Czech, German & Russian.</li> +<li> Added support for "KBD" HTML tags (thanks to Albin Wu).</li> +<li> Added man patch by Patrick Ohly which allows to create freestyle + man pages using \page and puts man page with non-default extension + in the correct directory.</li> +<li> Added MAN_LINKS option (thanks to Patrick Ohly for the patch).</li> +<li> Added grouping patches by Patrick Ohly: + + There are now three commands to define a group: + <pre> + \defgroup name title + \addtogroup name [title] + \weakgroup name [title] + </pre> + + \defgroup must be used exactly once for a group, so you should + provide a title. Without the title you will get a warning and + doxygen will use the name as title (this is the old behaviour). + <pre> + /** \addtogroup name */ + </pre> + can be used to add documentation or + members to a group (as in 1.2.7), but the group is created if + it doesn't exist yet. You can provide the title later + with another block: + <pre> + /** + * \addgroup name title + * documentation + */ + </pre> + <p> + Setting different titles will trigger a warning without overwriting + the title once more. + </p> + <p> + \weakgroup is exactly the same as \addtogroup, but if a member + is put into such a group with <code>\weakgroup name @{ @}</code> + and into + another group with <code>\[def|addto]group @{ @}</code>, then it will be + placed into the other group without issuing a warning. + </p> + <p> + Actually there is a four-level hierarchy for grouping with + (from strongest to weakest) \ingroup, \defgroup, \addtogroup, + \weakgroup. You will get warnings when putting members into + groups with commands of the same level, but only when you really + document this member. This will not trigger a warning and put + variable a into Group1: + </p> + <pre> + /** \addtogroup Group1 */ + /*@{*/ + /** this is the real group */ + extern int a; + /*@}*/ + + /** \addtogroup Group2 */ + /*@{*/ + extern int a; + /*@}*/ + </pre></li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed a bug in the LaTeX output generation (empty lists).</li> +<li> Doxygen can now distiguishing f(const A) from f(const B) + even though they match from a syntactical point of view.</li> +<li> A template base class that is actually an inherited template + argument of the derived class is no longer shown in the output + indices and hierarchies.</li> +<li> TOC_EXPAND could result in a broken tree view + (patch by Alexandr Chalpanov).</li> +<li> If a base class had member names which has the same name as enumerator + values in a derived class, the enumerator values did not show up in + the documentation (thanks to John Harris for reporting this).</li> +<li> Applied a number of patches sent by Jens Seidel.</li> +<li> Fixed compiler limit problem on Windows (thanks to Trevor Robinson).</li> +<li> Add -dBATCH in system calls to ghostscipt (needed for formulas) + to avoid a command prompt for newer versions of ghostscript + (thanks to Marvin Wolfthal).</li> +<li> In some situations doxygen wanted to write a files containing a \n.</li> +<li> Environment variables can now also be used for non-string values + in the config file, like for example QUIET = $(QUIET_ON)</li> +<li> Fixed a number of typo's in the docs (thanks to Philippe Lhoste & + Jens Seidel).</li> +<li> Inheritance through typedefs within a namespace did not yield the + correct inheritance diagram.</li> +<li> References to anchors in grouped members or pages were not + correctly resolved.</li> +<li> Fixed a problem with argument matching for arguments that contained + classes imported via a using declaration.</li> +</ul> +<h1>Doxygen Release 1.2.7</h1> +<h3>Changes</h3> +<ul> +<li> The configgen tool is now replaced by a more dynamic parser. This + will allow future output generators to add specific options without + changing or recompiling the doxygen engine. Doxywizard has also been + updated to use this new parser. Developers that wish to add new + configuration options, please look at Config::create() in src/config.l</li> +<li> Changed the way the translators work internally (thanks to Petr + Prikryl for ideas and code) and updated the documentation regarding + language support and maintenance. Users of languages other than + English will get a warning message if the translation for their + language is not up to date.</li> +<li> Did some internal cleaning up to make things + more consistent and easier to maintain. Please let me know if you + think something has been broken in the process. </li> +<li> Doxygen now uses a more unique output file name mangling scheme, which + generates unique file names even if entity names (like class names) + only differ in case.</li> +<li> Setting ALLEXTERNALS = NO now hides external pages in the page index.</li> +</ul> + +<h3>New features</h3> +<ul> +<li> \image is now supported for RTF output (thanks to Joe Ninety).</li> +<li> New RTF_EXTENSIONS_FILE that can be used to configure the RTF output + (thanks to Joe Ninety for the patch).</li> +<li> Added new command \htmlinclude that can be used to include a + HTML file as is in the HTML documentation. + (thanks to Uwe Wojak for the patch)</li> +<li> &nbsp; can now be put in the documentation to force a + non-breakable space.</li> +<li> Included support for the gcc extension #include_next + (thanks to Jac Goudsmit for the patch). </li> +<li> Included translation for Brazilian Portuguese sent by Fabio Jun + Takada Chino. Add update for the Czech translation + (thanks to Petr Prikryl). Also included updates for German + (thanks to Jens Seidel), Russian (thanks to Alexandr Chelpanov) and + Croatian (thanks to Boris Bralo).</li> +<li> Added RPM spec file update by Jens Seidel.</li> +<li> Added SHORT_NAMES option which can be set to YES to make doxygen + generate short (but non-informative) output file names.</li> +<li> Added new command \addtogroup that can be used to extend a group + defined with \defgroup with extra members and/or documentation.</li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li> Inline sources weren't appearing for undocumented non-inline members.</li> +<li> Doxygen did not subgroup in case the parent group was + found after the child group. (thanks to Johan Eriksson for the patch + that fixes this).</li> +<li> Specifying a directory at the INPUT that ends with a \ did not + make doxygen recurse the down the directory tree in Windows.</li> +<li> Fixed two small bugs that caused segfaults on + NetBSD and Linux on 64bit Alpha's (thanks to Rex McMaster + and Ovidiu Toader).</li> +<li> "Referenced by" section now starts at a new paragraph + (thanks to Joe Ninety).</li> +<li> Setting OPTIMIZE_OUTPUT_FOR_C still produced some C++-ish + sentences for the list of all struct/union fields.</li> +<li> Undocumented friend functions were listed as friend classes.</li> +<li> A CORBA IDL union with a switch was not always recognised correctly. </li> +<li> doxygen did not handle try-function-blocks with multiple catch clauses + properly.</li> +<li> \bug and co. were not working for static members.</li> +<li> Formulas weren't correctly re-generated when changed.</li> +<li> relative include paths containing /../ were not linked, since they + were not normalized.</li> +<li> Locally included files where not searched in the directory containing + the file that did the inclusion, only in the paths specified with + INCLUDE_PATH. </li> +<li> Fixed problem with numbers in the generated eps file for non-english + systems (thanks to Vsevolod Novikov).</li> +<li> Generated bookmarks in the RTF output not starting with a letter caused + problems (thanks to Jonathan Beaupre for the fix).</li> +<li> Putting &aring; in the docs wasn't working as expected.</li> +<li> Fixed a number of typo's in the docs (thanks to Jens Seidel and + Philippe Lhoste).</li> +<li> Autolinking could create links inside user defined HTML links.</li> +<li> Email addresses in the docs starting with an "a" and put inside sharp + brackets were not properly displayed (thanks to Abramo Bagnara for + the fix).</li> +<li> Fix several man page output bugs (thanks a patch by Patrick Ohly). </li> +</ul> + +<h1>Doxygen Release 1.2.6</h1> +<h3>Changes</h3> +<ul> +<li> The \bug command now works like the \todo and \test commands; each item + documented with \bug will be cross-referenced with a bug list. The list + can be disabled by setting GENERATE_BUGLIST to NO in the config file.</li> +</ul> + +<h3>New features</h3> +<ul> +<li> Included updates for Croatian, Czech and German, + Japanese, Italian and Russian translations.</li> +<li> Added option GENERATE_CHI that can be used to control whether + or not an .chi file should be generated by the HtmlHelp compiler + (default is NO).</li> +<li> Added option DOT_CLEANUP that when set to NO leaves the intermediate + dot files in the output directory.</li> +<li> Added option BINARY_TOC to enable/disable use of a binary table of + contents in a .chm file (thanks to Martin Slater for the patch).</li> +<li> Added option TOC_EXPAND to when enabled shows the members of a + group in the treeview and HTML help table of contents (thanks again + to Martin Slater).</li> +<li> Included group support for man page output (thanks to Joe Bester for + the patch).</li> +<li> Added option SHOW_USED_FILES that can be used to disable the + list of used files normally generated at bottom of the documentation + of classes and structs (thanks to Joe Bester).</li> +<li> Updated the doxbar tool: + <ul> + <li> the addin no longer requires administrator privileges to work + (thanks to Michael Beck)</li> + <li> the existance of files is now checked (thanks to Pekka Pessi).</li> + <li> .odl and .inl files are recognised (thanks to Pekka Pessi).</li> + </ul></li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li> doxygen.css was also used by the treeview even if the user specified + his/her own stylesheet.</li> +<li> Inline source blocks (INLINE_SOURCES=YES) were sometimes truncated + at the wrong closing bracket (thanks to Jac Goudsmit for the fix).</li> +<li> Some references to subsections were not correctly generated + (thanks to Stefan Ruppert for the fix).</li> +<li> Fixed IDL union parse problem (thanks to Richard Hash).</li> +<li> Latex output sometimes contained $\ast$ for code fragments.</li> +<li> lonely *'s were not removed inside a <pre> and <code> blocks. </li> +<li> Applied patch sent by Joe Bester to make the treeview + javascript work with Mozilla. Still has some problems though.</li> +<li> Fixed a bug in code parser regarding string detection, inside + the argument list of a function.</li> +<li> Using a command alias starting with \class (or other structural + commands) did not give the expected result.</li> +<li> A function pointer returned as the template argument of a template + class that itself is the return type of a function was not + parsed properly.</li> +<li> In IDL, typedef's followed by an attribute list where not parsed + properly. </li> +<li> The list of all members now shows all privately accessible members + if EXTRACT_PRIVATE is set to YES, instead of just the non-inherited + private members.</li> +<li> Fixed autolink problem for grouped members.</li> +<li> Mutliple static global functions with the same name (but in different + files), which were forward declared, could make doxygen put + the wrong documentation block at the wrong global function.</li> +<li> Support for Norwegian was not enabled.</li> +<li> The correct charset is now set when the treeview is used (thanks to + Boris Bralo).</li> +<li> For inline source fragments of member functions, the types + of the arguments are now also taken into account for + cross-referencing.</li> +<li> A sentence ending with a dot, directly followed by a \n was not + handled correctly.</li> +<li> File reference extracted from a tag file could something cause + doxygen to generate a bogus warning. </li> +<li> Parsing large arrays of hex numbers took very long when the source + browser was enabled.</li> +<li> Fixed install rule in the Makefile</li> +<li> Doxygen now parses try-function-blocks correctly.</li> +<li> A zero initialized function pointer inside a namespace was + misinterpreted as a pure virtual function.</li> +<li> Applied Joe Bester's patch that fixes some LaTeX output problems.</li> +<li> Java Package info was not correctly read from a tag file.</li> +<li> Todo items in the documentation of grouped members were not + correctly referenced from the todo list.</li> +<li> Removed bogus "a" entries from appearing in doxysearch's search results.</li> +<li> Putting <a href="..."><img src="..."></a> in the + docs will now work as expected for HTML.</li> +<li> Fixed problems with >pre>...>/pre> block in LaTeX.</li> +<li> Putting &ccedil; in the docs now preduces a c-cedille.</li> +</ul> + + + +<h1>Doxygen Release 1.2.5</h1> +<h3>Changes</h3> +<ul> +<li> Split up doxygen into a library and an executable part, + and moved the XML generation part to a separate front-end + (see addon/xmlgen).</li> +<li> Having SOURCE_BROWSER set to YES does not automatically + imply that a member is documented.</li> +<li> Typedefs of classes are now shown in (dot) inheritance graphs with + their typedef name instead of the resolved name.</li> +<li> Upgraded Qt files to 2.2.3 to fix some compile issues.</li> +</ul> + +<h3>New features</h3> +<ul> +<li> Added initial support for Java. The parsing of Java code + should be ok. There is a new "packages" index, with a list + of all parsed Java packages, each of which can be documented + (but not yet in the Java way using package.html) and contains + links to the interfaces and classes in the package. The code + parser still needs work (It doesn't do much cross-referencing yet). + Also any explicit package scope for classes is basically ignored, + so you cannot have two classes with the same name in different + packages. + Let me know if you know of other improvements.</li> +<li> Added support for the Java style of linking (using + {@link package.object#item()} as syntax)</li> +<li> Added file, compound and namespace members to the treeview index.</li> +<li> New configuration option MAX_INITIALIZER_LINES that can be + used to control when/if the initial values of variable and defines + are shown in the documentation.</li> +<li> OPTIMIZE_OUTPUT_FOR_C flag that when set to YES makes doxygen produce + output that looks more natural for C programmers.</li> +<li> Included Czech language update sent by Petr Prikryl. </li> +<li> Added "Binary TOC=YES" and "Create CHI file=YES" to the HtmlHelp + project file for better integration with MSDN.</li> +<li> I've updated the doxbar tool: + <ul> + <li> sources are appended to the INPUT line of the template config file</li> + <li> sources mentioned in the .dsp with quotes (i.e. "c:\bla.cpp") are now + handled properly (thanks to Robert Radtke for the fix).</li> + </ul></li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li> Fixed 0-pointer bug that could crash doxygen in some cases.</li> +<li> Starting a list in a brief JavaDoc-style description splitted + the list into two invalid parts if a list item ended with a dot.</li> +<li> Fixed a problem with linking to grouped class members.</li> +<li> Indenting of code fragment in LaTeX output was not always correct. + Also for code lines starting with a * the * was removed.</li> +<li> Typedefs where not properly extracted from tag files.</li> +<li> Links to operators in a "See also" section did only work if the + arguments list was given.</li> +<li> Fixed parse bug in the code parser for the case where "<" + and ">" were found on a line but couldn't possibly be a + template scope.</li> +<li> The "More..." links was incorrect for members of class grouped + with @ingroup.</li> +<li> Fixed preprocessor parse bug that occurred when parsing string + literal "...\\" as an macro argument.</li> +<li> Fixed buffer overflow problems when parsing very long input lines + (thanks to Arnault Bonafos).</li> +<li> References to pages and anchors imported via tag files did not work.</li> +<li> Local references to page anchors did not work.</li> +<li> Windows only: doxygen leaked process handles while running dot + (thanks to Jeroen ter Hofstede for the fix).</li> +<li> Undefining (with #undef) a define set using PREDEFINED now + longer has an effect.</li> +<li> Functions appeared twice in modules if the prototype and definition + did not match exactly.</li> +<li> the word "operator" in todo items caused problems.</li> +<li> Fixed some more problems with references to external pages, + local references to sections, and naming conflicts with multiple + todo/test lists.</li> +<li> "char a:1, b:2" resulting in output including both bitfields for b.</li> +<li> The protection level of the members in the all-member list was not + always correct.</li> +<li> Fixed some typos in the Dutch and German translations.</li> +<li> \todo's in the docs of #define did not end up on the todo list.</li> +<li> "typedef volatile struct {} name;" was not handled properly.</li> +<li> HTML header and footer file are now read only once.</li> +<li> Fixed 2 memory leaks.</li> +</ul> + + +<h1>Doxygen Release 1.2.4</h1> + +<h3>Changes</h3> +<ul> +<li> New XML-based tag file format. <p> + <b>Note:</b> If you are already using tag files, you need + to regenerate them, because the old format is no longer supported!</p></li> +<li> Removed the "No description available" for classes without brief + description in the compound list. </li> +<li> User defined groups (a.k.a. modules) are now shown in a hierarchy.</li> +<li> If a function and its prototype are both inside different documented + files then they may both be documented separately and will appear + as such in their file documentation + If you only document the header file and not the source + file you can still put your documentation in front of the function + definition as before.</li> +<li> For unresolved base classes of a class inside a namespace, doxygen + now guesses they are defined outside the namespace (was inside).</li> +<li> Performance: replaced O(n^2) sort routines for member lists + with O(nlog(n)) versions.</li> +</ul> + +<h3>New features</h3> +<ul> +<li> There is now an HTML Help like tree view, that can be enabled + by setting GENERATE_TREEVIEW to YES. + This feature requires a browser that supports frames and javascript. + Note that frame/page-resizing requires a manual reload with + Netscape 4.x at the moment (it is a known netscape bug). + (thanks to Ken Wong for providing the code to generate the tree + in the proper format).</li> +<li> Added new option TREEVIEW_WIDTH that can be used to set the initial + with of the treeview frame.</li> +<li> A warning is now generated for invalid \link targets + (again thanks to Ken Wong).</li> +<li> Wang Weihan sent an update for the Chinese translation which is now + included. Included update for the Russian and Italian language as well.</li> +<li> Support for Borland C++ and MINGW compilers for Windows + (thanks to Oliver Brandt for the patch). </li> +<li> Groups and pages defined in external documentation (i.e. with tag files) + can now be referenced using \ref.</li> +<li> Pages can now be put into groups using \ingroup (thanks to Ken Wong). + A group with only pages is rendered as a page (the group itself) + with subsections (the inserted pages). </li> +<li> \ingroup can now be put in a one line comments (thanks to Patrick Ohly)</li> +<li> \ingroup in a comment block before a comma separated list of + variables is now applied to all variables (as is the documentation + itself). (thanke to Patrick Ohly for the patch)</li> +<li> @{ .. @} blocks can now be used for normal groups as well + (thanks to Trevor Robinson for the patch). Here is an example: + <pre> + /** @defgroup mygrp My Own Group + * @brief My brief group description. + * @{ + */ + + /** @name My member group + * @{ + */ + /** This is a function */ + void func1(); + + /** Another function */ + void func2(); + + /** This is a typedef */ + typedef int Int; + + /** @} */ + + /** This is a variable */ + int var; + + /** This is a define */ + #define DEF def + + /** @} */ + </pre></li> +<li> Normal groups can now also be nested using /*@{*/ ... /*@}*/ blocks + (thanks to Patrick Ohly for the patch)</li> +</ul> + +<h3>Bug fixes</h3> + +<ul> +<li> If source files were put in the input before header files, the + declaration against definition matching did not work for + global functions (thanks to Frank Warmerdam for reporting this). </li> +<li> The template argument type and name of template functions + were not separated by a space.</li> +<li> A comma separated list of member reference variables (like int &i,&j;) + was not parsed correctly.</li> +<li> Removed bogus warning when excluding non-existent files or directories </li> +<li> Fixed problem parsing nameless bit padding fields.</li> +<li> Fixed a pointer bug in the XML generation that could crash doxygen.</li> +<li> The code parser did not cross-reference functions inside namespaces + and nested classes.</li> +<li> Only the first member of a member group was shown in a group + definition.</li> +<li> REPEAT_BRIEF = NO now works for class, namespace and file documentation + as well.</li> +<li> No macro-expansion was done on a file that was #include'd in a body + of a class or enum.</li> +<li> Fixed macro concatenation bug in the preprocessor.</li> +<li> Global functions that were \ingroup'd could appear twice in a group + in some cases.</li> +<li> % and & can now be used in the URL in the documentation.</li> +<li> \c,\e and \b now also generate a link if they have the name of a + documented file as their argument.</li> +<li> Made the FILTER_SOURCE_FILES actually do something + (it was always treated as enabled).</li> +<li> Fixed two bugs in the autolist feature (thanks to Ken Wong)</li> +<li> Fix macro expansion bug in the preprocessor, when macro's + where used as the argument of an #include.</li> +<li> // did not work inside the argument of a \todo or \test command. </li> +<li> Doxygen did not parse arrays of function pointers properly.</li> +<li> Fixed parse bug for templates with nested template arguments.</li> +<li> Fixed parsing problem for template arguments + containing << or >> operators</li> +<li> Fixed some problems with the DOT_PATH config option on windows.</li> +<li> Group title and file names are now shown in the latex index instead + of the label names.</li> +<li> Portability: Added workaround for SGI MipsPro compiler, that + (hopefully) prevents it from crashing while compiling doxygen. + Worked around a number of compile problems with HP's C++ compiler.</li> +<li> Fixed problem with doxygen calling epstopdf.bat in Windows.</li> +<li> Fixed some problems that occurred when regenerating the + doxygen manual on Windows.</li> +<li> Fixed some output formatting problems regarding templates. </li> +<li> Global functions, typedefs, and enums did not get linked when + were read in via a tag file.</li> +<li> Using /* inside an \code ... \endcode block confused the parser.</li> +</ul> + +<h1>Doxygen Release 1.2.3</h1> + +<h3>Changes</h3> +<ul> +<li> enum values are now packed in groups of 4 in the declaration part + of the HTML docs.</li> +<li> <code>JAVADOC_AUTOBRIEF</code> is now set to NO by default, because too many + people expect the JavaDoc-style to behave as the Qt-style and + not in the way described in the JavaDoc spec.</li> +<li> The distribution now includes the part of Qt-2.2.0 that is needed for + compilation of doxygen, doxytag, and doxysearch. I've also created the + missing files for Windows. This allows compilation of doxygen on systems + without X11 or the full Qt. For doxywizard Qt-2.2.x is still required + however.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Support for the Slovene language (thanks to Matjaz Ostroversnik)</li> +<li> Bit fields for struct members are now shown in the documentation.</li> +<li> Enabled "favourites" and "Full text-search" for the generated + HTML Help browser files. </li> +<li> Added support for M$-IDL properties. The "methods:" section + now also works.</li> +<li> Added support for Borland C++ builder "__published:" and "__property:" + sections. (__published: is just treated as public:).</li> +<li> Included update for the Czech language. Thanks to Wang Weihan there is + also support for Chinese output now.</li> +<li> Added a config option <code>WARN_LOGFILE</code> to log warnings to a + file for those + people that have to use certain "operating systems" that do not support + redirection of stderr to file.</li> +<li> Added a config option <code>GENERATE_LEGEND</code> that can be used to disable the + legend page normally generated for explaining dot graphs.</li> +<li> Thanks to a patch send by Micha Bieber, doxygen can now be run from + inside doxywizard.</li> +<li> Environment variables can now be used in the <code>@INCLUDE_PATH</code> + and <code>@INCLUDE</code> tags in the config file (thanks to Stephen + Goudge).</li> +<li> Windows compilation/installation instructions are updated (thanks to + Petr Prikryl)</li> +<li> New config tag <code>ENUM_VALUES_PER_LINE</code> to set the number of + enum values + that are grouped on one line (default=4).</li> +<li> #include's inside the body of a class are now expanded. </li> +<li> The source browser files can now by filtered using the + <code>INPUT_FILTER</code> if <code>FILTER_SOURCE_FILES</code> is set + to YES (thanks to Paul Strauss).</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> For #foo in member documentation doxygen was trying to find + a global variable named foo instead of a member. Use ::foo + to make an explicit link to a global variable in case there is + also a member named foo. </li> +<li> A bullet list ending with a \par sometimes caused the paragraph to + be indented.</li> +<li> When <code>STRIP_CODE_COMMENTS</code> was set to NO, and /*!< .. */ style + comments were used, the code parser got out of sync with the + documentation parser.</li> +<li> (Hopefully) fixed some Solaris compile problems + (thanks to John Sturton).</li> +<li> documentation for private slots appeared in the documentation even + though <code>EXTRACT_PRIVATE</code> was set to NO.</li> +<li> \relates was not working for nested classes or classes defined + within a namespace.</li> +<li> namespace alias support was broken with respect to inheritance + relations containing aliased namespace names.</li> +<li> The documentation of members that are put into a + group (with \ingroup) is now removed from the natural + container of the member. Also the links are now corrected.</li> +<li> Links from the code parser to static global functions are + now always pointing to the correct file (thanks to Bill Soudan + for the patch).</li> +<li> Fixed HTML bug in non-indexed namespace member lists. </li> +<li> Using `:' inside ID's caused problems for some + XML parsers. I'm now using "__" instead. Also removed @ from appearing + in the output when annonymous compounds were used.</li> +<li> Fixed output bug that is caused by nesting paragraph commands + inside autolists.</li> +<li> Doxygen no longer generates source files for input files that + end with .doc or .txt</li> +<li> Fixed argument matching problem that could result in parameter name + changes for overloaded functions. Also fixed buglet for + matching things like "unsigned int" against "unsigned int name"</li> +<li> Fixed qtools compile problem with ./configure --english-only problem</li> +<li> Putting documentation between the class and its body now also works + if the class has base classes.</li> +<li> Fixed parse problem for const function pointers like + "int* (* const name)(long);"</li> +<li> Slightly changed the HTML output to work around display "bugs" in + Konquerer and Opera (thanks to Achim Spangler).</li> +<li> Examples in compress HTML help of doxygen's manual has absolute links.</li> +</ul> + +<h1>Doxygen Release 1.2.2</h1> +<h3>Changes</h3> +<ul> +<li> Verbatim headers are now also created if a documented header + file does not contain a struct or class (unless VERBATIM_HEADERS = NO + of course).</li> +<li> For member groups, where only the first member is documented, that + documentation is no longer automatically copied to all other + members of the group. You can still enble this by setting + DISTRIBUTE_GROUP_DOC to YES in the config file.</li> +<li> The \mainpage block now gets its own chapter in Latex/RTF</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added support for KDE-2 IDL (more specific: k_dcop member sections).</li> +<li> New ALIASES config option which allows you to add one or more user + defined aliases (a.k.a. macros) that can be used as commands in the + documentation. For instance: + <pre> + ALIASES = "sideeffect=\par Side Effects:\n" + </pre> + allows you to put @sideeffect in the documentation, which doxygen + will replace by "\par Side Effects:", before parsing. As a result + a formatted paragraph with a "Side Effects" header will appear. + Note that the \n's are replaced by real newlines, so in the example + you can put your paragraph text directly after the sideeffect command.</li> +<li> Added language support for Hungarian (Thanks to György Földvári), + Korean (thanks to Richard Kim), and Romanian (thanks to Alexandru Iosup). + Received language updates for Italian, Polish, Croatian, Czech, + Hungarian and Russian.</li> +<li> Added support for namespace aliases.</li> +<li> Added RTF patch from Alexander Bartolich. Here is his description of + the changes: + "The following patch of rtgen.cpp allows to read *complete* style + definitions from rtfstyle. This includes \sbasedon, \snext, \additive + and actual style names. + + If this data is missing the default value is used. + This means old rtfstyle-files can be used without change, with one + exception: + Reset is no longer considered a style. Since unknown style names + are simply ignored I don't consider this a big problem. + There is no means to write rtfstyle in old format, however. + "</li> +<li> Documentation can now also be put after the initializer of a constructor + but before the body. </li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> RTF output was broken w.r.t. dot generated images. </li> +<li> Spacing and blanks inside <pre> ... </pre> block were not + properly preserved.</li> +<li> Fixed lock-up when parsing "enum A { A };"</li> +<li> If INLINE_INFO was set to NO an empty property list could be put after + the function definitions.</li> +<li> Fixed source code linking for the following cases: + <code>A::func().func2()</code> + and <code>a[2]->func()</code>.</li> +<li> \em %className did not remove the %</li> +<li> In some cases namespace members ended up multiple times in the + documentatation.</li> +<li> Fixed a bug in the auto list generation.</li> +<li> \latexonly inside brief description did not work properly.</li> +<li> "Referenced By" list did not include constructors with + inline initializers.</li> +<li> &auml; and such were not parsed when used as the argument of a section.</li> +<li> A struct inheriting from a base class was marked as private inheritance + while it should be public inheritance.</li> +<li> The autobreak routine for long return types was sometimes skipping + characters. </li> +<li> Class usage relations should now also appear in the collaboration + diagrams for classes within the same namespace, without explicitly + having to mention the namespace.</li> +</ul> + + + + +<h1>Doxygen Release 1.2.1</h1> + +<h3>Changes</h3> +<ul> +<li> I have completely rewritten the \todo code. Now a \todo command have a + paragraph as argument. The todo list has a header for each + item indicating where the todo item was found. The todo list (and + all todo items) can be disabled by setting GENERATE_TODOLIST to NO.</li> +<li> <pre> ... </pre> blocks now behave as in plain HTML instead of + \code ... \endcode blocks. This also works for LaTeX ofcourse. + These blocks differ from \verbatim ... \endverbatim blocks in that + commands can be used inside these blocks.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Added rudimentary support for XML output. Still very much work in + progress... You can enable it by setting GENERATE_XML to YES. + There is a small utility (based on Qt & Xerces-C) in addon/xmlread + that uses the SAX interface to read a generated XML file and then dumps + the class hierarchy contained in it.</li> +<li> Thanks to a patch sent by Christophe Prud'homme, doxygen now has a new + option USE_PDFLATEX that when set to YES makes doxygen use + pdflatex instead of latex to generate refman.pdf. The + result is a document with higher quality fonts.</li> +<li> Added a \test command that works similar to \todo and can be used to + describe test cases. Doxygen will generate a page containing a list + of all test cases. To disable the list set GENERATE_TESTLIST to NO. + Thanks to Dave Murrell for the idea and the initial code.</li> +<li> For each list option in the config file += can now be used to append + something to a list. Thanks to Joerg Baumann for adding this.</li> +<li> Numbered items are now supported like this: + <pre> + /*! + This is nested list: + - It can be either one of following: + -# An apple + - Green or + - Red + -# An orange + - Or one of the following: + -# A plane + -# A bird + + More text follows. + */ + </pre> + Credits go to Joerg Baumann.</li> +<li> Included French and Czech language updates from Mathieu Despriée and + Petr Prikryl. Also included a language update for german from + Raimund Klein.</li> +<li> Doxygen will now do give proper warnings for formulas that do not + end properly.</li> +<li> Improved error reporting for illegal list combinations (thanks to + Joerg Baumann for the patch)</li> +<li> Comments from the code example in the dot graph "legend page" was + stripped if STRIP_CODE_COMMENTS was set to YES.</li> +<li> In the config file "@INCLUDE = file" can now be used to include + part of a configuration file. "@INCLUDEPATH = dir1 dir2 ..." can + be put in front of it to add search paths (default is $PWD). + Thanks to Joerg Baumann for the patch.</li> +<li> Added alphabetical quick indices for compound, file and namespace + member lists.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Running ghostscript on Windows for generating formulas was done + asynchronously, resulting in ghostscript trying to access temporary + files that may already have been deleted by doxygen. Thanks to Robert + Golias for the code to fix this.</li> +<li> Include dependency graphs failed to get included in LaTeX because + \includegraphics did not like the dots in the generated file names. + Those dots are now escaped by underscores.</li> +<li> The \remark did not end a brief description in JavaDoc comments, + resulting in a error in the generated LaTeX.</li> +<li> "<code>operator >></code>" was not matched against + "<code>operator>></code>" </li> +<li> the (required) space after \addindex ended up in the LaTeX index, + causing all generated entries to be placed after the user added entries.</li> +<li> "<code>typedef class A<B> a;</code>" is now correctly handled in inheritance + relations. </li> +<li> Fixed some typos in the manual</li> +<li> <code>\c Class::func(arg)</code> was not autolinked.</li> +<li> Doxygen stopped reading from stdin after 4096 bytes.</li> +<li> In code fragments no autolinks for local variables or + dereferenced arguments were generated for template classes.</li> +<li> autolinking to a namespace member foo from within a class scope also + having a member foo did not work. </li> +<li> The brief description was prepended before \todo and \test. + The reference from the todo and test lists back to the documentation + did not work for overloaded members.</li> +<li> specifying width or height for \images was not handled properly. + (width and height were repeated). Now you can also use commands like + \textwidth as the width or height. </li> +<li> After expanding an environment variable in the config file, the + next environment variable was searched starting at the wrong position.</li> +<li> Fixed LaTeX/RTF labelname collisions between members of files and + groups, and between classes and groups with the same name.</li> +<li> HTML image map partly appeared in RTF output when built-in class + diagrams were used causing the RTF file to be truncated.</li> +<li> Inheritance relation was not determined correctly in case a base + class was imported from another namespace via a using declaration.</li> +<li> Todo and test items defined with \class or related block, where + sometimes missing from The todo & test</li> +<li> Preprocessor: Multi-line #define's where not properly parsed & colored + on windows due to \r's</li> +<li> Preprocessor: expansion of <code>M(x)A</code>, where M is a macro + that expands to mx, resulted in + "<code>mxA</code>", instead of "<code>mx A</code>"</li> +<li> Fixed compile problem with Qt-2.2.0beta1</li> +</ul> + +<h1>Doxygen Release 1.2.0</h1> + +<h3>Changes</h3> +<ul> +<li> <code>CASE_SENSE_NAMES</code> is now enabled by default.</li> +<li> In LaTeX <code>.eps</code> images are now included using the + graphicx package instead of epsfig to simplify the use of pdflatex + (thanks to Pier Giorgio for showing me how that works).</li> +<li> Reimplemented the <code>system()</code> call for Unix, so doxygen becomes + interruptable when calling external tools such as dot.</li> +<li> Changed the way <code>-w</code> works. It can now also be used to generate + template header and footers.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Grzegorz Kowal added support for the Polish language. His patch + is now included. </li> +<li> A <code>\par</code> command without title argument can now be used to + add a new paragraph with the same indent under the heading of + another command (such as <code>\par</code>, <code>\param</code>, + <code>\note</code>, etc...) </li> +<li> Added a legend page explaining the various arrows and box colorings + for the class diagrams generated by dot.</li> +<li> Merged update for Croatian language.</li> +<li> Relative paths are now also allowed for the + <code>STRIP_FROM_PATH</code> tag.</li> +<li> Added a new section to the manual explaining the use of tag files + in more detail. Also move the contents of the INSTALL file into + the "installation" section of the manual.</li> +<li> Added <code>ps_2on1</code> and <code>pdf_2on1</code> targets to the + Makefile generated in the + LaTeX directory. These can be used to generate manual with 2 + logical pages on 1 physical pages (Thanks to Onno).</li> +<li> Merged Czech language update from Petr Prikryl. Merged Spanish + language update sent by Lucas Cruz. </li> +<li> Added standard GNU long options <code>--help</code> and + <code>--version</code>.</li> +<li> Added a <code>-w</code> option that can be used to generate template + style sheet files for RTF, HTML, Latex. Thanks to Alexander Bartolich + for the idea and part of the implementation.</li> +<li> Merged patch from Steve Hespelt, which adds a new configuration + option: <code>INCLUDE_FILE_PATTERNS</code>. This tag can be used to + set the file patterns for the include files (if left empty the + <code>FILE_PATTERNS</code> will be used, which was also the old + behaviour). </li> +<li> Added a couple of commands for kdoc compatability: <code>@p</code>, + <code>@li</code>, <code>@em</code>. + Also made @ref a bit less strict.</li> +<li> Portuguese translation by Rui Lopes. </li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Documenting member function pointers with \var like this: + + <pre> + /*! class B */ + class B + { + public: + void (B::*pmf)(); + }; + + /*! \var void (B::*B::pmf)() + * docs for this class member. + */ + </pre> + + did not work.</li> +<li> Library blocks inside M$-IDL files are now also processed + (a library is treated as a namespace at the moment). </li> +<li> Argument matching did not work for array argument with different + amounts of whitespace. </li> +<li> If a namespace definition was found before its documentation than + grouping it (with @ingroup) did not work.</li> +<li> Global functions within anonymous namespace scopes did appear + in the documentation with the anonymous scope marker used internally + by doxygen.</li> +<li> "namespace{}",so without space was not recognised as a namespace.</li> +<li> If the search engine was used then running installdox on the generated + html resulted in bogus links to the search engine.</li> +<li> Fixed some compiler warning on Solaris.</li> +<li> Changed grey by grey50 in dot.cpp to avoid PDF conversion problems.</li> +<li> A </pre> that was not preceeded by a whitespace was ignored </li> +<li> The methods operator<() and operator<<() were not + automatically linked anymore.</li> +<li> Some special characters in LaTeX were eating up the blanks that + followed them.</li> +<li> The built-in C preprocessor did not evaluate the following to TRUE: + <pre> + #define A + #define TO_BE_EVALUATED defined A + #if TO_BE_EVALUATED + ... + #endif + </pre></li> +<li> Improved code parsing a bit: things like + <code>getClass()->func()</code> and + <code>(*pb)->func()</code> should now work. Also the scope of the + body is correctly detected in case of inline constructor initializers + like: <code>A() : m_a(10) { ... }</code></li> +<li> File index is now in (path,name) lexical order, instead of (name,path) + order. The file index is also only generated once instead of twice ;-)</li> +<li> Typedefs to structs in C-style did (still) not get resolved as "usage" + relations for the collaboration diagrams.</li> +<li> Fixed some HTML output typos reported by Onno Kortmann (who used + the tool "html tidy" on the generated output).</li> +<li> Merged a patch from Paul Lieverse that should solve the empty image + map problems on Solaris.</li> +<li> If the title of a <code>\defgroup</code> contained a documented class, a + nested (and thus broken) link was generated. </li> +<li> Externally defined variable were treated as variable definitions. </li> +<li> If a file only had a verbatim header but no documentation, a + link broken link was added to the HTML help TOC.</li> +<li> Fixed "member with no name" warning that occurred when a enum's + last value ended with a comma and the enum was inside a member group.</li> +<li> A <dl> type of list with multiple <dd>'s did not give + the correct output in LaTeX.</li> +<li> <code>SORT_MEMBER_DOCS</code> is <code>NO</code> only worked for + class members.</li> +<li> Both the prototype and the definition of a global function + appeared in a <code>\defgroup</code>.</li> +<li> Fixed some visual problems with operator links in source code + fragments.</li> +<li> Code parser got confused by template specifiers. Also improved + linking of typedef'ed classes. </li> +<li> A warning was generated if the same function was defined both inside + and outside a namespace.</li> +</ul> +<p> +\endhtmlonly +\section log_1_1 1.1 Series +\htmlonly +</p> +<h1>Doxygen Release 1.1.5</h1> + +<h3>Changes</h3> +<ul> +<li> If DISABLE_INDEX = YES and a user defined main was specified + (with \mainpage), then no index will be generated anymore.</li> +<li> RTF output is now enabled by default.</li> +<li> LaTeX output now uses fancyhdr instead of fancyheader.</li> +<li> If the search engine is enabled, the default config values will be + put into the generated HTML files, so you do not need to run + the installdox script, if the initial values are ok. </li> +</ul> +<h3>New features</h3> +<ul> +<li> Added a new config option HIDE_SCOPE_NAMES that can be set to YES + to hide the namespace and class scopes that are put in the + documentation and diagrams.</li> +<li> added a new type of graph, that can be used to visualize + which files #include (i.e. depend on) a given file. This graph is + enabled by setting HAVE_DOT and INCLUDED_BY_GRAPH to YES.</li> +<li> added new configuration option EXTRACT_STATIC that can be used + to enable/disable the extraction of static file members. The behaviour + of this option used to be linked with EXTRACT_PRIVATE.</li> +<li> Added two new configuration options MAX_DOT_GRAPH_WIDTH and + MAX_DOT_GRAPH_HEIGHT that let the user configure how big the + generated dot graph may become.</li> +<li> Added a new configuration option EXPAND_AS_DEFINED that can + be used in combination with PREPROCESSING = YES, MACRO_EXPANSION = YES, + and EXPAND_PREDEF_ONLY = YES, to expand a given list of macro names, + as they are defined in the sources.</li> +<li> Merged Alexander Bartolich's RTF style sheet patch. + A new config option RTF_STYLESHEET_FILE is now available with which you + can specify a style sheet file. The style sheet file should contain + a list of assignments. The assignments can be used to overwrite the + definitions of the various styles with user defined settings. </li> +<li> Added a new command @since for JavaDoc compatibility.</li> +<li> Added two new commands: \remarks and \attention that work in a + similar way as \warning, \pre, \post, et al.</li> +<li> If SOURCE_BROWSER = YES, each member function documentation + now includes a list of member functions that call the member + somewhere in their body. </li> +<li> RCS/CVS tags of the form $word:text$ are now nicely typeset in the + documentation.</li> +<li> Providing all members of an enum with the same documentation can + now be done with member grouping like this: + <pre> + /*! + * Rotation values + */ + enum + { + //@{ rotation value + Up=0, + Left=-90, + Right=90, + Down=180, + //@} + }; + </pre></li> +<li> Member grouping can by denoted more compactly like this: + <pre> + //@{ Same documentation for each function + int getFunc1(); + int getFunc2(); + //@} + + /*@{ @name Set functions + * Functions for setting values. + */ + void setFunc1(int v); + void setFunc2(int v); + /*@}*/ + </pre></li> +<li> Merged Czech language support patches send by Petr Prikryl. Also + removed some obsolete methods from the translator files.</li> +<li> Call chains like <code>a->b()->c()</code> are now followed + by the code parser so <code>c()</code> is linked if documented. </li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> the warning message in case of ambigous file matches was containing + a bogus <code>%s</code>, which could even crash doxygen.</li> +<li> An autolist followed by a \retval, \param, or \exception did + produced invalid output, resulting in a compile error in LaTeX. </li> +<li> " has a special meaning in LaTeX when the german babel package + is loaded. Doxygen now produces proper output for text containing + quotes.</li> +<li> The title of a related page was not properly parsed, causing + HTML special characters to end up in the output for some languages + (German for instance). </li> +<li> The hierarchy shown in the "Contents" part of the html help + browser did not properly show the hierarchy when it contained + undocumented classes. </li> +<li> explict compound specifiers in the return type could lead to + parse problems. Example: + <pre> + enum SomeEnumType_e Func() + { + ... + } + </pre> + This was parsed as an enum definition.</li> +<li> A user defined style sheet did not get included properly, if it + was specified with a (partial) path in HTML_STYLESHEET. </li> +<li> Linking in code fragments now works with nested classes + and links to the correct reimplemented member are generated.</li> +<li> \ingroup did not work when grouping enums</li> +<li> members of a module were not cross-referenced with the sources.</li> +<li> Function pointers like <code>void ( *func )()</code> where not c + orrectly parsed because of the extra spacing between + the `(' and the `*'. </li> +<li> The const in void <code>func(int * const val /*< a value. */);</code> + was named part of the name, instead of the type.</li> +<li> Removed bogus warning in case of global function pointer variables. + Function pointers inside namespaces and member function pointers + did also produce bogus warnings.</li> +<li> Fixed a misalignment problem with inline source fragments. + Also the initializer list after a colon is now included in an inline + source fragment.</li> +<li> Case sensitivity of file names was set before the configuration file + was parsed, causing the default value of CASE_SENSE_NAMES to + be used in any case.</li> +<li> added a space after "file" in the groupdef docs (thanks Hauke)</li> +<li> Documentation blocks can now also be put just after a class name, like + in: + <pre> + class C + /*! documentation here */ + { + ... + }; + </pre> + This was already possible for functions.</li> +<li> Due to a bracket counting bug, throw clauses where not always + parsed properly.</li> +<li> Fixed a parse bug for the following code-pattern: + <pre> + void Class:: + // Comment + method() {} + </pre></li> +<li> With the newer Qt versions (2.1.x), passing a null string as the first + argument of <code>QRegExp::match</code> seems no longer be allowed, + so I added some extra checks to avoid potential crashes.</li> +<li> The title of the documentation of a template class now explicitly + states that it is a template. (For non-English languages, + this still requires a change to trCompoundReference() in + translator_xx.h).</li> +<li> Fixed a problem with matching methods of template classes.</li> +<li> commenting out a section or subsection with <code><!-- --></code> + did not work.</li> +<li> Fixed some inconsistencies in the configuration page of + the documentation.</li> +<li> Some operators like <code>operator[]()</code>, + <code>operator|()</code> and <code>operator!()</code> + did not appear correctly in the LaTeX index.</li> +<li> If an include file name matched a directory name, then the + directory could be found first in the INCLUDE_PATH. This resulted in a + scanner error.</li> +<li> Fixed parse problems that occurred when << or >> was + part of a template argument list.</li> +<li> Fixed some more parse problems that occurred when parsing base classes + that were nested templates.</li> +<li> variables whose name started + with an _ like <code>struct {int x; } _var;</code> + where not properly parsed.</li> +<li> LaTeX formulas did not work in the brief description of a JavaDoc + style block that was put after an item.</li> +<li> Empty group definitions were not properly handled.</li> +<li> References to pages using \ref did not work in LaTeX.</li> +<li> Members that are typedef's to classes are now shown in the + collaboration diagram.</li> +</ul> + + +<h1>Doxygen Release 1.1.4</h1> + +<h3>Changes</h3> +<ul> +<li> The member definition that is put before the detailed + documentation section should now be layouted a bit better for members + of classes with lots of template arguments.</li> +<li> The HTML pages now have a new doxygen logo at the bottom. This logo has + a transparent background and no shadow or anti-aliasing, so it looks + equally nice on all backgrounds.</li> +<li> If the first member of a member group is documented, this documentation + is now repeated for all undocumented members of that group. </li> +<li> The following is now treated as one parameter list with two + parameters, instead of two lists with one parameter each. + <pre> + /*! + * @param a the first parameter + * + * @param b the second parameter + */ + </pre> + The same goes for the @retval and @exception commands.</li> +</ul> +<h3>New features</h3> +<ul> +<li> In code fragments: added different colors for keywords that are + types, and for keywords that deal with the flow control. + Also added colors for string and character literals.</li> +<li> Added a new command \nosubgrouping that can be put in the documentation + of a class. It can be used in combination with member-grouping + to avoid that doxygen puts a member group as a subgroup of a + Public/Protected/Private/... section. + + Example: + <pre> + /*! A class. + * \nosubgrouping + */ + class Test + { + public: + /*! \name A member group + */ + //@{ + /*! Docs for both members in the group. */ + void Member1(); + void Member2(); + //@} + /*! A member outside of the group. */ + void Member3(); + }; + </pre></li> +<li> Added three new configuration options: + <ul> + <li>WARN_IF_UNDOCUMENTED which can be used to turn on or off warning + message related to undocumented entities. This works independently + of the WARNING tag, which is there to enable/disable all + other warning messages.</li> + <li>WARN_FORMAT which can be used to specify the format of the warnings + produced by doxygen. The argument is a free form string + that must contain a $file, $line and $text marker. + The $file and $line markers will be replaced by the file name and line + number from where the warning originated. + The $text marker will be replaced by the actual warning text. + The default argument format string is: <code>"$file:$line: $text"</code>.</li> + <li>DOT_PATH that can be used to specify the path + where the dot tool is to be found, in case it is not in the + default search path.</li> + </ul></li> +<li> Added rudimentary support for using declarations. The following + now works: + <pre> + /*! Docs for the namespace. */ + namespace N + { + /*! Docs for class Test. */ + class Test + { + public: + void func(); + }; + }; + + using N::Test; + + /*! The documentation for func is here */ + void Test::func() {} + </pre> + Using of individual functions remains unsupported.</li> +<li> collaboration and include dependency graph are now also included + in the LaTeX documentation.</li> +<li> Thanks to Tim Mensch, doxygen has now has a \todo command, which + can be used put todo items in the documentation. + All items will automatically be cross-referenced with a + (generated) todo list. Here is an example: + <pre> + /*! \mainpage + * \todo write something useful here. + */ + + /*! A class + * \todo Add more comments here + */ + class Test + { + public: + //! \todo implement this function + void func(); + + /*! Computes stuff. + * \todo can we combine this with Test::func()? + * More docs. + */ + void func2(); + }; + </pre> + + Note that the arguments of the \todo command ends at the end of the + line.</li> +<li> membergroups in files can now also be header-less. Example: + <pre> + /*! @file */ + + /*! A macro */ + #define AMACRO 11 + + //@{ + /*! F1 macros */ + #define F1_0 0 + #define F1_1 (F1_0 + 1) + #define F1_2 (F1_1 + 2) + //@} + + /*! Yet another macro */ + #define YAMACRO 10 + </pre> </li> +<li> The `explicit' and `mutable' keywords are now recognized as + member attributes instead of return types.</li> +<li> the index page is now added to the HTML help contents.</li> +<li> In case "no matching member" is found, a list of possible + (but non-matching) candidates is generated along with the warning. + This makes it much easier to see what's wrong. </li> +<li> added two new commands: + <ul> + <li>\hideinitializer which can be put in the documentation to + a variable or the define to hide the initializer or define value.</li> + <li>\showinitializer which can be used to explicitly show the + initializer of a variable or the value of a define even if it + is longer than 30 lines.</li> + </ul></li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed a lock-up problem, that occurred when + parsing a code fragment containing something like: + <pre> + // + /*! + blah + */ + </pre> + while STRIP_CODE_COMMENTS was set to NO </li> +<li> The auto list feature was still broken. + Due to a bad scanner rule, things like -1 at the start of a line + were treated as a list items (again) and a list at the end of a + comment block did not always work either.</li> +<li> If an non-existent config file was specified, the directories + "html", "man" and "latex" were created anyway.</li> +<li> A fragment like: os <code><< ">"</code> was misinterpreted + by doxygen's code parser.</li> +<li> Parameter declarations that differ only in the presence or absence + of const and/or volatile are now treated as equivalent, as is + dictated by the C++ standard.</li> +<li> The inline function body was wrong in the following example: + <pre> + void f( + int i ///< Parameter + ) + { + return 1; + } + </pre> + Thanks to Alexander Gidon for the fix.</li> +<li> typedef'ed classes are now also resolved in code fragments + (again thanks to Alexander).</li> +<li> Fixed a bug related to base classes with nested template specifiers, + like class SB in the following: + <pre> + template <class T> class C {}; + template <class T> class S {}; + template <class T> class SB {}; + template <class T> class S<C<T> > : public SB<C<T> > {}; + </pre> </li> +<li> #includes in code fragments where not hyperlinked. Operator + methods were also not correctly recognised.</li> +<li> C/C++ comments inside initializers where not handled properly.</li> +<li> If the type of an argument of a member definition was prefixed + with a (redudant) scope name of an indirect base class, + then it was not matched against the member declaration if that + omitted the scope.</li> +<li> \name did not work within //! comments</li> +<li> When FULL_PATH_NAMES was set to YES, doxygen did no longer + distinguish between files with the same name (but in + different directories). </li> +<li> The file match routine now does an case-insensitive lookup + if CASE_SENSE_NAMES = NO. Hopefully this is enough to + let doxygen ignore case differences in file names on Windows.</li> +<li> The constructors and destructors of classes inside namespaces + or other classes did not end up in the constructor/destructor + section of the documentation.</li> +<li> If an environment variable in the config file starts with a space + followed by a list of words, the space ends up in the first word + after expansion.</li> +<li> A <table> inside a JavaDoc style comment block caused a bogus + warning.</li> +<li> Using member groups could result in an empty list generated in + LaTeX, causing a error while compiling the documentation.</li> +<li> Fixed a missing stdlib.h problem in doxywizard, which occurred + on non-Linux systems.</li> +<li> The generation of dot include graphs did not work properly in + case file names with space were used.</li> +<li> back-references from source-lines to documentation only worked for + those members of a member group that were explicitly documented.</li> +<li> doxygen did not distriguish between func(int a) and func(int a[]) + which could cause documentation to end up at the wrong member + in case over overloading. </li> +</ul> + + + +<h1>Doxygen Release 1.1.3</h1> + +<h3>Changes</h3> +<ul> +<li> Changed the way anonymous enums are handled: they are now handled + just like named enums, which makes the "Enumeration Values" section + obsolete.</li> +<li> If + <pre> + /*! \file */ + </pre> + is put into a file (thus without further documentation) then the + file is treated as being documented.</li> +</ul> +<h3>New features</h3> +<ul> +<li> Doxygen now has a GUI frontend to create and edit the configuration + file. It is called doxywizard. To build it from sources use: + <pre> + ./configure --with-doxywizard + </pre> + The front-end requires Qt 2.x to build. I've only tested with Qt-2.1. + Sources can be found in the addon directory.</li> +<li> To make it very easy to add new configuration options, doxygen + now has an additional tool called configgen. All options supported + by doxygen are now located in one place (in configgen.cpp). + From this the configuration parser and part of the GUI are + generated. You only need configgen if you want to add new options + to doxygen. Thanks go to Joerg Baumann for providing the ideas + and part of the code.</li> +<li> Added a bit of syntax highlighting to the generated source + fragments in HTML (only keywords, comments and preprocessor directives + are colored for now). The font color & style is determined by + the style sheet, so it is easy to customize :-)</li> +<li> Typedefs of classes are now resolved when the inheritance + and usage relation of classes is determined.</li> +<li> Waechter Parker made the following improvements on the RTF generator: + <ol> + <li>Now it uses the translator for the table of contents entry names + for the sections.</li> + <li>writeSection now puts braces around the entry so the formatting + doesn't get messed up so easily. </li> + <li>removed extra newline in startDescList </li> + <li>writeSectionRef now writes out "title (p.pagnum)" like it should.</li> + <li>writeSectionRefAnchor now just calls writeSectionRef. </li> + </ol></li> +<li> Doxygen's preprocessor now supports the non-ANSI "#else if" + preprocessor construction, which some other preprocessors seem to + accept as well.</li> +<li> Boris Bralo added language support for the Croatian language. + Nickolay Semyonov has finished the translation to Russian, which is + now included.</li> +<li> Added documentation for the commands \if and \endif, the + configuration tag ENABLED_SECTIONS, and the ways to groups + things together.</li> +<li> In the brief part of a JavaDoc style comment block, + putting a backslash after a space, prevents switching to the + detailed description. Example: <code>i.e.\ this</code>.</li> +<li> Class diagrams can now also be rendered with dot by setting + CLASS_GRAPH to YES (this will disable the build-in class graphs). + The advantages: + <ul> + <li>More compact diagrams.</li> + <li>Correctly looking diagrams in case of virtual inheritance.</li> + <li>A more consistent look w.r.t. the other graphs.</li> + </ul></li> +<li> Groups can now contain namespaces and other groups.</li> +<li> operator% caused problems with LaTeX when PDF_HYPERLINKS was set to YES.</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> <code>\c func()</code> did not autolink to function "func" anymore. </li> +<li> template members with multiple arguments were misaligned + in the HTML output. </li> +<li> Since 1.1.2, environment variable expansion in the config + file always resulted in a single string for each expanded variable + (just as if quotes were put around the environment variable). + The old behaviour is restored again.</li> +<li> removed redundant spaces in the man page output and fixed the + tab alignment in code fragments.</li> +<li> <code>typedef ( bla::*proc)();</code> was not properly parsed because of the + space after the first opening bracket.</li> +<li> fixed a problem in the namespace strip routine that could potentially + lock up doxygen.</li> +<li> Long pre-initialized arrays ended up in the documentation.</li> +<li> Friend functions that were documented at the declaration were + cross-referenced to the wrong file when using SOURCE_BROWSER=YES.</li> +<li> When EXTRACT_ALL=YES was used, classes that were + documented with \class appeared twice in the namespace documentation.</li> +<li> Setting HIDE_UNDOC_CLASS=YES could result in an incorrectly + indented textual class hierarchy. This should now be fixed.</li> +<li> Members with very long return types caused all member names to + be pushed to the right in the HTML documentation + (if HTML_ALIGN_MEMBERS was YES). Now some line breaks are inserted + at the proper places.</li> +<li> A couple of people reported that doxygen crashed while it was generating + dot graphs. The cause was likely to be multiple frees of the same + pointer (but I have not been able to reproduce the crash myself). + I've now reimplemented the deletion routine of the dot graph + respresentation, which hopefully fixes this problem.</li> +<li> Elements of the configuration options in lists, which used quotes + were broken up into smaller pieces anyway. This most notably broke + PREDEFINED in some cases that worked before.</li> +<li> Detailed description was present for classes, files and namespaces + even if there was only a brief description and REPEAT_BRIEF was NO.</li> +<li> LaTeX: For German output "deutsch" was used as an option for the babel + package, while it should be "german". For Russian output an encoding + option is added.</li> +<li> The inheritance relation was incorrect for the inner class of B in the + following situation: + <pre> + template <class T> class A { public: class inner { }; }; + template <class T> class B : public A<T> + { public: class inner : public A<T>::inner { }; }; + </pre> </li> +<li> Fixed a bug that prevented the header links of the search engine + from working.</li> +<li> Undocumented classes & enums made it in the file documentation even if + HIDE_UNDOC_MEMBERS was set to YES.</li> +<li> Backslashes in includes like + <pre> + #include "..\blah.h" + </pre> + did not end up in the include dependency graph.</li> +<li> If ALPHABETICAL_INDEX=YES but there were no documented classes, part + of the LaTeX output (doxygen.sty a.o.) was not generated + (Thanks to Markus Lepper for reporting this).</li> +<li> Doxygen can now match arguments containing an explicit namespace + qualifier against arguments containing an implicit qualitifier + (i.e. imported via a using directive). + An example (thanks to Karl Stroetmann): + <pre> + /*! a class */ + class Test + { + public: + void resolve(const std::vector<int>&); + }; + using namespace std; + /*! a member */ + void Test::resolve(const vector<int>&) {} + </pre> </li> +<li> Template specifiers are now shown in dot generated + collaboration graphs.</li> +</ul> + +<h1>Doxygen Release 1.1.2</h1> + +<h3>Changes</h3> +<ul> +<li> Having the source browser set to YES does not longer imply that + a member with a reference to the sources is automatically documented.</li> +<li> Base classes are shown in declaration order in the class diagrams</li> +<li> The arguments of a function now each get their own + line in the header above the detailed description. This makes + function with lots of argument much more readable.</li> +<li> Changed the look of the LaTeX output a bit. </li> +</ul> +<h3>New features</h3> +<ul> +<li> Thanks to Joerg Baumann, doxygen now has two new commands: + <ul> + <li>\if label </li> + <li>\endif</li> + </ul> + These commands can be used to create conditional documentation blocks. + Sections are disabled by default. To enable them add a guarding + "label" to the <code>ENABLED_SECTIONS</code> tag in the config file. + Conditional blocks can be nested. + Example: + <pre> + /*! Normal docs. + * \if Cond1 + * Only included if Cond1 is set. + * \endif + * \if Cond2 + * Only included if Cond2 is set. + * \if Cond3 + * Only included if Cond2 and Cond3 are set. + * \endif + * More text. + * \endif + * Unconditional text. + */ + </pre></li> +<li> Again thanks to Joerg Baumann, URLs and mail addresses are now + hyperlinked in the PDF output + (=latex with <code>PDF_HYPERLINKS = YES</code>).</li> +<li> Added support for member grouping. I reimplemented this + from scratch. I decided to follow the doc++ syntax for the member + grouping. Here are two examples. + <p> + <b>Usage:</b> A group is defined by a <code>//@{ .. //@}</code> block + (or <code>/*@{*/../*@}*/</code> if + you're addited to C style comments :-) Nesting of groups is not + allowed. Before the opening marker of a block a separate comment + block should be placed. This block should contain the @name + (or \name) command to specify the header of the group. + </p> + <p> + If all members of a user defined member group are in same section + (for instance all are public methods), then the group as a whole + will be listed as subsection of that section. + </p> + <p> + <b>Example1:</b> Two ways to grouping member of a class + </p> + <pre> + /** A class. Details */ + class Test + { + public: + /** @name Group1 + * Description of group 1. Details. + */ + //@{ + /** Function 1 in group 1. Details. */ + void func1InGroup1(); + /** Function 2 in group 1. Details. */ + void func2InGroup1(); + //@} + + void func1InGroup2(); + void func2InGroup2(); + /** Function without group. Details. */ + void ungroupedFunction(); + }; + + void Test::func1InGroup1() {} + void Test::func2InGroup1() {} + + /** @name Group2 */ + //@{ + /** Function 2 in group 2. Details. */ + void Test::func2InGroup2() {} + /** Function 1 in group 2. Details. */ + void Test::func1InGroup2() {} + //@} + </pre> + <p> + <b>Example2:</b> Combining member groups with @defgroup. + </p> + <pre> + /** @defgroup globals Global Functions + * Functions that may be used in any translation unit. + */ + + /** @name Debug Functions */ + /*@{*/ + + /** @ingroup globals + * debug printf function. + */ + void debugPrint(const char *s /**< the message to print. */ + ); + + /** @ingroup globals + * assert function. + */ + void my_assert(const char *f, /**< current file. */ + int l, /**< current line. */ + BOOL e /**< expression to evaluate. */ + ); + /*@}*/ + + /** @name Test Functions */ + /*@{*/ + + /** @ingroup globals + * test on-board memory. + * @returns TRUE if successful. + */ + bool testRam(); + + /** @ingroup globals + * perform CPU self-test. + * @returns TRUE if successful. + */ + bool testCPU(); + + /*@}*/ + </pre></li> +<li> Documented variables (e.g. constants) that are used as initializers + of function parameters are now also cross-referenced. </li> +<li> Lucas Cruz sent an update for the Spanish translation. This is now + included. Jens Breitenstein sent an update for the German translation. + Philippe Lhoste sent some bug fixes for the French translation. + Alessandro Falappa sent an updated of the Italian translation, which + is now included. Nickolay Semyonov added initial support for the + Russian language. I updated the Dutch translation.</li> +<li> Thanks to Matthias Andree, the doxygen source package + now contains a .spec file. This can be used to build an .rpm package + for doxygen. + doing: + <pre> + rpm -ta doxygen-x.y.z.src.tar.gz + </pre> + will create the rpm (in /usr/src/packages/RPMS/i386/ on my machine). + Running <code>rpm -Uhv</code> as root on the .rpm file will + install/update doxygen. + After that you can use <code>rpm -e doxygen</code> to uninstall it again.</li> +<li> Umlauts and other accents in the documentation now appear properly in + generated RTF output. </li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> Fixed bug in the generated config file (LATEX_BATCHMODE)</li> +<li> When updating the config file, <code>TAB_SIZE</code> and + <code>COLS_IN_ALPHA_INDEX</code> + were reset to their default values. Environment variables in + the config file are no longer replaced by their value when updating + the config file. </li> +<li> The version.cpp file is now automatically updated when creating + a source/cvs package.</li> +<li> The types of arguments that are prefixed with a namespace scope + are now be matched against non-prefixed names. Example: + <pre> + namespace std { class string {}; } + //! A class + class Test { + public: + void test(std::string a); + }; + using std::string; + //! A member + void Test::test(string a); + </pre> + <b>Note:</b> The namespace definition has to be part of the + input sources for this to work!</li> +<li> Fixed a bug in structure of the graphical class hierarchy + (thanks to Paul Bohme for pointing me at this bug)</li> +<li> Non-function members can now also be documented if they + are inside annonymous namespaces, which themselves are nested in + named namespaces.</li> +<li> #defines can now grouped with \defgroup and \ingroup as well.</li> +<li> fixed a bug in the latex output of groups (thanks to Gregory Kurz + for reporting this)</li> +<li> Doing a \ref to a \anchor in an example did not work.</li> +<li> static file & namespace members were cross-referenced even though + they were not visible if EXTRACT_PRIVATE is set to NO.</li> +<li> The following code fragment made doxygen crash, because the + table was split between the brief and detailed section: + <pre> + /** <table><tr><td>a. </td><tr></table> */ + class Test {}; + </pre> + Doxygen now ends the brief description when a <table> tag is encountered.</li> +<li> \c and \b now also accept numbers and other printable characters, + instead of only identifiers.</li> +<li> Autolinking did not work if a member with arguments was specified + in the documentation and that member had a const or volatile postfix + in the code. Autolinking did not also not work if a member with + arguments contained digits (thanks to Fred Labrosse for pointing me + at this bug).</li> +<li> The first line was missed if @code was used for generating man pages. + (Thanks to Joe Bester for the patch). </li> +<li> <code>\link create_link(long,int&) bla \endlink</code> + now works (doxygen was confused by the arguments before).</li> +<li> A brief description after a function definition, followed by a detailed + description now works as expected. Example: + <pre> + bool func() + { + } + //!< Brief. + /*!< Details. */ + </pre></li> +<li> Multi-line brief descriptions after a function declaration or definition + now work as excepted. Example: + <pre> + bool func() + //!< Brief. + //!< More brief. + </pre></li> +<li> \latexonly fragments were put on a single line causing problems + when latex comments (%'s) are used. </li> +<li> The license file that came with doxygen was of LGPL, while it + should be GPL. The correct license file is included now.</li> +<li> The heading of the alphabetical index was duplicated if + classes were present in both upper and lower case.</li> +<li> If ENABLE_PREPROCESSING=NO and the INPUT_FILTER was used, doxygen + did not filter properly can could even block on input!</li> +<li> Internationalization should now output proper characters with qt-2.1x.</li> +<li> If namespace contained a function prototype & a function definition + they both ended up in the documentation.</li> +<li> <table> without </table> could cause doxygen to crash. Now a + warning is given.</li> +<li> Multiline variable and enum initializers with lots of spaces were + shown in an ugly way.</li> +</ul> + + + +<h1>Doxygen Release 1.1.1</h1> + +<h3>Changes</h3> +<ul> +<li> "Reimplements" for a member now points to the most direct + base class that overrides the member instead of the base + class containing the vtable.</li> +<li> classes, namespaces, and members are now sorted + in a case insensitive way (like in a dictionary). + Was case sensitive.</li> +<li> Kenji Nagamatsu has send me an update for the Japanese translation + which is now included.</li> +</ul> +<h3>New features</h3> +<ul> +<li> new option SHOW_INCLUDE_FILES, which can be set to NO to turn of the + list of include files that is generated for each documented file.</li> +<li> new option STRIP_CODE_COMMENTS, which can be set to NO to keep any + special comment blocks in the generated code fragments.</li> +<li> Added a new tag to the configuration file: SORT_MEMBER_DOCS. If this + is set to NO the member documentation will appear in declaration + order (as was the case with version 1.0.0 and older). </li> +<li> Corba IDL exceptions are now also supported by doxygen. + If you do not want to put the documentation in front of the + exception you can use \idlexcept command which behaves like \class.</li> +<li> Local file:/// URLs are now automatically linked when put in the + documentation.</li> +<li> For \class and other structural commands you can now use + a backslash (\) at the end of a line to continue the command on + the next line. + Example: + <pre> + \class Abstract_Server_Session_Implementation \ + Abstract_Server_Session_Implementation.h \ + ATD/Abstract_Server_Session_Implementation.h + </pre></li> +<li> "make distclean" now removes all generated stuff and results in a + package that is more clean than a normal source package + (i.e. the generated flex & bison code is removed). </li> +<li> Added command \note (and @note) for a "Note:" paragraph.</li> +<li> Multi arguments can now be given as a comma separated list + after a \param or \retval command. Example: + <pre> + void Zoom( int aX1, int aY1, int aX2, int aY2 ); + /*! Zoom into the data. + * \param aX1, aY1 Upper left corner. + * \param aX2, aY2 Lower right corner. + */ + </pre></li> +<li> Added 9 new class declaration sections: + Public/Protected/Private Types, for member typedefs & variables. + [Static] Public/Protected/Private Attributes, for member variables.</li> +<li> Doxygen now has a new command line option -u, that can be used + to upgrade an old configuration file without losing the values that + where edited. In combination with the -s option this can also be used + to strip comments from or add comments to a configuration file.</li> +<li> Added a new tag LATEX_BATCHMODE that makes latex run in batch mode. + This will run latex non-interactively, and not stop at the first + problem encountered. If the tag is enabled this mode will also be + used when generation formulas for inclusion in the HTML documentation.</li> +<li> The \ingroup command can now also be used to group a number of + members. The only limitation is that a member can currently be in + one group only (classes, files & namespaces do + not have this limitation). </li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li> The graphical class hierarchy was not properly generated when + template classes were used.</li> +<li> Template specialization could not be documented using the + \class command. This is now fixed. Example: + <pre> + /*! + * \class T<A,int> + * My template specialization of template T. + */ + </pre></li> +<li> Fixed a bug when parsing M$-IDL code, containing + helpstring("bla") attributes. The attributes of a method are no longer + shown in the documentation (the attributes of method arguments + still visible however).</li> +<li> Improved the search algorithm that tries to connect classes with their + base classes. It should now (hopefully) work correct in all cases + where nested classes and/or namespaces are used. </li> +<li> Fixed a scanner problem that could cause doxygen to get + confused after parsing struct initializers.</li> +<li> the DOTFONTPATH environment variable is now automatically set + for Windows. This should make any "missing doxfont.ttf" + messages disappear.</li> +<li> the extra LaTeX packages specified with EXTRA_PACKAGES can now + also be used when generating formulas for HTML. </li> +<li> The documentation of a parameters that is part of a member definition, + is now used in the documentation as well.</li> +<li> Fixed a HTML output bug in the class/file group-pages.</li> +<li> Links to example files generated with \link ... \endlink where not + correct. </li> +<li> made the bullet list generation more robust. A space is now required + after the - sign. A list can now start a paragraph.</li> +<li> the configure script now detects whether or not dot is installed.</li> +<li> The VERBATIM_HEADERS option didn't have any effect any more. + It should now work again as advertised.</li> +<li> The IGNORE_PREFIX option can now also deal with a list of prefixes.</li> +<li> @verbatim ... @endverbatim blocks did not work. </li> +<li> removed some \n's from the systems calls that run dot. This appears to + cause problems for some people and was not what I intended anyway :^)</li> +<li> The following construct was not working: + <pre> + namespace foo { class bar; } + /*! let's go to the bar */ + class foo::bar { }; + </pre></li> +<li> Members inside annonymous namespaces nested inside named namespaces + were not properly handled. </li> +<li> When documenting template specializations with the \class command, + the second argument was not interpreted correctly.</li> +<li> Interface inheritance relations are now always public for IDL + interfaces.</li> +<li> Templetized related functions showed a double `template' line.</li> +<li> Related function that had a declaration and a definition + also appeared in file documentation but without documentation. </li> +<li> Links to files of the include dependency graph were + non existent in some situations.</li> +<li> Removed warning generated for undocumented friend classes.</li> +<li> Class reference in the main page ended up in refman.tex</li> +<li> Source files were generated for files mentioned in tag files.</li> +<li> The graphical class hierarchy always contained all external class, + regardless of the ALLEXTERNALS flag.</li> +<li> operator~() was grouped with the constructor/destructors.</li> +<li> In a number of cases, documented include files, that were + shown in the include dependency diagram where not found to be + documented. As a result the diagram was often not clickable and + incomplete.</li> +<li> Fixed the graphical class hierarchy. Sometimes classes were missing.</li> +<li> Added support for the cpp_quote hack inside M$-IDL code.</li> +<li> The typedef in: + <pre> + struct MyStruct { int i; }; + typedef struct MyStruct * MyStructPtr; + </pre> + was mistaken for a variable.</li> +<li> <pre> + /** @file + * @brief + * Brief. + * + * Details. + */ + </pre> + was not properly handled.</li> +<li> Corba IDL unions now work. Example: + <pre> + /** \union XYZ + * \brief The XYZ union. + */ + union XYZ switch ( ABC ) + { + case A: D_VAR m_d; ///< Docs for a member in case A + case B: E_VAR m_e; ///< Docs for a member in case B + }; + </pre></li> +<li> Classes documented with \class and using \ingroup where not always + put into the group.</li> +<li> In Latex & RTF references to undocumented files where put in the + index. </li> +</ul> + +<h1>Doxygen Release 1.1.0</h1> +<h3>Changes</h3> +<ul> +<li> Static file members are now hidden if EXTRACT_PRIVATE is set to NO.</li> +<li> the documentation of members in the class/file descriptions are now + alphabetically sorted by member name for each section. There is a new + section for constructors & destructors.</li> +<li> merged file, header and source indices into one file index. + As a result, doxygen will generate a hyperlinked source code only + once. This should greatly increase speed and reduce memory usage + for large projects.</li> +</ul> + +<h3>New features</h3> +<ul> +<li> Thanks to Parker Waechter, doxygen now has a new output format: RTF. + This is Microsoft's "portable" document format. Due to the great + "portability" of this format the output produced by doxygen will + probably only look nice with Microsoft's Word 97. + <p> + RTF is currently disabled by default. You can set GENERATE_RTF to + YES to enable it. The directory where the RTF output is put, can + be specified using the RTF_OUTPUT tag in the configuration file. + COMPACT_RTF can be enabled to generate more compact RTF. + RTF_HYPERLINKS can be used to generate HTML like cross references + in the document. </p></li> +<li> Doxygen can now use the "dot" tool from graphviz 1.5, which is an + open-sourced, cross-platform graph drawing toolkit from AT&T and + Lucent Bell Labs. + <p> + Graphviz can be found at + <a href="https://www.graphviz.org/">https://www.graphviz.org/</a> + If you have the "dot" tool available in the path, you can set + HAVE_DOT to YES in the configuration file to let doxygen use it. + </p><p> + Doxygen uses the "dot" tool to generate the following graphs: + </p> + <ul> + <li>if GRAPHICAL_HIERARCHY is set to YES, a graphical representation + of the overall inheritance diagram will be drawn, + along with the textual one (currently supported for HTML only).</li> + <li>if INCLUDE_GRAPH is set to YES, an include dependency graph + is generated for each documented file that includes at least one + other file (currently supported for HTML and RTF only).</li> + <li>if COLLABORATION_GRAPH is set to YES, a graph is drawn for each + documented class and struct that shows: + <ul> + <li> the inheritance relation with base classes + (using solid blue/green/red arrows, for public,protected,private + inheritance).</li> + <li> the containment relations with other structs + and class (using purple dashed arrows with variable names as labels) + (currently supported for HTML and RTF only)</li> + </ul></li> + </ul> + <p> + For the include dependency graph and the collaboration graph, + doxygen will render a transitive closure of the relation. If + the diagram becomes too large (currently wider than 1024 pixels), + only the maximum graph depth (as seen from the root of the + graph) that still fits will be drawn. (the nodes that can still be + expanded are shown with a red border in this case). + </p><p> + For HTML all graphs are drawn as client side clickable image maps.</p></li> +<li> Each file now has a list the files it includes + (with links to the sources if available)</li> +<li> For class documentation it is now possible to choose how the + <code>#include</code> statement should look like + (i.e. like "stdio.h" or <stdio.h>). + This can be done using the third argument of + the <code>\class</code> command. + Example: <pre>\class myclass myclass.h "mydir/myclass.h"</pre></li> +<li> If the - character is used as the first character in a comment line + it is interpreted as an item of a bullet list. Subitems are also + possible. Here is an example: + <pre> + /*! + * A list: + * - item 1 + * - subitem 1 + * - item 2 + * - subitem 1 + * - subsubitem + * - subitem 2 + * - item 3 + * - item 4 + * + * Starting a new paragraph in a top level item ends the list! + */ + </pre> + + Notice: tabs can be used for indenting, but the TAB_SIZE tag in the + configuration file must be set correctly!</li> +<li> Function/member arguments can now be documented, like this + <pre> + /*! This function finds the first occurrence of a + * substring in a string. + */ + char *strstr(const char *haystack, /*!< the string to search in. */ + const char *needle) /*!< the substring to search for. */ + { + } + </pre></li> +<li> Three new section commands <code>\pre</code>, <code>\post</code> and + <code>\invariant</code> are added to describe + preconditions, postcondictions and invariants respectively.</li> +<li> Variable/enum initializers and define definitions are + now included in documentation (unless the initializer/definition + is more than 30 lines long)</li> +<li> Added new configuration option IGNORE_PREFIX that can be + used to ignore a specified prefix while generating the alphabetical + class index.</li> +</ul> + +<h3>Bug fixes</h3> +<ul> +<li> All defines were shown as function macros in the documentation section.</li> +<li> Fixed bug with parsing multi-line defines on Windows (\r problem). </li> +<li> Protection level of members inside nested anonymous compounds was not + set correctly.</li> +<li> Class diagram was not correct in case the same class was inherited + via two different paths (bug introduced in 1.0.0).</li> +<li> If a tag is specified two times in the config file, then the second + definition will correctly overwrite the value of the first occurrence.</li> +<li> For multiple defines with comments after them only the first was + cross-referenced with the sources.</li> +<li> Autolinks to #defines looked like function macro even if they weren't.</li> +<li> Members that were hidden deep in an inheritance tree, got multiple + scope prefixes in the "all members list", while a scope prefix to + the member in the base class was enough to use it unambiguishly.</li> +<li> <code>\latexonly ... \endlatexonly</code> in the main page produced + erroneous text in refman.tex</li> +<li> The keywords in header and footer were only evaluated once.</li> +<li> Formulas now also work in documentation blocks that are put after an + item.</li> +<li> The source code could produce links to the wrong class for + a code fragment like <code>a.f()</code> in + case two classes have the same member variable `a', but with a + different class types and those classes both had the member + function `f'.</li> +<li> array type arguments (like int a[2]) where not matched if the argument + name of declaration and definition were different. </li> +<li> memory in code.l is now returned at the appropriate times.</li> +</ul> <hr/> Go <a href="index.html">back</a> to the main page. <p> diff --git a/doc/commands.doc b/doc/commands.doc index 12b85db..3711e29 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 @@ -209,6 +214,7 @@ documentation: \refitem cmdamp \\\& \refitem cmdtilde \\~ \refitem cmdlt \\\< +\refitem cmdeq \\= \refitem cmdgt \\\> \refitem cmdhash \\\# \refitem cmdperc \\\% @@ -306,7 +312,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 +339,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 @@ -442,14 +516,15 @@ Structural indicators \endlatexonly </p><hr> -\section cmdexample \\example <file-name> +\section cmdexample \\example[{lineno}] <file-name> \addindex \\example Indicates that a comment block contains documentation for a source code - example. The name of the source file is \<file-name\>. The text of - this file will be included in the documentation, just after the - documentation contained in the comment block. All examples are placed - in a list. The source code is scanned for documented members and classes. + example. The name of the source file is \<file-name\>. + The contents of this file will be included in the documentation, just after the + documentation contained in the comment block. + You can add option `{lineno}` to enable line numbers for the example if desired. + All examples are placed in a list. The source code is scanned for documented members and classes. If any are found, the names are cross-referenced with the documentation. Source files or directories can be specified using the \ref cfg_example_path "EXAMPLE_PATH" @@ -500,7 +575,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} @@ -652,7 +726,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} @@ -697,7 +770,7 @@ Structural indicators command are considered to be internal as well. Only a new section at the same level will end the fragment that is considered internal. - You can use \ref cfg_internal_docs "INTERNAL_DOCS" in the config file + You can use \ref cfg_internal_docs "INTERNAL_DOCS" in the configuration file to show (\c YES) or hide (\c NO) the internal documentation. \sa section \ref cmdendinternal "\\endinternal". @@ -1108,6 +1181,14 @@ Structural indicators This command is equivalent to \ref cmdfn "\\fn", \ref cmdproperty "\\property", and \ref cmdtypedef "\\typedef". + Note that for PHP one can also specify the type of the variable. + The syntax is similar as for the `phpDocumentor` but the description has to start + at the next line, i.e. +\verbatim +@var datatype $varname +Description +\endverbatim + \sa section \ref cmdfn "\\fn", \ref cmdproperty "\\property", and \ref cmdtypedef "\\typedef". <hr> @@ -1281,6 +1362,8 @@ The output will be different depending on whether or not \ref cfg_enabled_sectio contains \c TEST, or \c DEV \sa sections \ref cmdendcond "\\endcond" and \ref cfg_enabled_sections "ENABLED_SECTIONS". + \note Due to the moment of parsing the \c \\cond and \ref cmdendcond "\\endcond" commands cannot + be used in \ref cfg_aliases "ALIASES". <hr> \section cmdcopyright \\copyright { copyright description } @@ -1357,6 +1440,8 @@ contains \c TEST, or \c DEV Ends a conditional section that was started by \ref cmdcond "\\cond". \sa section \ref cmdcond "\\cond". + \note Due to the moment of parsing the \c \\endcond and \ref cmdcond "\\cond" commands cannot + be used in \ref cfg_aliases "ALIASES". <hr> \section cmdendif \\endif @@ -1571,7 +1656,7 @@ void setPosition(double x,double y,double z,double t) Note that for PHP one can also specify the type (or types if you separate them with a pipe symbol) which are allowed for a parameter (as this is not part of the definition). - The syntax is the same as for phpDocumentor, i.e. + The syntax is the same as for the `phpDocumentor`, i.e. \verbatim @param datatype1|datatype2 $paramname description \endverbatim @@ -1875,7 +1960,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> @@ -2016,15 +2101,23 @@ Make sure you have first read \ref intro "the introduction". \endverbatim <hr> -\section cmdtableofcontents \\tableofcontents +\section cmdtableofcontents \\tableofcontents['{'[option[:level]][,option[:level]]*'}'] \addindex \\tableofcontents Creates a table of contents at the top of a page, listing all - sections and subsections in the page. + sections and subsections in the page. The `option` can be `HTML` or `LaTeX` + 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` 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. \warning This command only works inside related page documentation and \e not in other documentation blocks and only has effect in the - HTML output! + the specified output! <hr> \section cmdsection \\section <section-name> (section title) @@ -2131,16 +2224,12 @@ Commands for displaying examples for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen. \endlatexonly - Alternatively, the \ref cmdsnippet "\\snippet" command can be used to - include only a fragment of a source file. For this to work the - fragment has to be marked. - \sa sections \ref cmdline "\\line", \ref cmdskip "\\skip", \ref cmdskipline "\\skipline", \ref cmduntil "\\until", and \ref cmdinclude "\\include". </p><hr> -\section cmdinclude \\include <file-name> +\section cmdinclude \\include[{lineno|doc}] <file-name> \addindex \\include This command can be used to include a source file as a block of code. @@ -2174,33 +2263,38 @@ Commands for displaying examples \note Doxygen's special commands do not work inside blocks of code. It is allowed to nest C-style comments inside a code block though. + You can add option `{lineno}` to enable line numbers for the included code if desired. + + You can add option `{doc}` to treat the file as documentation rather than code. + + \note Some that when using the `{doc}` option, + commands like \ref cmdcond "\\cond" and \ref cmdif "\\if" don't work with + this command due to the moment of parsing. + + \note The included documentation should not have comment signs in it as they will appear + in the documentation as well. + \sa sections \ref cmdexample "\\example", \ref cmddontinclude "\\dontinclude", - \ref cmdverbatim "\\verbatim" and \ref cmdincludedoc "\\includedoc". + \ref cmdverbatim "\\verbatim", \ref cmdincludedoc "\\includedoc", and + \ref cmdsnippet "\\snippet". <hr> \section cmdincludelineno \\includelineno <file-name> \addindex \\includelineno - This command works the same way as \ref cmdinclude "\\include", but will add line - numbers to the included file. + This command is obsolete and is still supported for backward compatibility reasons, + it works the same way as \ref cmdinclude "\\include{lineno}" - \sa sections \ref cmdinclude "\\include" and \ref cmdsnippetlineno "\\snippetlineno". + \sa sections \ref cmdinclude "\\include{lineno}". <hr> \section cmdincludedoc \\includedoc <file-name> \addindex \\includedoc - This command works the same way as \ref cmdinclude "\\include", but it will include - the content of the file as if it were at the place where this command is called. - The result is that the content is parsed by doxygen and placed in the documentation. - - \note Some commands like \ref cmdcond "\\cond" and \ref cmdif "\\if" don't work with - this command due to the moment of parsing. + This command is obsolete and is still supported for backward compatibility reasons, + it works the same way as \ref cmdinclude "\\include{doc}" - \note The included documentation should not have comment signs in it as they will appear - in the documentation as well. - - \sa section \ref cmdinclude "\\include". + \sa section \ref cmdinclude "\\include{doc}". <hr> \section cmdline \\line ( pattern ) @@ -2258,7 +2352,7 @@ Commands for displaying examples See section \ref cmddontinclude "\\dontinclude" for an example. <hr> -\section cmdsnippet \\snippet <file-name> ( block_id ) +\section cmdsnippet \\snippet[{lineno|doc}] <file-name> ( block_id ) \addindex \\snippet Where the \ref cmdinclude "\\include" command can be used to include @@ -2301,34 +2395,37 @@ Commands for displaying examples Note also that the [block_id] markers should appear exactly twice in the source file. + You can add option `{lineno}` to enable line numbers for the snippet if desired. + + You can add option `{doc}` to treat the file as documentation rather than code. + + \note Some that when using the `{doc}` option, + commands like \ref cmdcond "\\cond" and \ref cmdif "\\if" don't work with + this command due to the moment of parsing. + + \note The included documentation should not have comment signs in it as they will appear + in the documentation as well. + see section \ref cmddontinclude "\\dontinclude" for an alternative way to include fragments of a source file that does not require markers. - \sa section \ref cmdsnippetdoc "\\snippetdoc" and \ref cmdsnippetlineno "\\snippetlineno". <hr> \section cmdsnippetlineno \\snippetlineno <file-name> ( block_id ) \addindex \\snippetlineno - This command works the same way as \ref cmdsnippet "\\snippet", but will add line - numbers to the included snippet. + This command is obsolete and is still supported for backward compatibility reasons, + it works the same way as \ref cmdsnippet "\\snippet{lineno}" - \sa sections \ref cmdsnippet "\\snippet" and \ref cmdincludelineno "\\includelineno". + \sa sections \ref cmdsnippet "\\snippet{lineno}" <hr> \section cmdsnippetdoc \\snippetdoc <file-name> ( block_id ) \addindex \\snippetdoc - This command works the same way as \ref cmdsnippet "\\snippet", but it will include - the content of the file between the `block-id`s as if it were at the place where this command is called. - The result is that the content is parsed by doxygen and placed in the documentation. + This command is obsolete and is still supported for backward compatibility reasons, + it works the same way as \ref cmdsnippet "\\snippet{doc}" - \note Some commands like \ref cmdcond "\\cond" and \ref cmdif "\\if" don't work with - this command due to the moment of parsing. - - \note The included documentation should not have comment signs in it as they will appear - in the documentation as well. - - \sa section \ref cmdsnippet "\\snippet" and \ref cmdincludedoc "\\includedoc". + \sa section \ref cmdsnippet "\\snippet{doc}" and \ref cmdinclude "\\include{doc}". <hr> \section cmduntil \\until ( pattern ) @@ -2359,7 +2456,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. @@ -2367,9 +2464,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> @@ -2583,7 +2688,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", @@ -2639,6 +2744,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 @@ -3028,11 +3149,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 @@ -3057,13 +3179,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 @@ -3255,7 +3381,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] @@ -3337,6 +3463,14 @@ class Receiver the start of a line. <hr> +\section cmdeq \\= + + \addindex \\= + This command writes an equal sign (`=`) to the output. This + character sequence has to be escaped in some cases, because it is used + in Markdown header processing. + +<hr> \section cmddcolon \\:: \addindex \\:: @@ -3399,4 +3533,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 de9a30d..02805da 100644 --- a/doc/custcmd.doc +++ b/doc/custcmd.doc @@ -16,7 +16,7 @@ */ /*! \page custcmd Custom Commands -\tableofcontents +\tableofcontents{html,latex} Doxygen provides a large number of \ref commands "special commands", \ref xmlcmds "XML commands", and \ref htmlcmds "HTML commands". @@ -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/customize.doc b/doc/customize.doc index 9ef3891..7b2729d 100644 --- a/doc/customize.doc +++ b/doc/customize.doc @@ -16,7 +16,7 @@ */ /*! \page customize Customizing the output -\tableofcontents +\tableofcontents{html,latex} Doxygen provides various levels of customization. The section \ref minor_tweaks "Minor Tweaks" discusses what to @@ -114,7 +114,7 @@ This will create 3 files: referencing those extra files via \ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET". -You should edit these files and then reference them from the config file. +You should edit these files and then reference them from the configuration file. - \ref cfg_html_header "HTML_HEADER" = \c header.html - \ref cfg_html_footer "HTML_FOOTER" = \c footer.html - \ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET" = \c my_customdoxygen.css @@ -158,7 +158,7 @@ doxygen -l optionally the name of the layout file can be specified, if omitted \c DoxygenLayout.xml will be used. -The next step is to mention the layout file in the config file +The next step is to mention the layout file in the configuration file \verbatim LAYOUT_FILE = DoxygenLayout.xml \endverbatim @@ -289,7 +289,12 @@ The following generic elements are possible for each page: <dt>\c detaileddescription <dd>Represents the detailed description on a page. <dt>\c authorsection - <dd>Represents the author section of a page (only used for man pages). + <dd>Represents the author section of a page (only used for man pages). This is + a separate section for man pages with a text like: + `Generated automatically by Doxygen for My Project from the source code.` + This should not be misinterpreted with the doxygen commands \ref cmdauthor + "\\author" or \ref cmdauthors "\\authors" that generate an author paragraph + inside a detailed description. <dt>\c memberdecl <dd>Represents the quick overview of members on a page (member declarations). This elements has child elements per type of member list. 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 81cfdd0..d4eab5d 100644 --- a/doc/docblocks.doc +++ b/doc/docblocks.doc @@ -15,7 +15,7 @@ * */ /*! \page docblocks Documenting the code -\tableofcontents +\tableofcontents{html,latex} This chapter covers two topics: 1. How to put comments in your code such that doxygen incorporates them in @@ -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 @@ -293,14 +291,14 @@ The brief descriptions are included in the member overview of a class, namespace or file and are printed using a small italic font (this description can be hidden by setting \ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" to \c NO in -the config file). By default the brief descriptions become the first +the configuration file). By default the brief descriptions become the first sentence of the detailed descriptions (but this can be changed by setting the \ref cfg_repeat_brief "REPEAT_BRIEF" 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 @@ -473,7 +467,7 @@ Here is the same example again but now using doxygen style comments: Since python looks more like Java than like C or C++, you should set \ref cfg_optimize_output_java "OPTIMIZE_OUTPUT_JAVA" to \c YES in the -config file. +configuration file. \subsection vhdlblocks Comment blocks in VHDL @@ -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 @@ -503,7 +496,7 @@ Here is an example VHDL file with doxygen comments: To get proper looking output you need to set \ref cfg_optimize_output_vhdl "OPTIMIZE_OUTPUT_VHDL" to \c YES in the -config file. This will also affect a number of other settings. When they +configuration file. This will also affect a number of other settings. When they were not already set correctly doxygen will produce a warning telling which settings where overruled. @@ -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. @@ -595,7 +588,7 @@ before the command. <!-- To use your own keywords you an map these keyword to the recognized commands -using the \ref cfg_tcl_subs "TCL_SUBST" entry in the config file. +using the \ref cfg_tcl_subs "TCL_SUBST" entry in the configuration file. The entry contain a list of word-keyword mappings. To use the itcl::* commands without the leading namespace use p.e.: @@ -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 1deb7b6..a9c6b38 100644 --- a/doc/doxygen.1 +++ b/doc/doxygen.1 @@ -3,7 +3,7 @@ doxygen \- documentation system for various programming languages .SH DESCRIPTION Doxygen is a documentation system for C++, C, Java, Objective-C, IDL -(Corba and Microsoft flavors) and to some extent PHP, C#, and D. +(Corba and Microsoft flavors), Fortran, Python, VHDL and to some extent PHP, C#, and D. .PP You can use doxygen in a number of ways: .TP @@ -25,7 +25,7 @@ If - is used for configName doxygen will read from standard input. .TP 4) Use doxygen to generate a template file controlling the layout of the generated documentation: .IP -doxygen -l layoutFileName.xml +doxygen -l [layoutFileName.xml] .TP 5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex. .TP @@ -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.css b/doc/doxygen_manual.css index 51cc8b0..87d560c 100644 --- a/doc/doxygen_manual.css +++ b/doc/doxygen_manual.css @@ -1554,7 +1554,7 @@ table.markdownTable { } table.markdownTable td, table.markdownTable th { - border: 1px solid ##37; + border: 1px solid #2D4068; padding: 3px 7px 2px; } diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex index 3e4cd49..1a44574 100644 --- a/doc/doxygen_manual.tex +++ b/doc/doxygen_manual.tex @@ -70,9 +70,15 @@ \hfuzz=15pt \setlength{\emergencystretch}{15pt} \setlength{\parindent}{0pt} -\setlength{\parskip}{0.2cm} +\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 +\usepackage{etoc} +\etocsettocstyle{\doxytocparskip}{\doxynormalparskip} \begin{document} \pagenumbering{alph} \begin{titlepage} @@ -85,27 +91,28 @@ Written by Dimitri van Heesch\\[2ex] \end{titlepage} \clearemptydoublepage \pagenumbering{Roman} +\chapter*{Contents} \tableofcontents \clearemptydoublepage \pagenumbering{arabic} \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} @@ -114,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/doxygen_usage.doc b/doc/doxygen_usage.doc index bcb14e8..20a5763 100644 --- a/doc/doxygen_usage.doc +++ b/doc/doxygen_usage.doc @@ -80,8 +80,8 @@ doxygen -w html header.html footer.html stylesheet.css <config_file> doxygen -w latex header.tex footer.tex doxygen.sty <config_file> \endverbatim If you need non-default options (for instance to use extra \LaTeX packages) -you need to make a config file with those options set correctly and then specify -that config file after the generated files (make a backup of the configuration +you need to make a configuration file with those options set correctly and then specify +that configuration file after the generated files (make a backup of the configuration file first so you don't loose it in case you forget to specify one of the output files). <li>For RTF output, you can generate the default style sheet file (see diff --git a/doc/doxyindexer.1 b/doc/doxyindexer.1 index ae4b282..b0d46d0 100644 --- a/doc/doxyindexer.1 +++ b/doc/doxyindexer.1 @@ -3,7 +3,7 @@ doxyindexer \- creates a search index from raw search data .SH SYNOPSIS .B doxyindexer -[\fI-o output_dir\fR] \fIsearchdata.xml \fR[\fIsearchdata2.xml\fR...] ] +[\fI-o output_dir\fR] \fIsearchdata.xml \fR[\fIsearchdata2.xml\fR...] .SH DESCRIPTION Generates a search index called \fBdoxysearch.db\fR from one or more search data files produced by doxygen. Use diff --git a/doc/doxysearch.1 b/doc/doxysearch.1 index a00124f..a26107b 100644 --- a/doc/doxysearch.1 +++ b/doc/doxysearch.1 @@ -2,10 +2,10 @@ .SH NAME doxysearch.cgi \- search engine used for searching in doxygen documentation. .SH SYNOPSIS -.B doxyindexer.cgi +.B doxysearch.cgi .SH DESCRIPTION CGI binary that is used by doxygen generated HTML output to search for words. The tool uses the search index called \fBdoxysearch.db\fR produced by doxyindexer. .SH SEE ALSO -doxygen(1), doxysearch(1), doxywizard(1). +doxygen(1), doxyindexer(1), doxywizard(1). diff --git a/doc/doxywizard_expert.png b/doc/doxywizard_expert.png Binary files differindex 93fd4ee..5eb14d4 100644 --- a/doc/doxywizard_expert.png +++ b/doc/doxywizard_expert.png diff --git a/doc/doxywizard_main.png b/doc/doxywizard_main.png Binary files differindex e57c144..b170e15 100644 --- a/doc/doxywizard_main.png +++ b/doc/doxywizard_main.png diff --git a/doc/doxywizard_menu.png b/doc/doxywizard_menu.png Binary files differindex 37adc46..7f37192 100644 --- a/doc/doxywizard_menu.png +++ b/doc/doxywizard_menu.png diff --git a/doc/doxywizard_page1.png b/doc/doxywizard_page1.png Binary files differindex ee3181d..3e008d0 100644 --- a/doc/doxywizard_page1.png +++ b/doc/doxywizard_page1.png diff --git a/doc/doxywizard_page2.png b/doc/doxywizard_page2.png Binary files differindex dc9b5a8..8343902 100644 --- a/doc/doxywizard_page2.png +++ b/doc/doxywizard_page2.png diff --git a/doc/doxywizard_page3.png b/doc/doxywizard_page3.png Binary files differindex f75e63f..0201981 100644 --- a/doc/doxywizard_page3.png +++ b/doc/doxywizard_page3.png diff --git a/doc/doxywizard_page4.png b/doc/doxywizard_page4.png Binary files differindex e4f4361..1068e6c 100644 --- a/doc/doxywizard_page4.png +++ b/doc/doxywizard_page4.png diff --git a/doc/emojisup.doc b/doc/emojisup.doc new file mode 100644 index 0000000..4c861fe --- /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 + - 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 +- For XML there is a dedicated `<emoji>` tag with name and unicode attributes. + +\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.doc b/doc/extsearch.doc index 99a7219..36116ff 100644 --- a/doc/extsearch.doc +++ b/doc/extsearch.doc @@ -58,7 +58,7 @@ browser via an URL starting with http:) How to setup a web server is outside the scope of this document, but if you for instance have Apache installed, you could simply copy the -`doxysearch.cgi` file from doxygen's `bin` dir to the `cgi-bin` of the +`doxysearch.cgi` file from doxygen's `bin` directory to the `cgi-bin` directory of the Apache web server. Read the <a href="http://httpd.apache.org/docs/2.2/howto/cgi.html">apache documentation</a> for details. To test if `doxysearch.cgi` is accessible start your web browser and @@ -73,7 +73,7 @@ You should get the following message: If you use Internet Explorer you may be prompted to download a file, which will then contain this message. -Since we didn't create or install a doxysearch.db it is ok for the test to +Since we didn't create or install a doxysearch.db it is OK for the test to fail for this reason. How to correct this is discussed in the next section. Before continuing with the next section add the above diff --git a/doc/extsearch_flow.png b/doc/extsearch_flow.png Binary files differindex e99450c..b6dc26c 100644 --- a/doc/extsearch_flow.png +++ b/doc/extsearch_flow.png diff --git a/doc/faq.doc b/doc/faq.doc index bbad8c0..f48e109 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -16,7 +16,7 @@ */ /*! \page faq Frequently Asked Questions -\tableofcontents +\tableofcontents{html,latex} \section faq_index How to get information on the index page in HTML? @@ -43,14 +43,14 @@ You should use the \ref cmdmainpage "\\mainpage" command inside a comment block <ol> <li>Is your class / file / namespace documented? If not, it will not be extracted from the sources unless \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES - in the config file. + in the configuration file. <li>Are the members private? If so, you must set \ref cfg_extract_private "EXTRACT_PRIVATE" to \c YES to make them appear in the documentation. <li>Is there a function macro in your class that does not end with a semicolon (e.g. MY_MACRO())? If so then you have to instruct doxygen's preprocessor to remove it. - This typically boils down to the following settings in the config file: + This typically boils down to the following settings in the configuration file: \verbatim ENABLE_PREPROCESSING = YES @@ -110,10 +110,10 @@ around the blocks that should be hidden and put: \verbatim PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS \endverbatim -in the config file then all blocks should be skipped by doxygen as long +in the configuration file then all blocks should be skipped by doxygen as long as \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to `YES`. -\section faq_code_inc How can I change what is after the <code>\#include</code> in the class documentation? +\section faq_code_inc How can I change what is after the \#include in the class documentation? In most cases you can use \ref cfg_strip_from_inc_path "STRIP_FROM_INC_PATH" to strip a user defined part of a path. @@ -210,16 +210,16 @@ remove the % and keep the word unlinked. No, not as such; doxygen needs to understand the structure of what it reads. If you don't mind spending some time on it, there are several options: - If the grammar of X is close to C or C++, then it is probably not too hard to - tweak src/scanner.l a bit so the language is supported. This is done + tweak \c src/scanner.l a bit so the language is supported. This is done for all other languages directly supported by doxygen (i.e. Java, IDL, C#, PHP). - 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 - src/scanner.l (and also by src/tagreader.cpp while reading tag files). + \c src/scanner.l (and also by \c src/tagreader.cpp while reading tag files). \section faq_lex Help! I get the cryptic message "input buffer overflow, can't enlarge buffer because scanner uses REJECT" @@ -235,7 +235,7 @@ should send me a code fragment that triggers the message. To work around the problem, put some line-breaks into your file, split it up into smaller parts, or exclude it from the input using EXCLUDE. -\section faq_latex When running make in the latex dir I get "TeX capacity exceeded". Now what? +\section faq_latex When running make in the latex directory I get "TeX capacity exceeded". Now what? You can edit the texmf.cfg file to increase the default values of the various buffers and then run "texconfig init". 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/formulas.doc b/doc/formulas.doc index 1649c19..520f089 100644 --- a/doc/formulas.doc +++ b/doc/formulas.doc @@ -17,9 +17,8 @@ /*! \page formulas Including formulas Doxygen allows you to put \LaTeX formulas in the -output (this works only for the HTML and \LaTeX output, -not for the RTF nor for the man page output). To be able to include -formulas (as images) in the HTML documentation, you will also need to +output (this works only for the HTML, \LaTeX and RTF output. To be able to include +formulas (as images) in the HTML and RTF documentation, you will also need to have the following tools installed <ul> <li>\c latex: the \LaTeX compiler, needed to parse the formulas. @@ -32,7 +31,7 @@ have the following tools installed For the HTML output there is also an alternative solution using <a href="https://www.mathjax.org">MathJax</a> which does not require the above tools. If you enable \ref cfg_use_mathjax "USE_MATHJAX" in -the config then the latex formulas will be copied to the HTML "as is" and a +the configuration then the latex formulas will be copied to the HTML "as is" and a client side javascript will parse them and turn them into (interactive) images. There are three ways to include formulas in the documentation. @@ -101,8 +100,8 @@ the section should contain valid command for the specific environment. \warning Currently, doxygen is not very fault tolerant in recovering from typos in formulas. It may be necessary to remove the -file <code>formula.repository</code> that is written to the html directory to -get rid of an incorrect formula. +files <code>formula.repository</code> that are written to the html and rtf directories to +get rid of an incorrect formula as well as the <code>form_*</code> files. \htmlonly Go to the <a href="tables.html">next</a> section or return to the 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/htmlcmds.doc b/doc/htmlcmds.doc index b8324f8..d483237 100644 --- a/doc/htmlcmds.doc +++ b/doc/htmlcmds.doc @@ -83,6 +83,8 @@ of a HTML tag are passed on to the HTML output only <li><tt>\</SMALL\></tt> Ends a <tt>\<SMALL\></tt> section. <li><tt>\<SPAN></tt> Starts an inline text fragment with a specific style (HTML only) <li><tt>\</SPAN></tt> Ends an inline text fragment with a specific style (HTML only) +<li><tt>\<STRIKE\></tt> Starts a section of strike through text. +<li><tt>\</STRIKE\></tt> Ends a section of strike through text. <li><tt>\<STRONG\></tt> Starts a section of bold text. <li><tt>\</STRONG\></tt> Ends a section of bold text. <li><tt>\<SUB\></tt> Starts a piece of text displayed in subscript. @@ -101,6 +103,8 @@ of a HTML tag are passed on to the HTML output only <li><tt>\</TT\></tt> Ends a <tt>\<TT\></tt> section. <li><tt>\<KBD\></tt> Starts a piece of text displayed in a typewriter font. <li><tt>\</KBD\></tt> Ends a <tt>\<KBD\></tt> section. +<li><tt>\<U\></tt> Starts a section of underlined text. +<li><tt>\</U\></tt> Ends a section of underlined text. <li><tt>\<UL\></tt> Starts an unnumbered item list. <li><tt>\</UL\></tt> Ends an unnumbered item list. <li><tt>\<VAR\></tt> Starts a piece of text displayed in an italic font. diff --git a/doc/index.doc b/doc/index.doc index 14f0396..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 © 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> @@ -151,7 +153,7 @@ Although doxygen is successfully used by large number of companies and open source projects already, there is always room for improvement. <p> You can submit enhancement requests in -<a href="https://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_severity=enhancement">the bug tracker</a>. +<a href="https://github.com/doxygen/doxygen/issues">the bug tracker</a>. Make sure the severity of the bug report is set to "enhancement". <h2>Acknowledgments</h2> diff --git a/doc/infoflow.png b/doc/infoflow.png Binary files differindex d975be1..f676724 100644 --- a/doc/infoflow.png +++ b/doc/infoflow.png diff --git a/doc/install.doc b/doc/install.doc index 6db8102..d64b259 100644 --- a/doc/install.doc +++ b/doc/install.doc @@ -17,7 +17,7 @@ /*! \page install Installation \addindex installation -\tableofcontents +\tableofcontents{html,latex} First go to the <a href="http://www.doxygen.org/download.html">download</a> page @@ -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. @@ -203,15 +208,15 @@ of the GraphViz package to render nicer diagrams, see the \ref cfg_have_dot "HAVE_DOT" option in the configuration file. If you want to produce compressed HTML files (see \ref -cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the config file, then +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 config file, then +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 e5aebd1..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 @@ -300,6 +311,9 @@ to produce a table of contents at the start of the page, listing all sections. Note that using `[TOC]` is the same as using a \ref cmdtableofcontents "\\tableofcontents" command. +Note that the \ref cfg_toc_include_headings "TOC_INCLUDE_HEADINGS" has to be set +to a value > 0 otherwise no table of contents is shown when using \ref md_headers "Markdown Headers". + \subsection md_tables Tables Of the features defined by "Markdown Extra" is support for @@ -515,7 +529,7 @@ and in other sections that need to be processed without changes Markdown allows both a single tab or 4 spaces to start a code block. Since doxygen already replaces tabs by spaces before doing Markdown -processing, the effect will only be same if TAB_SIZE in the config file +processing, the effect will only be same if TAB_SIZE in the configuration file has been set to 4. When it is set to a higher value spaces will be present in the code block. A lower value will prevent a single tab to be interpreted as the start of a code block. @@ -564,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/preprocessing.doc b/doc/preprocessing.doc index 30d4cf3..882e60d 100644 --- a/doc/preprocessing.doc +++ b/doc/preprocessing.doc @@ -55,7 +55,7 @@ both statements, i.e.: \endverbatim In case you want to expand the \c CONST_STRING macro, you should set the -\ref cfg_macro_expansion "MACRO_EXPANSION" tag in the config file +\ref cfg_macro_expansion "MACRO_EXPANSION" tag in the configuration file to \c YES. Then the result after preprocessing becomes: \verbatim @@ -130,7 +130,7 @@ without macro expansion doxygen will get confused, but we may not want to expand the \c REFIID macro, because it is documented and the user that reads the documentation should use it when implementing the interface. -By setting the following in the config file: +By setting the following in the configuration file: \verbatim ENABLE_PREPROCESSING = YES diff --git a/doc/searching.doc b/doc/searching.doc index 00c6141..9bc518a 100644 --- a/doc/searching.doc +++ b/doc/searching.doc @@ -35,7 +35,7 @@ has its own advantages and disadvantages: required to make it work. To enable it set - \ref cfg_searchengine "SEARCHENGINE" to \c YES in the config file + \ref cfg_searchengine "SEARCHENGINE" to \c YES in the configuration file and make sure \ref cfg_server_based_search "SERVER_BASED_SEARCH" is set to \c NO. @@ -53,7 +53,7 @@ has its own advantages and disadvantages: To enable this set both \ref cfg_searchengine "SEARCHENGINE" and - \ref cfg_server_based_search "SERVER_BASED_SEARCH" to \c YES in the config + \ref cfg_server_based_search "SERVER_BASED_SEARCH" to \c YES in the configuration file and set \ref cfg_external_search "EXTERNAL_SEARCH" to \c NO. Advantages over the client side search engine are that it provides full @@ -100,9 +100,9 @@ has its own advantages and disadvantages: and Windows even supports it natively. To enable this set \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" to \c YES - in the config file. To let doxygen compile the HTML Help file for you, + in the configuration file. To let doxygen compile the HTML Help file for you, you also need to specify the path to the HTML compiler (hhc.exe) using the - \ref cfg_hhc_location "HHC_LOCATION" config option and the name of the + \ref cfg_hhc_location "HHC_LOCATION" configuration option and the name of the resulting CHM file using \ref cfg_chm_file "CHM_FILE". An advantage of this method is that the result is a single file that can @@ -122,11 +122,11 @@ has its own advantages and disadvantages: provided by Apple). To enable the creation of doc sets set \ref cfg_generate_docset "GENERATE_DOCSET" - to \c YES in the config file. There are a couple of other doc set related + to \c YES in the configuration file. There are a couple of other doc set related 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 Binary files differnew file mode 100644 index 0000000..a3abe00 --- /dev/null +++ b/doc/smile.png diff --git a/doc/starting.doc b/doc/starting.doc index c869867..f9ae9a2 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -15,7 +15,7 @@ * */ /*! \page starting Getting started -\tableofcontents +\tableofcontents{html,latex} The executable \c doxygen is the main program that parses the sources and generates the documentation. See section \ref doxygen_usage for more @@ -77,7 +77,7 @@ You can probably leave the values of most tags in a generated template configuration file to their default value. See section \ref config for more details about the configuration file. -If you do not wish to edit the config file with a text editor, you should +If you do not wish to edit the configuration file with a text editor, you should have a look at \ref doxywizard_usage "doxywizard", which is a GUI front-end that can create, read and write doxygen configuration files, and allows setting configuration options by entering them via dialogs. @@ -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 9584c0c..c490ae1 100644 --- a/doc/trouble.doc +++ b/doc/trouble.doc @@ -89,14 +89,13 @@ know why. \section bug_reports How to report a bug -Bugs are tracked in GNOME's <a href="http://bugzilla.gnome.org">bugzilla</a> database. +Bugs are tracked in GitHub's <a href="https://github.com/doxygen/doxygen/issues">issue tracker</a>. Before submitting a -<a href="http://bugzilla.gnome.org/enter_bug.cgi?product=doxygen">new bug</a>, -first <a href="http://bugzilla.gnome.org/query.cgi?format=advanced&product=doxygen">search</a> -through the database if the same bug has already been submitted by others (the doxygen -product will be preselected). +<a href="https://github.com/doxygen/doxygen/issues/new">new bug</a>, +first <a href="https://github.com/doxygen/doxygen/issues">search</a> +through the database if the same bug has already been submitted by others. If you believe you have found a new bug, -please <a href="http://bugzilla.gnome.org/enter_bug.cgi?product=doxygen">report it</a>. +please <a href="https://github.com/doxygen/doxygen/issues/new">report it</a>. If you are unsure whether or not something is a bug, please ask help on the <a href="http://sourceforge.net/mail/?group_id=5971">users mailing list</a> @@ -109,11 +108,11 @@ always try to include the following information in your bug report: - The version of doxygen you are using (for instance 1.5.3, use `doxygen --version` if you are not sure). - The name and version number of your operating system (for instance - SuSE Linux 6.4) + Ubuntu Linux 18.04 LTS) - It is usually a good idea to send along the configuration file as well, but please use doxygen with the <code>-s</code> flag while generating it to keep it small (use <code>doxygen -s -u [configName]</code> to strip - the comments from an existing config file). + the comments from an existing configuration file). - The easiest (and often the only) way for me to fix bugs is if you can attach a small example demonstrating the problem you have to the bug report, so I can reproduce it on my machine. Please make sure the example is valid @@ -129,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 501bf91..b59095b 100644 --- a/doc/xmlcmds.doc +++ b/doc/xmlcmds.doc @@ -70,6 +70,9 @@ Here is the list of tags supported by doxygen: <li><tt>\<typeparamref name="paramName"\></tt> Refers to a parameter with name "paramName". Similar to using \ref cmda "\\a". <li><tt>\<value\></tt> Identifies a property. Ignored by doxygen. +<li><tt>\<![CDATA[...]]\></tt> The text inside this tag (on the ...) is handled as normal + doxygen comment except for the XML special characters `<`, `>` and + `&` that are used as if they were escaped. </ul> Here is an example of a typical piece of code using some of the above commands: @@ -101,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/define.h b/examples/define.h index c330447..0cd7ae3 100644 --- a/examples/define.h +++ b/examples/define.h @@ -10,7 +10,9 @@ */ /*! - Computes the absolute value of its argument \a x. + \brief Computes the absolute value of its argument \a x. + \param x input value. + \returns absolute value of \a x. */ #define ABS(x) (((x)>0)?(x):-(x)) #define MAX(x,y) ((x)>(y)?(x):(y)) 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/include.cpp b/examples/include.cpp index ba8c054..d9ea5ea 100644 --- a/examples/include.cpp +++ b/examples/include.cpp @@ -8,7 +8,7 @@ class Include_Test void example(); }; -/*! \page example +/*! \page pag_example * \dontinclude include_test.cpp * Our main function starts like this: * \skip main 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/tclexample.tcl b/examples/tclexample.tcl index 6edef66..e512aee 100644 --- a/examples/tclexample.tcl +++ b/examples/tclexample.tcl @@ -10,7 +10,7 @@ exec tclsh "$0" "$@" #\code namespace eval ns { ## Documented proc \c ns_proc . - # param[in] arg some argument + # \param[in] arg some argument proc ns_proc {arg} {} ## Documented var \c ns_var . # Some documentation. @@ -22,13 +22,13 @@ namespace eval ns { ## Destroy object. destructor {exit} ## Documented itcl method \c itcl_method_x . - # param[in] arg Argument + # \param[in] arg Argument private method itcl_method_x {arg} ## Documented itcl method \c itcl_method_y . - # param[in] arg Argument + # \param[in] arg Argument protected method itcl_method_y {arg} {} ## Documented itcl method \c itcl_method_z . - # param[in] arg Argument + # \param[in] arg Argument public method itcl_method_z {arg} {} ## Documented common itcl var \c itcl_Var . common itcl_Var @@ -49,13 +49,13 @@ namespace eval ns { # Defined inside class variable oo_var ## \private Documented oo method \c oo_method_x . - # param[in] arg Argument + # \param[in] arg Argument method oo_method_x {arg} {} ## \protected Documented oo method \c oo_method_y . - # param[in] arg Argument + # \param[in] arg Argument method oo_method_y {arg} {} ## \public Documented oo method \c oo_method_z . - # param[in] arg Argument + # \param[in] arg Argument method oo_method_z {arg} {} } } @@ -72,7 +72,7 @@ oo::define ns::oo_class { } ## Documented global proc \c glob_proc . -# param[in] arg Argument +# \param[in] arg Argument proc glob_proc {arg} {puts $arg} variable glob_var;#< Documented global var \c glob_var\ 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/Makefile b/jquery/Makefile index 02cdd34..eac56bc 100644 --- a/jquery/Makefile +++ b/jquery/Makefile @@ -1,4 +1,4 @@ -JQUERY_VERSION = 1.7.1 +JQUERY_VERSION = 1.7.2 JQUERY_UI_VERSION = 1.8.18 HASHCHANGE_VERSION = 1.3 SCROLL_VERSION = 1.4.2 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/jquery/jquery-1.7.2.js b/jquery/jquery-1.7.2.js new file mode 100644 index 0000000..3774ff9 --- /dev/null +++ b/jquery/jquery-1.7.2.js @@ -0,0 +1,9404 @@ +/*! + * jQuery JavaScript Library v1.7.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Mar 21 12:46:34 2012 -0700 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, pass ) { + var exec, + bulk = key == null, + i = 0, + length = elems.length; + + // Sets many values + if ( key && typeof key === "object" ) { + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); + } + chainable = 1; + + // Sets one value + } else if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = pass === undefined && jQuery.isFunction( value ); + + if ( bulk ) { + // Bulk operations only iterate when executing function values + if ( exec ) { + exec = fn; + fn = function( elem, key, value ) { + return exec.call( jQuery( elem ), value ); + }; + + // Otherwise they run against the entire set + } else { + fn.call( elems, value ); + fn = null; + } + } + + if ( fn ) { + for (; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + } + + chainable = 1; + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + fired = true; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true, + pixelMargin: true + }; + + // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead + jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for ( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, + paddingMarginBorderVisibility, paddingMarginBorder, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + paddingMarginBorder = "padding:0;margin:0;border:"; + positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; + paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; + style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; + html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" + + "<table " + style + "' cellpadding='0' cellspacing='0'>" + + "<tr><td></td></tr></table>"; + + container = document.createElement("div"); + container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + div.innerHTML = ""; + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.innerHTML = ""; + div.style.width = div.style.padding = "1px"; + div.style.border = 0; + div.style.overflow = "hidden"; + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = "block"; + div.style.overflow = "visible"; + div.innerHTML = "<div style='width:5px;'></div>"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + } + + div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + if ( window.getComputedStyle ) { + div.style.marginTop = "1%"; + support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; + } + + if ( typeof container.style.zoom !== "undefined" ) { + container.style.zoom = 1; + } + + body.removeChild( container ); + marginDiv = div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, part, attr, name, l, + elem = this[0], + i = 0, + data = null; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attr = elem.attributes; + for ( l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split( ".", 2 ); + parts[1] = parts[1] ? "." + parts[1] : ""; + part = parts[1] + "!"; + + return jQuery.access( this, function( value ) { + + if ( value === undefined ) { + data = this.triggerHandler( "getData" + part, [ parts[0] ] ); + + // Try to fetch any internally stored data first + if ( data === undefined && elem ) { + data = jQuery.data( elem, key ); + data = dataAttr( elem, key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } + + parts[1] = value; + this.each(function() { + var self = jQuery( this ); + + self.triggerHandler( "setData" + part, parts ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + part, parts ); + }); + }, null, value, arguments.length > 1, null, false ); + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise( object ); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, isBool, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + isBool = rboolean.test( name ); + + // See #9699 for explanation of this approach (setting first, then removal) + // Do not do this for boolean attributes (see #10870) + if ( !isBool ) { + jQuery.attr( elem, name, "" ); + } + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( isBool && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true, + coords: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: selector && quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + special = jQuery.event.special[ event.type ] || {}, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers that should run if there are delegated events + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + + // Don't process events on disabled elements (#6911, #8165) + if ( cur.disabled !== true ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { // && selector != null + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + /* falls through */ + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} +// Expose origPOS +// "global" as in regardless of relation to brackets/parens +Expr.match.globalPOS = origPOS; + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = "<a name='" + id + "'/>"; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = "<a href='#'></a>"; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "<p class='TEST'></p>"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.globalPOS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style)/i, + rnocache = /<(?:script|object|embed|option|style)/i, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize <link> and <script> tags normally +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "div<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } else if ( arguments.length ) { + var set = jQuery.clean( arguments ); + set.push.apply( set, this.toArray() ); + return this.pushStack( set, "before", arguments ); + } + }, + + after: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } else if ( arguments.length ) { + var set = this.pushStack( this, "after", arguments ); + set.push.apply( set, jQuery.clean(arguments) ); + return set; + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + null; + } + + + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1></$2>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName( "*" ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function( value ) { + if ( this[0] && this[0].parentNode ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } else { + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; + } + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + var results, first, fragment, parent, + value = args[0], + scripts = []; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback, true ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call(this, i, table ? self.html() : undefined); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + parent = value && value.parentNode; + + // If we're in a fragment, just use that instead of building a new one + if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { + results = { fragment: parent }; + + } else { + results = jQuery.buildFragment( args, this, scripts ); + } + + fragment = results.fragment; + + if ( fragment.childNodes.length === 1 ) { + first = fragment = fragment.firstChild; + } else { + first = fragment.firstChild; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { + callback.call( + table ? + root(this[i], first) : + this[i], + // Make sure that we do not leak memory by inadvertently discarding + // the original fragment (which might have attached data) instead of + // using it; in addition, use the original fragment object for the last + // item instead of first because it can end up being emptied incorrectly + // in certain situations (Bug #8070). + // Fragments from the fragment cache must always be cloned and never used + // in place. + results.cacheable || ( l > 1 && i < lastIndex ) ? + jQuery.clone( fragment, true, true ) : + fragment + ); + } + } + + if ( scripts.length ) { + jQuery.each( scripts, function( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + type: "GET", + global: false, + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + }); + } + } + + return this; + } +}); + +function root( elem, cur ) { + return jQuery.nodeName(elem, "table") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 fail to clone children inside object elements that use + // the proprietary classid attribute value (rather than the type + // attribute) to identify the type of content to display + if ( nodeName === "object" ) { + dest.outerHTML = src.outerHTML; + + } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + if ( src.checked ) { + dest.defaultChecked = dest.checked = src.checked; + } + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + + // IE blanks contents when cloning scripts + } else if ( nodeName === "script" && dest.text !== src.text ) { + dest.text = src.text; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); + + // Clear flags for bubbling special change/submit events, they must + // be reattached when the newly cloned events are first activated + dest.removeAttribute( "_submit_attached" ); + dest.removeAttribute( "_change_attached" ); +} + +jQuery.buildFragment = function( args, nodes, scripts ) { + var fragment, cacheable, cacheresults, doc, + first = args[ 0 ]; + + // nodes may contain either an explicit document object, + // a jQuery collection or context object. + // If nodes[0] contains a valid object to assign to doc + if ( nodes && nodes[0] ) { + doc = nodes[0].ownerDocument || nodes[0]; + } + + // Ensure that an attr object doesn't incorrectly stand in as a document object + // Chrome and Firefox seem to allow this to occur and will throw exception + // Fixes #8950 + if ( !doc.createDocumentFragment ) { + doc = document; + } + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501 + if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document && + first.charAt(0) === "<" && !rnocache.test( first ) && + (jQuery.support.checkClone || !rchecked.test( first )) && + (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) { + + cacheable = true; + + cacheresults = jQuery.fragments[ first ]; + if ( cacheresults && cacheresults !== 1 ) { + fragment = cacheresults; + } + } + + if ( !fragment ) { + fragment = doc.createDocumentFragment(); + jQuery.clean( args, doc, fragment, scripts ); + } + + if ( cacheable ) { + jQuery.fragments[ first ] = cacheresults ? fragment : 1; + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], + insert = jQuery( selector ), + parent = this.length === 1 && this[0].parentNode; + + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + return this; + + } else { + for ( var i = 0, l = insert.length; i < l; i++ ) { + var elems = ( i > 0 ? this.clone(true) : this ).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( typeof elem.getElementsByTagName !== "undefined" ) { + return elem.getElementsByTagName( "*" ); + + } else if ( typeof elem.querySelectorAll !== "undefined" ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( elem.type === "checkbox" || elem.type === "radio" ) { + elem.defaultChecked = elem.checked; + } +} +// Finds all inputs and passes them to fixDefaultChecked +function findInputs( elem ) { + var nodeName = ( elem.nodeName || "" ).toLowerCase(); + if ( nodeName === "input" ) { + fixDefaultChecked( elem ); + // Skip scripts, get other children + } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } +} + +// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js +function shimCloneNode( elem ) { + var div = document.createElement( "div" ); + safeFragment.appendChild( div ); + + div.innerHTML = elem.outerHTML; + return div.firstChild; +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var srcElements, + destElements, + i, + // IE<=8 does not properly clone detached, unknown element nodes + clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ? + elem.cloneNode( true ) : + shimCloneNode( elem ); + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + srcElements = destElements = null; + + // Return the cloned set + return clone; + }, + + clean: function( elems, context, fragment, scripts ) { + var checkScriptType, script, j, + ret = []; + + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) { + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + } + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1></$2>"); + + // Trim whitespace, otherwise indexOf won't work as expected + var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(), + wrap = wrapMap[ tag ] || wrapMap._default, + depth = wrap[0], + div = context.createElement("div"), + safeChildNodes = safeFragment.childNodes, + remove; + + // Append wrapper element to unknown element safe doc fragment + if ( context === document ) { + // Use the fragment we've already created for this document + safeFragment.appendChild( div ); + } else { + // Use a fragment created with the owner document + createSafeFragment( context ).appendChild( div ); + } + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + var hasBody = rtbody.test(elem), + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + + // Clear elements from DocumentFragment (safeFragment or otherwise) + // to avoid hoarding elements. Fixes #11356 + if ( div ) { + div.parentNode.removeChild( div ); + + // Guard against -1 index exceptions in FF3.6 + if ( safeChildNodes.length > 0 ) { + remove = safeChildNodes[ safeChildNodes.length - 1 ]; + + if ( remove && remove.parentNode ) { + remove.parentNode.removeChild( remove ); + } + } + } + } + } + + // Resets defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + var len; + if ( !jQuery.support.appendChecked ) { + if ( elem[0] && typeof (len = elem.length) === "number" ) { + for ( j = 0; j < len; j++ ) { + findInputs( elem[j] ); + } + } else { + findInputs( elem ); + } + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + ret = jQuery.merge( ret, elem ); + } + } + + if ( fragment ) { + checkScriptType = function( elem ) { + return !elem.type || rscriptType.test( elem.type ); + }; + for ( i = 0; ret[i]; i++ ) { + script = ret[i]; + if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) { + scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script ); + + } else { + if ( script.nodeType === 1 ) { + var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType ); + + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); + } + fragment.appendChild( script ); + } + } + } + + return ret; + }, + + cleanData: function( elems ) { + var data, id, + cache = jQuery.cache, + special = jQuery.event.special, + deleteExpando = jQuery.support.deleteExpando; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + continue; + } + + id = elem[ jQuery.expando ]; + + if ( id ) { + data = cache[ id ]; + + if ( data && data.events ) { + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + + // Null the DOM reference to avoid IE6/7/8 leak (#7054) + if ( data.handle ) { + data.handle.elem = null; + } + } + + if ( deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + delete cache[ id ]; + } + } + } +}); + + + + +var ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + // fixed for IE9, see #8346 + rupper = /([A-Z]|^ms)/g, + rnum = /^[\-+]?(?:\d*\.)?\d+$/i, + rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i, + rrelNum = /^([\-+])=([\-+.\de]+)/, + rmargin = /^margin/, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + + // order is important! + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + + curCSS, + + getComputedStyle, + currentStyle; + +jQuery.fn.css = function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); +}; + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + + } else { + return elem.style.opacity; + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, origName = jQuery.camelCase( name ), + style = elem.style, hooks = jQuery.cssHooks[ origName ]; + + name = jQuery.cssProps[ origName ] || origName; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra ) { + var ret, hooks; + + // Make sure that we're working with the right name + name = jQuery.camelCase( name ); + hooks = jQuery.cssHooks[ name ]; + name = jQuery.cssProps[ name ] || name; + + // cssFloat needs a special treatment + if ( name === "cssFloat" ) { + name = "float"; + } + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { + return ret; + + // Otherwise, if a way to get the computed value exists, use that + } else if ( curCSS ) { + return curCSS( elem, name ); + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}, + ret, name; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +// DEPRECATED in 1.3, Use jQuery.css() instead +jQuery.curCSS = jQuery.css; + +if ( document.defaultView && document.defaultView.getComputedStyle ) { + getComputedStyle = function( elem, name ) { + var ret, defaultView, computedStyle, width, + style = elem.style; + + name = name.replace( rupper, "-$1" ).toLowerCase(); + + if ( (defaultView = elem.ownerDocument.defaultView) && + (computedStyle = defaultView.getComputedStyle( elem, null )) ) { + + ret = computedStyle.getPropertyValue( name ); + if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { + ret = jQuery.style( elem, name ); + } + } + + // A tribute to the "awesome hack by Dean Edwards" + // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins + // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) { + width = style.width; + style.width = ret; + ret = computedStyle.width; + style.width = width; + } + + return ret; + }; +} + +if ( document.documentElement.currentStyle ) { + currentStyle = function( elem, name ) { + var left, rsLeft, uncomputed, + ret = elem.currentStyle && elem.currentStyle[ name ], + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && (uncomputed = style[ name ]) ) { + ret = uncomputed; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( rnumnonpx.test( ret ) ) { + + // Remember the original values + left = style.left; + rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +curCSS = getComputedStyle || currentStyle; + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property + var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + i = name === "width" ? 1 : 0, + len = 4; + + if ( val > 0 ) { + if ( extra !== "border" ) { + for ( ; i < len; i += 2 ) { + if ( !extra ) { + val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0; + } + if ( extra === "margin" ) { + val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0; + } else { + val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + } + } + + return val + "px"; + } + + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Add padding, border, margin + if ( extra ) { + for ( ; i < len; i += 2 ) { + val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0; + if ( extra !== "padding" ) { + val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + if ( extra === "margin" ) { + val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0; + } + } + } + + return val + "px"; +} + +jQuery.each([ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + if ( elem.offsetWidth !== 0 ) { + return getWidthOrHeight( elem, name, extra ); + } else { + return jQuery.swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + }); + } + } + }, + + set: function( elem, value ) { + return rnum.test( value ) ? + value + "px" : + value; + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( parseFloat( RegExp.$1 ) / 100 ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle, + opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 + if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) { + + // Setting style.filter to null, "" & " " still leave "filter:" in the cssText + // if "filter:" is present at all, clearType is disabled, we want to avoid this + // style.removeAttribute is IE Only, but so apparently is this code path... + style.removeAttribute( "filter" ); + + // if there there is no filter style applied in a css rule, we are done + if ( currentStyle && !currentStyle.filter ) { + return; + } + } + + // otherwise, set new filter values + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +jQuery(function() { + // This hook cannot be added until DOM ready because the support test + // for it is not run until after DOM ready + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + return jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + return curCSS( elem, "margin-right" ); + } else { + return elem.style.marginRight; + } + }); + } + }; + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + var width = elem.offsetWidth, + height = elem.offsetHeight; + + return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + +// These hooks are used by animate to expand properties +jQuery.each({ + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i, + + // assumes a single number if not a string + parts = typeof value === "string" ? value.split(" ") : [ value ], + expanded = {}; + + for ( i = 0; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; +}); + + + + +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, + rselectTextarea = /^(?:select|textarea)/i, + rspacesAjax = /\s+/, + rts = /([?&])_=[^&]*/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Document location + ajaxLocation, + + // Document location segments + ajaxLocParts, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = ["*/"] + ["*"]; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + if ( jQuery.isFunction( func ) ) { + var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), + i = 0, + length = dataTypes.length, + dataType, + list, + placeBefore; + + // For each dataType in the dataTypeExpression + for ( ; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ), + selection; + + for ( ; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } +} + +jQuery.fn.extend({ + load: function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + + // Don't do a request if no elements are being requested + } else if ( !this.length ) { + return this; + } + + var off = url.indexOf( " " ); + if ( off >= 0 ) { + var selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) { + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( typeof params === "object" ) { + params = jQuery.param( params, jQuery.ajaxSettings.traditional ); + type = "POST"; + } + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + dataType: "html", + data: params, + // Complete callback (responseText is used internally) + complete: function( jqXHR, status, responseText ) { + // Store the response as specified by the jqXHR object + responseText = jqXHR.responseText; + // If successful, inject the HTML into all the matched elements + if ( jqXHR.isResolved() ) { + // #4825: Get the actual response in case + // a dataFilter is present in ajaxSettings + jqXHR.done(function( r ) { + responseText = r; + }); + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div>") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(responseText.replace(rscript, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + responseText ); + } + + if ( callback ) { + self.each( callback, [ responseText, status, jqXHR ] ); + } + } + }); + + return this; + }, + + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.on( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +}); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + if ( settings ) { + // Building a settings object + ajaxExtend( target, jQuery.ajaxSettings ); + } else { + // Extending ajaxSettings + settings = target; + target = jQuery.ajaxSettings; + } + ajaxExtend( target, settings ); + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + traditional: false, + headers: {}, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": allTypes + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + context: true, + url: true + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // ifModified key + ifModifiedKey, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // The jqXHR state + state = 0, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || "abort"; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, nativeStatusText, responses, headers ) { + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + var isSuccess, + success, + error, + statusText = nativeStatusText, + response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, + lastModified, + etag; + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { + jQuery.lastModified[ ifModifiedKey ] = lastModified; + } + if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { + jQuery.etag[ ifModifiedKey ] = etag; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + try { + success = ajaxConvert( s, response ); + statusText = "success"; + isSuccess = true; + } catch(e) { + // We have a parsererror + statusText = "parsererror"; + error = e; + } + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if ( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = "" + ( nativeStatusText || statusText ); + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.add; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for ( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.then( tmp, tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); + + // Determine if a cross-domain request is in order + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( state === 2 ) { + return false; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already + jqXHR.abort(); + return false; + + } + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( state < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + throw e; + } + } + } + + return jqXHR; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a, traditional ) { + var s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : value; + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( var prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); + } +}); + +function buildParams( prefix, obj, traditional, add ) { + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + // Serialize object item. + for ( var name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} + +// This is still on the jQuery object... for now +// Want to move this to jQuery.ajax some day +jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields, + ct, + type, + finalDataType, + firstDataType; + + // Fill responseXXX fields + for ( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + var dataTypes = s.dataTypes, + converters = {}, + i, + key, + length = dataTypes.length, + tmp, + // Current and previous dataTypes + current = dataTypes[ 0 ], + prev, + // Conversion expression + conversion, + // Conversion function + conv, + // Conversion functions (transitive conversion) + conv1, + conv2; + + // For each dataType in the chain + for ( i = 1; i < length; i++ ) { + + // Create converters map + // with lowercased keys + if ( i === 1 ) { + for ( key in s.converters ) { + if ( typeof key === "string" ) { + converters[ key.toLowerCase() ] = s.converters[ key ]; + } + } + } + + // Get the dataTypes + prev = current; + current = dataTypes[ i ]; + + // If current is auto dataType, update it to prev + if ( current === "*" ) { + current = prev; + // If no auto and dataTypes are actually different + } else if ( prev !== "*" && prev !== current ) { + + // Get the converter + conversion = prev + " " + current; + conv = converters[ conversion ] || converters[ "* " + current ]; + + // If there is no direct converter, search transitively + if ( !conv ) { + conv2 = undefined; + for ( conv1 in converters ) { + tmp = conv1.split( " " ); + if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { + conv2 = converters[ tmp[1] + " " + current ]; + if ( conv2 ) { + conv1 = converters[ conv1 ]; + if ( conv1 === true ) { + conv = conv2; + } else if ( conv2 === true ) { + conv = conv1; + } + break; + } + } + } + } + // If we found no converter, dispatch an error + if ( !( conv || conv2 ) ) { + jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); + } + // If found converter is not an equivalence + if ( conv !== true ) { + // Convert with 1 or 2 converters accordingly + response = conv ? conv( response ) : conv2( conv1(response) ); + } + } + } + return response; +} + + + + +var jsc = jQuery.now(), + jsre = /(\=)\?(&|$)|\?\?/i; + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + return jQuery.expando + "_" + ( jsc++ ); + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType ); + + if ( s.dataTypes[ 0 ] === "jsonp" || + s.jsonp !== false && ( jsre.test( s.url ) || + inspectData && jsre.test( s.data ) ) ) { + + var responseContainer, + jsonpCallback = s.jsonpCallback = + jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, + previous = window[ jsonpCallback ], + url = s.url, + data = s.data, + replace = "$1" + jsonpCallback + "$2"; + + if ( s.jsonp !== false ) { + url = url.replace( jsre, replace ); + if ( s.url === url ) { + if ( inspectData ) { + data = data.replace( jsre, replace ); + } + if ( s.data === data ) { + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; + } + } + } + + s.url = url; + s.data = data; + + // Install callback + window[ jsonpCallback ] = function( response ) { + responseContainer = [ response ]; + }; + + // Clean-up function + jqXHR.always(function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }); + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( jsonpCallback + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Delegate to script + return "script"; + } +}); + + + + +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); + + + + +var // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0, + xhrCallbacks; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var xhr = s.xhr(), + handle, + i; + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + + // When requesting binary data, IE6-9 will throw an exception + // on any attempt to access responseText (#11426) + try { + responses.text = xhr.responseText; + } catch( _ ) { + } + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + // if we're in sync mode or it's in cache + // and has been retrieved directly (IE6 & IE7) + // we need to manually fire the callback + if ( !s.async || xhr.readyState === 4 ) { + callback(); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} + + + + +var elemdisplay = {}, + iframe, iframeDoc, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, + timerId, + fxAttrs = [ + // height animations + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], + // width animations + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], + // opacity animations + [ "opacity" ] + ], + fxNow; + +jQuery.fn.extend({ + show: function( speed, easing, callback ) { + var elem, display; + + if ( speed || speed === 0 ) { + return this.animate( genFx("show", 3), speed, easing, callback ); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + elem = this[ i ]; + + if ( elem.style ) { + display = elem.style.display; + + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { + display = elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( (display === "" && jQuery.css(elem, "display") === "none") || + !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { + jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) ); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + elem = this[ i ]; + + if ( elem.style ) { + display = elem.style.display; + + if ( display === "" || display === "none" ) { + elem.style.display = jQuery._data( elem, "olddisplay" ) || ""; + } + } + } + + return this; + } + }, + + hide: function( speed, easing, callback ) { + if ( speed || speed === 0 ) { + return this.animate( genFx("hide", 3), speed, easing, callback); + + } else { + var elem, display, + i = 0, + j = this.length; + + for ( ; i < j; i++ ) { + elem = this[i]; + if ( elem.style ) { + display = jQuery.css( elem, "display" ); + + if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) { + jQuery._data( elem, "olddisplay", display ); + } + } + } + + // Set the display of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + if ( this[i].style ) { + this[i].style.display = "none"; + } + } + + return this; + } + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + + toggle: function( fn, fn2, callback ) { + var bool = typeof fn === "boolean"; + + if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { + this._toggle.apply( this, arguments ); + + } else if ( fn == null || bool ) { + this.each(function() { + var state = bool ? fn : jQuery(this).is(":hidden"); + jQuery(this)[ state ? "show" : "hide" ](); + }); + + } else { + this.animate(genFx("toggle", 3), fn, fn2, callback); + } + + return this; + }, + + fadeTo: function( speed, to, easing, callback ) { + return this.filter(":hidden").css("opacity", 0).show().end() + .animate({opacity: to}, speed, easing, callback); + }, + + animate: function( prop, speed, easing, callback ) { + var optall = jQuery.speed( speed, easing, callback ); + + if ( jQuery.isEmptyObject( prop ) ) { + return this.each( optall.complete, [ false ] ); + } + + // Do not change referenced properties as per-property easing will be lost + prop = jQuery.extend( {}, prop ); + + function doAnimation() { + // XXX 'this' does not always have a nodeName when running the + // test suite + + if ( optall.queue === false ) { + jQuery._mark( this ); + } + + var opt = jQuery.extend( {}, optall ), + isElement = this.nodeType === 1, + hidden = isElement && jQuery(this).is(":hidden"), + name, val, p, e, hooks, replace, + parts, start, end, unit, + method; + + // will store per property easing and be used to determine when an animation is complete + opt.animatedProperties = {}; + + // first pass over propertys to expand / normalize + for ( p in prop ) { + name = jQuery.camelCase( p ); + if ( p !== name ) { + prop[ name ] = prop[ p ]; + delete prop[ p ]; + } + + if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) { + replace = hooks.expand( prop[ name ] ); + delete prop[ name ]; + + // not quite $.extend, this wont overwrite keys already present. + // also - reusing 'p' from above because we have the correct "name" + for ( p in replace ) { + if ( ! ( p in prop ) ) { + prop[ p ] = replace[ p ]; + } + } + } + } + + for ( name in prop ) { + val = prop[ name ]; + // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) + if ( jQuery.isArray( val ) ) { + opt.animatedProperties[ name ] = val[ 1 ]; + val = prop[ name ] = val[ 0 ]; + } else { + opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing'; + } + + if ( val === "hide" && hidden || val === "show" && !hidden ) { + return opt.complete.call( this ); + } + + if ( isElement && ( name === "height" || name === "width" ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height animated + if ( jQuery.css( this, "display" ) === "inline" && + jQuery.css( this, "float" ) === "none" ) { + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) { + this.style.display = "inline-block"; + + } else { + this.style.zoom = 1; + } + } + } + } + + if ( opt.overflow != null ) { + this.style.overflow = "hidden"; + } + + for ( p in prop ) { + e = new jQuery.fx( this, opt, p ); + val = prop[ p ]; + + if ( rfxtypes.test( val ) ) { + + // Tracks whether to show or hide based on private + // data attached to the element + method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 ); + if ( method ) { + jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" ); + e[ method ](); + } else { + e[ val ](); + } + + } else { + parts = rfxnum.exec( val ); + start = e.cur(); + + if ( parts ) { + end = parseFloat( parts[2] ); + unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" ) { + jQuery.style( this, p, (end || 1) + unit); + start = ( (end || 1) / e.cur() ) * start; + jQuery.style( this, p, start + unit); + } + + // If a +=/-= token was provided, we're doing a relative animation + if ( parts[1] ) { + end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start; + } + + e.custom( start, end, unit ); + + } else { + e.custom( start, val, "" ); + } + } + } + + // For JS strict compliance + return true; + } + + return optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + + stop: function( type, clearQueue, gotoEnd ) { + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each(function() { + var index, + hadTimers = false, + timers = jQuery.timers, + data = jQuery._data( this ); + + // clear marker counters if we know they won't be + if ( !gotoEnd ) { + jQuery._unmark( true, this ); + } + + function stopQueue( elem, data, index ) { + var hooks = data[ index ]; + jQuery.removeData( elem, index, true ); + hooks.stop( gotoEnd ); + } + + if ( type == null ) { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) { + stopQueue( this, data, index ); + } + } + } else if ( data[ index = type + ".run" ] && data[ index ].stop ){ + stopQueue( this, data, index ); + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { + if ( gotoEnd ) { + + // force the next step to be the last + timers[ index ]( true ); + } else { + timers[ index ].saveState(); + } + hadTimers = true; + timers.splice( index, 1 ); + } + } + + // start the next in the queue if the last step wasn't forced + // timers currently will call their complete callbacks, which will dequeue + // but only if they were gotoEnd + if ( !( gotoEnd && hadTimers ) ) { + jQuery.dequeue( this, type ); + } + }); + } + +}); + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout( clearFxNow, 0 ); + return ( fxNow = jQuery.now() ); +} + +function clearFxNow() { + fxNow = undefined; +} + +// Generate parameters to create a standard animation +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() { + obj[ this ] = type; + }); + + return obj; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx( "show", 1 ), + slideUp: genFx( "hide", 1 ), + slideToggle: genFx( "toggle", 1 ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.extend({ + speed: function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; + + // normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function( noUnmark ) { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } else if ( noUnmark !== false ) { + jQuery._unmark( this ); + } + }; + + return opt; + }, + + easing: { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5; + } + }, + + timers: [], + + fx: function( elem, options, prop ) { + this.options = options; + this.elem = elem; + this.prop = prop; + + options.orig = options.orig || {}; + } + +}); + +jQuery.fx.prototype = { + // Simple function for setting a style value + update: function() { + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this ); + }, + + // Get the current size + cur: function() { + if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) { + return this.elem[ this.prop ]; + } + + var parsed, + r = jQuery.css( this.elem, this.prop ); + // Empty strings, null, undefined and "auto" are converted to 0, + // complex values such as "rotate(1rad)" are returned as is, + // simple values such as "10px" are parsed to Float. + return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; + }, + + // Start an animation from one number to another + custom: function( from, to, unit ) { + var self = this, + fx = jQuery.fx; + + this.startTime = fxNow || createFxNow(); + this.end = to; + this.now = this.start = from; + this.pos = this.state = 0; + this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); + + function t( gotoEnd ) { + return self.step( gotoEnd ); + } + + t.queue = this.options.queue; + t.elem = this.elem; + t.saveState = function() { + if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) { + if ( self.options.hide ) { + jQuery._data( self.elem, "fxshow" + self.prop, self.start ); + } else if ( self.options.show ) { + jQuery._data( self.elem, "fxshow" + self.prop, self.end ); + } + } + }; + + if ( t() && jQuery.timers.push(t) && !timerId ) { + timerId = setInterval( fx.tick, fx.interval ); + } + }, + + // Simple 'show' function + show: function() { + var dataShow = jQuery._data( this.elem, "fxshow" + this.prop ); + + // Remember where we started, so that we can go back to it later + this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop ); + this.options.show = true; + + // Begin the animation + // Make sure that we start at a small width/height to avoid any flash of content + if ( dataShow !== undefined ) { + // This show is picking up where a previous hide or show left off + this.custom( this.cur(), dataShow ); + } else { + this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() ); + } + + // Start by showing the element + jQuery( this.elem ).show(); + }, + + // Simple 'hide' function + hide: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop ); + this.options.hide = true; + + // Begin the animation + this.custom( this.cur(), 0 ); + }, + + // Each step of an animation + step: function( gotoEnd ) { + var p, n, complete, + t = fxNow || createFxNow(), + done = true, + elem = this.elem, + options = this.options; + + if ( gotoEnd || t >= options.duration + this.startTime ) { + this.now = this.end; + this.pos = this.state = 1; + this.update(); + + options.animatedProperties[ this.prop ] = true; + + for ( p in options.animatedProperties ) { + if ( options.animatedProperties[ p ] !== true ) { + done = false; + } + } + + if ( done ) { + // Reset the overflow + if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { + + jQuery.each( [ "", "X", "Y" ], function( index, value ) { + elem.style[ "overflow" + value ] = options.overflow[ index ]; + }); + } + + // Hide the element if the "hide" operation was done + if ( options.hide ) { + jQuery( elem ).hide(); + } + + // Reset the properties, if the item has been hidden or shown + if ( options.hide || options.show ) { + for ( p in options.animatedProperties ) { + jQuery.style( elem, p, options.orig[ p ] ); + jQuery.removeData( elem, "fxshow" + p, true ); + // Toggle data is no longer needed + jQuery.removeData( elem, "toggle" + p, true ); + } + } + + // Execute the complete function + // in the event that the complete function throws an exception + // we must ensure it won't be called twice. #5684 + + complete = options.complete; + if ( complete ) { + + options.complete = false; + complete.call( elem ); + } + } + + return false; + + } else { + // classical easing cannot be used with an Infinity duration + if ( options.duration == Infinity ) { + this.now = t; + } else { + n = t - this.startTime; + this.state = n / options.duration; + + // Perform the easing function, defaults to swing + this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration ); + this.now = this.start + ( (this.end - this.start) * this.pos ); + } + // Perform the next step of the animation + this.update(); + } + + return true; + } +}; + +jQuery.extend( jQuery.fx, { + tick: function() { + var timer, + timers = jQuery.timers, + i = 0; + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + // Checks the timer has not already been removed + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + }, + + interval: 13, + + stop: function() { + clearInterval( timerId ); + timerId = null; + }, + + speeds: { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }, + + step: { + opacity: function( fx ) { + jQuery.style( fx.elem, "opacity", fx.now ); + }, + + _default: function( fx ) { + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { + fx.elem.style[ fx.prop ] = fx.now + fx.unit; + } else { + fx.elem[ fx.prop ] = fx.now; + } + } + } +}); + +// Ensure props that can't be negative don't go there on undershoot easing +jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) { + // exclude marginTop, marginLeft, marginBottom and marginRight from this list + if ( prop.indexOf( "margin" ) ) { + jQuery.fx.step[ prop ] = function( fx ) { + jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit ); + }; + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} + +// Try to restore the default display value of an element +function defaultDisplay( nodeName ) { + + if ( !elemdisplay[ nodeName ] ) { + + var body = document.body, + elem = jQuery( "<" + nodeName + ">" ).appendTo( body ), + display = elem.css( "display" ); + elem.remove(); + + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe + if ( display === "none" || display === "" ) { + // No iframe to use yet, so create it + if ( !iframe ) { + iframe = document.createElement( "iframe" ); + iframe.frameBorder = iframe.width = iframe.height = 0; + } + + body.appendChild( iframe ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML + // document to it; WebKit & Firefox won't allow reusing the iframe document. + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" ); + iframeDoc.close(); + } + + elem = iframeDoc.createElement( nodeName ); + + iframeDoc.body.appendChild( elem ); + + display = jQuery.css( elem, "display" ); + body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + } + + return elemdisplay[ nodeName ]; +} + + + + +var getOffset, + rtable = /^t(?:able|d|h)$/i, + rroot = /^(?:body|html)$/i; + +if ( "getBoundingClientRect" in document.documentElement ) { + getOffset = function( elem, doc, docElem, box ) { + try { + box = elem.getBoundingClientRect(); + } catch(e) {} + + // Make sure we're not dealing with a disconnected DOM node + if ( !box || !jQuery.contains( docElem, elem ) ) { + return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; + } + + var body = doc.body, + win = getWindow( doc ), + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, + scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: top, left: left }; + }; + +} else { + getOffset = function( elem, doc, docElem ) { + var computedStyle, + offsetParent = elem.offsetParent, + prevOffsetParent = elem, + body = doc.body, + defaultView = doc.defaultView, + prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, + top = elem.offsetTop, + left = elem.offsetLeft; + + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { + if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { + break; + } + + computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; + top -= elem.scrollTop; + left -= elem.scrollLeft; + + if ( elem === offsetParent ) { + top += elem.offsetTop; + left += elem.offsetLeft; + + if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevOffsetParent = offsetParent; + offsetParent = elem.offsetParent; + } + + if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevComputedStyle = computedStyle; + } + + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { + top += body.offsetTop; + left += body.offsetLeft; + } + + if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { + top += Math.max( docElem.scrollTop, body.scrollTop ); + left += Math.max( docElem.scrollLeft, body.scrollLeft ); + } + + return { top: top, left: left }; + }; +} + +jQuery.fn.offset = function( options ) { + if ( arguments.length ) { + return options === undefined ? + this : + this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + var elem = this[0], + doc = elem && elem.ownerDocument; + + if ( !doc ) { + return null; + } + + if ( elem === doc.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + return getOffset( elem, doc, doc.documentElement ); +}; + +jQuery.offset = { + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + + position: function() { + if ( !this[0] ) { + return null; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) { + var top = /Y/.test( prop ); + + jQuery.fn[ method ] = function( val ) { + return jQuery.access( this, function( elem, method, val ) { + var win = getWindow( elem ); + + if ( val === undefined ) { + return win ? (prop in win) ? win[ prop ] : + jQuery.support.boxModel && win.document.documentElement[ method ] || + win.document.body[ method ] : + elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : jQuery( win ).scrollLeft(), + top ? val : jQuery( win ).scrollTop() + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length, null ); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} + + + + +// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + var clientProp = "client" + name, + scrollProp = "scroll" + name, + offsetProp = "offset" + name; + + // innerHeight and innerWidth + jQuery.fn[ "inner" + name ] = function() { + var elem = this[0]; + return elem ? + elem.style ? + parseFloat( jQuery.css( elem, type, "padding" ) ) : + this[ type ]() : + null; + }; + + // outerHeight and outerWidth + jQuery.fn[ "outer" + name ] = function( margin ) { + var elem = this[0]; + return elem ? + elem.style ? + parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) : + this[ type ]() : + null; + }; + + jQuery.fn[ type ] = function( value ) { + return jQuery.access( this, function( elem, type, value ) { + var doc, docElemProp, orig, ret; + + if ( jQuery.isWindow( elem ) ) { + // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat + doc = elem.document; + docElemProp = doc.documentElement[ clientProp ]; + return jQuery.support.boxModel && docElemProp || + doc.body && doc.body[ clientProp ] || docElemProp; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater + doc = elem.documentElement; + + // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height] + // so we can't use max, as it'll choose the incorrect offset[Width/Height] + // instead we use the correct client[Width/Height] + // support:IE6 + if ( doc[ clientProp ] >= doc[ scrollProp ] ) { + return doc[ clientProp ]; + } + + return Math.max( + elem.body[ scrollProp ], doc[ scrollProp ], + elem.body[ offsetProp ], doc[ offsetProp ] + ); + } + + // Get width or height on the element + if ( value === undefined ) { + orig = jQuery.css( elem, type ); + ret = parseFloat( orig ); + return jQuery.isNumeric( ret ) ? ret : orig; + } + + // Set the width or height on the element + jQuery( elem ).css( type, value ); + }, type, value, arguments.length, null ); + }; +}); + + + + +// Expose jQuery to the global object +window.jQuery = window.$ = jQuery; + +// Expose jQuery as an AMD module, but only for AMD loaders that +// understand the issues with loading multiple versions of jQuery +// in a page that all might call define(). The loader will indicate +// they have special allowances for multiple jQuery versions by +// specifying define.amd.jQuery = true. Register as a named module, +// since jQuery can be concatenated with other files that may use define, +// but not use a proper concatenation script that understands anonymous +// AMD modules. A named AMD is safest and most robust way to register. +// Lowercase jquery is used because AMD module names are derived from +// file names, and jQuery is normally delivered in a lowercase file name. +// Do this after creating the global so that if an AMD module wants to call +// noConflict to hide this version of jQuery, it will work. +if ( typeof define === "function" && define.amd && define.amd.jQuery ) { + define( "jquery", [], function () { return jQuery; } ); +} + + + +})( window ); 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/CMakeLists.txt b/qtools/CMakeLists.txt index 17f8eb4..cc64de1 100644 --- a/qtools/CMakeLists.txt +++ b/qtools/CMakeLists.txt @@ -22,6 +22,7 @@ qstring.cpp qtextstream.cpp qtextcodec.cpp qstringlist.cpp +qcstringlist.cpp qxml.cpp qmap.cpp qthread.cpp 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/qcstringlist.cpp b/qtools/qcstringlist.cpp new file mode 100644 index 0000000..5725971 --- /dev/null +++ b/qtools/qcstringlist.cpp @@ -0,0 +1,192 @@ +/**************************************************************************** +** +** 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. +** +** Implementation of QCStringList +** +**********************************************************************/ + +#include "qcstringlist.h" + +#include "qstrlist.h" +#include "qdatastream.h" +#include "qtl.h" + +/*! + Splits the string \a str using \a sep as separator. Returns the + list of strings. If \a allowEmptyEntries is TRUE, also empty + entries are inserted into the list, else not. So if you have + a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e' + would be returned if \a allowEmptyEntries is FALSE, but + a list containing 'abc', '', 'd', 'e' and '' would be returned if + \a allowEmptyEntries is TRUE. + If \a str doesn't contain \a sep, a stringlist + with one item, which is the same as \a str, is returned. + + \sa join() +*/ + +QCStringList QCStringList::split( char sep, const QCString &str, bool allowEmptyEntries ) +{ + char cs[2] = { sep, '\0' }; + return split( cs, str, allowEmptyEntries ); +} + +/*! + Splits the string \a str using \a sep as separator. Returns the + list of strings. If \a allowEmptyEntries is TRUE, also empty + entries are inserted into the list, else not. So if you have + a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e' + would be returned if \a allowEmptyEntries is FALSE, but + a list containing 'abc', '', 'd', 'e' and '' would be returned if + \a allowEmptyEntries is TRUE. + If \a str doesn't contain \a sep, a stringlist + with one item, which is the same as \a str, is returned. + + \sa join() +*/ + +QCStringList QCStringList::split( const QCString &sep, const QCString &str, bool allowEmptyEntries ) +{ + QCStringList lst; + + int j = 0; + int i = str.find( sep, j ); + + while ( i != -1 ) { + if ( str.mid( j, i - j ).length() > 0 ) + lst << str.mid( j, i - j ); + else if ( allowEmptyEntries ) + lst << QCString(); + j = i + sep.length(); + i = str.find( sep, j ); + } + + int l = str.length() - 1; + if ( str.mid( j, l - j + 1 ).length() > 0 ) + lst << str.mid( j, l - j + 1 ); + else if ( allowEmptyEntries ) + lst << QCString(); + + return lst; +} + +/*! + Splits the string \a str using the regular expression \a sep as separator. Returns the + list of strings. If \a allowEmptyEntries is TRUE, also empty + entries are inserted into the list, else not. So if you have + a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e' + would be returned if \a allowEmptyEntries is FALSE, but + a list containing 'abc', '', 'd', 'e' and '' would be returned if + \a allowEmptyEntries is TRUE. + If \a str doesn't contain \a sep, a stringlist + with one item, which is the same as \a str, is returned. + + \sa join() +*/ + +QCStringList QCStringList::split( const QRegExp &sep, const QCString &str, bool allowEmptyEntries ) +{ + QCStringList lst; + + int j = 0; + int len = 0; + int i = sep.match( str.data(), j, &len ); + + while ( i != -1 ) { + if ( str.mid( j, i - j ).length() > 0 ) + lst << str.mid( j, i - j ); + else if ( allowEmptyEntries ) + lst << QCString(); + j = i + len; + i = sep.match( str.data(), j, &len ); + } + + int l = str.length() - 1; + if ( str.mid( j, l - j + 1 ).length() > 0 ) + lst << str.mid( j, l - j + 1 ); + else if ( allowEmptyEntries ) + lst << QCString(); + + return lst; +} + +/*! + Returns a list of all strings containing the substring \a str. + + If \a cs is TRUE, the grep is done case sensitively, else not. +*/ + +QCStringList QCStringList::grep( const QCString &str, bool cs ) const +{ + QCStringList res; + for ( QCStringList::ConstIterator it = begin(); it != end(); ++it ) + if ( (*it).contains( str, cs ) ) + res << *it; + + return res; +} + +/*! + Returns a list of all strings containing a substring that matches + the regular expression \a expr. +*/ + +QCStringList QCStringList::grep( const QRegExp &expr ) const +{ + QCStringList res; + for ( QCStringList::ConstIterator it = begin(); it != end(); ++it ) + if ( (*it).contains( expr ) ) + res << *it; + + return res; +} + +/*! + Joins the stringlist into a single string with each element + separated by \a sep. + + \sa split() +*/ +QCString QCStringList::join( const QCString &sep ) const +{ + QCString res; + bool alredy = FALSE; + for ( QCStringList::ConstIterator it = begin(); it != end(); ++it ) { + if ( alredy ) + res += sep; + alredy = TRUE; + res += *it; + } + + return res; +} + +Q_EXPORT QDataStream &operator>>( QDataStream & s, QCStringList& l ) +{ + return s >> (QValueList<QCString>&)l; +} + +Q_EXPORT QDataStream &operator<<( QDataStream & s, const QCStringList& l ) +{ + return s << (const QValueList<QCString>&)l; +} + +/*! + Converts from a QStrList (ASCII) to a QCStringList (Unicode). +*/ +QCStringList QCStringList::fromStrList(const QStrList& ascii) +{ + QCStringList res; + const char * s; + for ( QStrListIterator it(ascii); (s=it.current()); ++it ) + res << s; + return res; +} + diff --git a/qtools/qcstringlist.h b/qtools/qcstringlist.h new file mode 100644 index 0000000..604a196 --- /dev/null +++ b/qtools/qcstringlist.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** 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. +** +** Note: this is a variant of the qstringlist.h but for QCString's +** +**********************************************************************/ +#ifndef QCSTRINGLIST_H +#define QCSTRINGLIST_H + +#include "qvaluelist.h" +#include "qcstring.h" +#include "qregexp.h" + +class QStrList; +class QDataStream; + +class QCStringList : public QValueList<QCString> +{ +public: + QCStringList() { } + QCStringList( const QCStringList& l ) : QValueList<QCString>(l) { } + QCStringList( const QValueList<QCString>& l ) : QValueList<QCString>(l) { } + QCStringList( const QCString& i ) { append(i); } + QCStringList( const char* i ) { append(i); } + + static QCStringList fromStrList(const QStrList&); + + static QCStringList split( const QCString &sep, const QCString &str, bool allowEmptyEntries = FALSE ); + static QCStringList split( char sep, const QCString &str, bool allowEmptyEntries = FALSE ); + static QCStringList split( const QRegExp &sep, const QCString &str, bool allowEmptyEntries = FALSE ); + QCString join( const QCString &sep ) const; + + QCStringList grep( const QCString &str, bool cs = TRUE ) const; + QCStringList grep( const QRegExp &expr ) const; +}; + +extern Q_EXPORT QDataStream &operator>>( QDataStream &, QCStringList& ); +extern Q_EXPORT QDataStream &operator<<( QDataStream &, const QCStringList& ); + +#endif // QCSTRINGLIST_H 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/qdict.doc b/qtools/qdict.doc index d2e26c0..a414d3f 100644 --- a/qtools/qdict.doc +++ b/qtools/qdict.doc @@ -171,7 +171,7 @@ Setting \e size to a suitably large \link primes.html prime number\endlink (equal to or greater than the expected number of entries) - makes the hash distribution better and hence the loopup faster. + makes the hash distribution better and hence the lookup faster. Setting \e caseSensitive to TRUE will treat "abc" and "Abc" as different keys. Setting it to FALSE will make the dictionary ignore case. diff --git a/qtools/qdir.cpp b/qtools/qdir.cpp index 120abe7..782a9c6 100644 --- a/qtools/qdir.cpp +++ b/qtools/qdir.cpp @@ -705,7 +705,7 @@ QStrList QDir::encodedEntryList( const QString &nameFilter, indicated by the setSorting(), setFilter() and setNameFilter() specifications. - The the filter and sorting specifications can be overridden using the + The filter and sorting specifications can be overridden using the \e filterSpec and \e sortSpec arguments. Returns an empty list if the directory is unreadable or does not exist. @@ -727,7 +727,7 @@ QStringList QDir::entryList( int filterSpec, int sortSpec ) const indicated by the setSorting(), setFilter() and setNameFilter() specifications. - The the filter and sorting specifications can be overridden using the + The filter and sorting specifications can be overridden using the \e nameFilter, \e filterSpec and \e sortSpec arguments. Returns and empty list if the directory is unreadable or does not exist. @@ -755,7 +755,7 @@ QStringList QDir::entryList( const QString &nameFilter, the directory pointed to using the setSorting(), setFilter() and setNameFilter() specifications. - The the filter and sorting specifications can be overridden using the + The filter and sorting specifications can be overridden using the \e filterSpec and \e sortSpec arguments. Returns 0 if the directory is unreadable or does not exist. @@ -782,7 +782,7 @@ const QFileInfoList *QDir::entryInfoList( int filterSpec, int sortSpec ) const the directory pointed to using the setSorting(), setFilter() and setNameFilter() specifications. - The the filter and sorting specifications can be overridden using the + The filter and sorting specifications can be overridden using the \e nameFilter, \e filterSpec and \e sortSpec arguments. Returns 0 if the directory is unreadable or does not exist. 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 4fe1a26..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 ) { @@ -1101,7 +1101,7 @@ QDataStream& QGDict::write( QDataStream &s ) const QGDictIterator::QGDictIterator( const QGDict &d ) { dict = (QGDict *)&d; // get reference to dict - toFirst(); // set to first noe + toFirst(); // set to first node if ( !dict->iterators ) { dict->iterators = new QGDItList; // create iterator list CHECK_PTR( dict->iterators ); @@ -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 f464a73..8197db5 100644 --- a/qtools/qglist.cpp +++ b/qtools/qglist.cpp @@ -235,7 +235,7 @@ QGList& QGList::operator=( const QGList &list ) } /*! - Compares this list with \a list. Retruns TRUE if the lists + Compares this list with \a list. Returns TRUE if the lists contain the same data, else FALSE. */ @@ -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 88409ce..2d08ede 100644 --- a/qtools/qgvector.cpp +++ b/qtools/qgvector.cpp @@ -68,7 +68,7 @@ the QVector collection class. QGVector has some virtual functions that may be reimplemented in - subclasses to to customize behavior. + subclasses to customize behavior. <ul> <li> compareItems() compares two collection/vector items. @@ -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/qintdict.doc b/qtools/qintdict.doc index e027fb2..90625da 100644 --- a/qtools/qintdict.doc +++ b/qtools/qintdict.doc @@ -166,7 +166,7 @@ Setting \e size to a suitably large \link primes.html prime number\endlink (equal to or greater than the expected number of entries) makes the hash - distribution better and hence the loopup faster. + distribution better and hence the lookup faster. */ /*! diff --git a/qtools/qlist.doc b/qtools/qlist.doc index 6b4278c..59cc971 100644 --- a/qtools/qlist.doc +++ b/qtools/qlist.doc @@ -168,7 +168,7 @@ /*! \fn bool QList::operator==(const QList<type> &list ) const - Compares this list with \a list. Retruns TRUE if the lists + Compares this list with \a list. Returns TRUE if the lists contain the same data, else FALSE. */ diff --git a/qtools/qlist.h b/qtools/qlist.h index e9b908d..eaaa674 100644 --- a/qtools/qlist.h +++ b/qtools/qlist.h @@ -97,6 +97,7 @@ public: // ownership void setAutoDelete( bool enable ) { QGList::setAutoDelete(enable); } + bool autoDelete() const { return QGList::autoDelete(); } private: // new to be reimplemented methods diff --git a/qtools/qptrdict.doc b/qtools/qptrdict.doc index bff6a15..633536c 100644 --- a/qtools/qptrdict.doc +++ b/qtools/qptrdict.doc @@ -172,7 +172,7 @@ Setting \e size to a suitably large \link primes.html prime number\endlink (equal to or greater than the expected number of entries) makes the hash - distribution better and hence the loopup faster. + distribution better and hence the lookup faster. */ /*! diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp index e04a852..0e2b14a 100644 --- a/qtools/qstring.cpp +++ b/qtools/qstring.cpp @@ -10768,7 +10768,7 @@ otherwise. These functions are: isNull() (returns TRUE if the character is U+0000), isPrint() (TRUE if the character is any sort of printable -character, including whitespace), isPunct() (any sort of punctation), +character, including whitespace), isPunct() (any sort of punctuation), isMark() (Unicode Marks), isLetter (letters), isNumber() (any sort of numeric characters), isLetterOrNumber(), and isDigit() (decimal digits). All of these are wrappers around category(), which returns the @@ -11614,32 +11614,83 @@ static inline bool is_neutral(unsigned short dir) { #endif /*! - This function returns the basic directionality of the string (QChar::DirR for - right to left and QChar::DirL for left to right). Useful to find the right - alignment. - */ -QChar::Direction QString::basicDirection() +This function returns the directionality of the string. + +\returns a value of DirLTR, DirRTL, DirMixed or DirNeutral that indicates +if the entire text represented by this text is unidirectional, +and which direction, or if it is mixed-directional or all characters are neutral. +*/ +QString::Direction QString::direction() const { #ifndef QT_NO_UNICODETABLES - // find base direction - unsigned int pos = 0; - while ((pos < length()) && - (at(pos) != RLE) && - (at(pos) != LRE) && - (at(pos) != RLO) && - (at(pos) != LRO) && - (at(pos).direction() > 1) && - (at(pos).direction() != QChar::DirAL)) // not R and not L - pos++; - - if ((at(pos).direction() == QChar::DirR) || - (at(pos).direction() == QChar::DirAL) || - (at(pos) == RLE) || - (at(pos) == RLO)) - return QChar::DirR; + // find direction + unsigned char resultDir = DirNeutral; + for (unsigned int pos = 0; pos < length(); pos++) + { + if ((at(pos) != RLE) && + (at(pos) != LRE) && + (at(pos) != RLO) && + (at(pos) != LRO) && + (at(pos).direction() > 1) && + (at(pos).direction() != QChar::DirAL)) // not R and not L + continue; + + if ((at(pos).direction() == QChar::DirR) || + (at(pos).direction() == QChar::DirAL) || + (at(pos) == RLE) || + (at(pos) == RLO)) + resultDir |= DirRTL; + else + resultDir |= DirLTR; + if (resultDir == DirMixed) + return DirMixed; + } + return static_cast<Direction>(resultDir); +#else + return DirLTR; #endif +} + +/*! +This function returns the basic directionality of the string. Useful to find the right +alignment. - return QChar::DirL; +The base direction is derived from the first character in the string +with bidirectional character type L, R, or AL. +If the first such character has type L, DirLTR is returned. +If the first such character has type R or AL, DirRTL is returned. +If the string does not contain any character of these types, then DirNeutral is returned. +This is a lightweight function for use when only the base direction is needed and +no further bidi processing of the text is needed. + +\returns DirRTL, DirLTR or DirNeutral +*/ +QString::Direction QString::basicDirection() const +{ +#ifndef QT_NO_UNICODETABLES + // find base direction + unsigned int pos = 0; + while ((pos < length()) && + (at(pos) != RLE) && + (at(pos) != LRE) && + (at(pos) != RLO) && + (at(pos) != LRO) && + (at(pos).direction() > 1) && + (at(pos).direction() != QChar::DirAL)) // not R and not L + pos++; + + if (pos == length()) + return DirNeutral; + + if ((at(pos).direction() == QChar::DirR) || + (at(pos).direction() == QChar::DirAL) || + (at(pos) == RLE) || + (at(pos) == RLO)) + return DirRTL; + return DirLTR; +#else + return DirLTR; +#endif } #ifndef QT_NO_UNICODETABLES @@ -12905,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 ) { @@ -13274,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; @@ -13378,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(); @@ -13407,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(); @@ -13442,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/qstring.h b/qtools/qstring.h index df3873d..d459132 100644 --- a/qtools/qstring.h +++ b/qtools/qstring.h @@ -369,6 +369,38 @@ public: QString &operator=( QChar c ); QString &operator=( char c ); + enum Direction + { + /// No strongly directional text. + /*! + * As return value for direction() or baseDirection(), it means that the source string + * is missing or empty, or contains neither left-to-right nor right-to-left characters. + */ + DirNeutral = 0x0, + /// Left-to-right text. + /*! + * - As return value for direction(), it means that the source string + * contains no right-to-left characters. + * - As return value for basicDirection(), it means that the first strong character + * of the source string has a left-to-right direction. + */ + DirLTR = 0x1, + /// Right-to-left text. + /*! + * - As return value for direction(), it means that the source string + * contains no left-to-right characters. + * - As return value for basicDirection(), it means that the first strong character + * of the source string has a right-to-left direction. + */ + DirRTL = 0x2, + /// Mixed-directional text + /*! + * As return value for direction(), it means that the source string + * contains both left-to-right and right-to-left characters. + */ + DirMixed = 0x3 + }; + //QT_STATIC_CONST QString null; //bool isNull() const; @@ -535,8 +567,9 @@ public: #endif // new functions for BiDi void compose(); - QChar::Direction basicDirection(); - QString visual(int index = 0, int len = -1); + QString::Direction direction() const; + QString::Direction basicDirection() const; + QString visual(int index = 0, int len = -1); #ifndef QT_NO_COMPAT const char* data() const { return latin1(); } 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/qtools/qtl.doc b/qtools/qtl.doc index db5b994..e83b177 100644 --- a/qtools/qtl.doc +++ b/qtools/qtl.doc @@ -111,7 +111,7 @@ end() returns an iterator that points \e after the last element. end() marks an invalid position, it can never be dereferenced. It's the break condition in any iteration, may it be from begin() or fromLast(). For maximum speed, use increment or -decrement iterators with the prefix operator (++it, --it) instead of the the +decrement iterators with the prefix operator (++it, --it) instead of the postfix one (it++, it--), since the former is slightly faster. The same concept applies to the other container classes: diff --git a/qtools/qvaluelist.doc b/qtools/qvaluelist.doc index 918d08e..f7a0dde 100644 --- a/qtools/qvaluelist.doc +++ b/qtools/qvaluelist.doc @@ -199,7 +199,7 @@ \fn QValueList::~QValueList() Destroys the list. References to the values in the list and all iterators of this list become invalidated. Since QValueList is highly tuned for performance - you wont see warnings if you use invalid iterators, + you won't see warnings if you use invalid iterators, because it is impossible for an iterator to check whether it is valid or not. */ diff --git a/qtools/qxml.cpp b/qtools/qxml.cpp index 072997e..4138a28 100644 --- a/qtools/qxml.cpp +++ b/qtools/qxml.cpp @@ -1959,7 +1959,7 @@ bool QXmlSimpleReader::feature( const QString& name, bool *ok ) const <li> http://xml.org/sax/features/namespaces: if this feature is TRUE, namespace processing is performed <li> http://xml.org/sax/features/namespace-prefixes: - if this feature is TRUE, the the original prefixed names and attributes + if this feature is TRUE, the original prefixed names and attributes used for namespace declarations are reported <li> http://trolltech.com/xml/features/report-whitespace-only-CharData: if this feature is TRUE, CharData that consists only of whitespace (and diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5c55efa..4dc31fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -119,7 +119,7 @@ FLEX_TARGET(xmlcode xmlcode.l ${GENERATED_SRC}/xmlcode.cpp FLEX_TARGET(sqlcode sqlcode.l ${GENERATED_SRC}/sqlcode.cpp COMPILE_FLAGS "${LEX_FLAGS}") FLEX_TARGET(configimpl configimpl.l ${GENERATED_SRC}/configimpl.cpp COMPILE_FLAGS "${LEX_FLAGS}") -BISON_TARGET(constexp constexp.y ${GENERATED_SRC}/ce_parse.cpp COMPILE_FLAGS ${YACC_FLAGS}) +BISON_TARGET(constexp constexp.y ${GENERATED_SRC}/ce_parse.cpp COMPILE_FLAGS "${YACC_FLAGS}") add_library(doxycfg STATIC ${GENERATED_SRC}/lang_cfg.h @@ -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 f86350b..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,"–","--"),"—","---"); 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()); @@ -268,7 +270,7 @@ void CiteDict::generatePage() const { if (!bibFile.isEmpty()) { - // bug_700510, multile times the same name were overwriting; creating new names + // bug_700510, multiple times the same name were overwriting; creating new names // also for names with spaces ++i; copyFile(bibFile,latexOutputDir + bibTmpFile + QCString().setNum(i) + ".bib"); diff --git a/src/clangparser.cpp b/src/clangparser.cpp index 77151d6..c22d5c5 100644 --- a/src/clangparser.cpp +++ b/src/clangparser.cpp @@ -4,6 +4,7 @@ #if USE_LIBCLANG #include <clang-c/Index.h> +#include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/Tooling.h" #include <qfileinfo.h> #include <stdlib.h> @@ -161,7 +162,7 @@ void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit) static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING); static QStrList &includePath = Config_getList(INCLUDE_PATH); static QStrList clangOptions = Config_getList(CLANG_OPTIONS); - static QCString clangCompileDatabase = Config_getList(CLANG_COMPILATION_DATABASE_PATH); + static QCString clangCompileDatabase = Config_getString(CLANG_DATABASE_PATH); if (!clangAssistedParsing) return; //printf("ClangParser::start(%s)\n",fileName); p->fileName = fileName; @@ -177,91 +178,100 @@ void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit) clang::tooling::CompilationDatabase::loadFromDirectory(clangCompileDatabase.data(), error); int clang_option_len = 0; std::vector<clang::tooling::CompileCommand> command; - if (strcmp(clangCompileDatabase, "0") != 0) { - if (db == nullptr) { + if (qstrcmp(clangCompileDatabase, "0") != 0) + { + if (db == nullptr) + { // user specified a path, but DB file was not found err("%s using clang compilation database path of: \"%s\"\n", error.c_str(), clangCompileDatabase.data()); - } else { + } + else + { // check if the file we are parsing is in the DB command = db->getCompileCommands(fileName); - if (!command.empty() ) { + if (!command.empty() ) + { // it's possible to have multiple entries for the same file, so use the last entry clang_option_len = command[command.size()-1].CommandLine.size(); } } } char **argv = (char**)malloc(sizeof(char*)*(4+Doxygen::inputPaths.count()+includePath.count()+clangOptions.count()+clang_option_len)); - if (!command.empty() ) { + if (!command.empty() ) + { std::vector<std::string> options = command[command.size()-1].CommandLine; // copy each compiler option used from the database. Skip the first which is compiler exe. - for (auto option = options.begin()+1; option != options.end(); option++) { - argv[argc++] = strdup(option->c_str()); + for (auto option = options.begin()+1; option != options.end(); option++) + { + argv[argc++] = qstrdup(option->c_str()); } // this extra addition to argv is accounted for as we are skipping the first entry in - argv[argc++]=strdup("-w"); // finally, turn off warnings. - } else { - // add include paths for input files - for (di.toFirst();di.current();++di,++argc) - { - QCString inc = QCString("-I")+di.currentKey(); - argv[argc]=strdup(inc.data()); - //printf("argv[%d]=%s\n",argc,argv[argc]); - } - // add external include paths - for (uint i=0;i<includePath.count();i++) - { - QCString inc = QCString("-I")+includePath.at(i); - argv[argc++]=strdup(inc.data()); - } - // user specified options - for (uint i=0;i<clangOptions.count();i++) - { - argv[argc++]=strdup(clangOptions.at(i)); - } - // extra options - argv[argc++]=strdup("-ferror-limit=0"); - argv[argc++]=strdup("-x"); - - // Since we can be presented with a .h file that can contain C/C++ or - // Objective C code and we need to configure the parser before knowing this, - // we use the source file to detected the language. Detection will fail if you - // pass a bunch of .h files containing ObjC code, and no sources :-( - SrcLangExt lang = getLanguageFromFileName(fileName); - if (lang==SrcLangExt_ObjC || p->detectedLang!=ClangParser::Private::Detected_Cpp) - { - QCString fn = fileName; - if (p->detectedLang==ClangParser::Private::Detected_Cpp && - (fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" || - fn.right(3).lower()==".cc" || fn.right(2).lower()==".c")) - { // fall back to C/C++ once we see an extension that indicates this - p->detectedLang = ClangParser::Private::Detected_Cpp; + argv[argc++]=qstrdup("-w"); // finally, turn off warnings. + } + else + { + // add include paths for input files + for (di.toFirst();di.current();++di,++argc) + { + QCString inc = QCString("-I")+di.currentKey(); + argv[argc]=qstrdup(inc.data()); + //printf("argv[%d]=%s\n",argc,argv[argc]); } - else if (fn.right(3).lower()==".mm") // switch to Objective C++ + // add external include paths + for (uint i=0;i<includePath.count();i++) { - p->detectedLang = ClangParser::Private::Detected_ObjCpp; + QCString inc = QCString("-I")+includePath.at(i); + argv[argc++]=qstrdup(inc.data()); } - else if (fn.right(2).lower()==".m") // switch to Objective C + // user specified options + for (uint i=0;i<clangOptions.count();i++) { - p->detectedLang = ClangParser::Private::Detected_ObjC; + argv[argc++]=qstrdup(clangOptions.at(i)); + } + // extra options + argv[argc++]=qstrdup("-ferror-limit=0"); + argv[argc++]=qstrdup("-x"); + + // Since we can be presented with a .h file that can contain C/C++ or + // Objective C code and we need to configure the parser before knowing this, + // we use the source file to detected the language. Detection will fail if you + // pass a bunch of .h files containing ObjC code, and no sources :-( + SrcLangExt lang = getLanguageFromFileName(fileName); + if (lang==SrcLangExt_ObjC || p->detectedLang!=ClangParser::Private::Detected_Cpp) + { + QCString fn = fileName; + if (p->detectedLang==ClangParser::Private::Detected_Cpp && + (fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" || + fn.right(3).lower()==".cc" || fn.right(2).lower()==".c")) + { // fall back to C/C++ once we see an extension that indicates this + p->detectedLang = ClangParser::Private::Detected_Cpp; + } + else if (fn.right(3).lower()==".mm") // switch to Objective C++ + { + p->detectedLang = ClangParser::Private::Detected_ObjCpp; + } + else if (fn.right(2).lower()==".m") // switch to Objective C + { + p->detectedLang = ClangParser::Private::Detected_ObjC; + } + } + switch(p->detectedLang) + { + case ClangParser::Private::Detected_Cpp: + argv[argc++]=qstrdup("c++"); + break; + case ClangParser::Private::Detected_ObjC: + argv[argc++]=qstrdup("objective-c"); + break; + case ClangParser::Private::Detected_ObjCpp: + argv[argc++]=qstrdup("objective-c++"); + break; } - } - switch(p->detectedLang) - { - case ClangParser::Private::Detected_Cpp: - argv[argc++]=strdup("c++"); - break; - case ClangParser::Private::Detected_ObjC: - argv[argc++]=strdup("objective-c"); - break; - case ClangParser::Private::Detected_ObjCpp: - argv[argc++]=strdup("objective-c++"); - break; - } - // provide the input and and its dependencies as unsaved files so we can - // pass the filtered versions - argv[argc++]=strdup(fileName); + // provide the input and and its dependencies as unsaved files so we can + // pass the filtered versions + argv[argc++]=qstrdup(fileName); } static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES); //printf("source %s ----------\n%s\n-------------\n\n", @@ -271,7 +281,7 @@ void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit) p->sources = new QCString[numUnsavedFiles]; p->ufs = new CXUnsavedFile[numUnsavedFiles]; p->sources[0] = detab(fileToString(fileName,filterSourceFiles,TRUE)); - p->ufs[0].Filename = strdup(fileName); + p->ufs[0].Filename = qstrdup(fileName); p->ufs[0].Contents = p->sources[0].data(); p->ufs[0].Length = p->sources[0].length(); QStrListIterator it(filesInTranslationUnit); @@ -280,7 +290,7 @@ void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit) { p->fileMapping.insert(it.current(),new uint(i)); p->sources[i] = detab(fileToString(it.current(),filterSourceFiles,TRUE)); - p->ufs[i].Filename = strdup(it.current()); + p->ufs[i].Filename = qstrdup(it.current()); p->ufs[i].Contents = p->sources[i].data(); p->ufs[i].Length = p->sources[i].length(); } @@ -963,6 +973,7 @@ void ClangParser::writeSources(CodeOutputInterface &,FileDef *) ClangParser::ClangParser() { + p = NULL; } ClangParser::~ClangParser() diff --git a/src/clangparser.h b/src/clangparser.h index 6072208..8bb9aba 100644 --- a/src/clangparser.h +++ b/src/clangparser.h @@ -19,7 +19,7 @@ class ClangParser * @param[in,out] filesInTranslationUnit Other files that are * part of the input and included by the file. * The function will return a subset of the files, - * only including the onces that were actually found + * only including the ones that were actually found * during parsing. */ void start(const char *fileName,QStrList &filesInTranslationUnit); diff --git a/src/classdef.cpp b/src/classdef.cpp index e1a80ce..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, @@ -440,7 +443,7 @@ void ClassDef::internalInsertMember(MemberDef *md, if (getLanguage()==SrcLangExt_VHDL) { - QCString title=VhdlDocGen::trVhdlType(md->getMemberSpecifiers(),FALSE); + QCString title=theTranslator->trVhdlType(md->getMemberSpecifiers(),FALSE); if (!m_impl->vhdlSummaryTitles.find(title)) { m_impl->vhdlSummaryTitles.append(title,new QCString(title)); @@ -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()); } @@ -1013,13 +1020,13 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol) // write examples if (hasExamples() && m_impl->exampleSDict) { - ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); + ol.startExamples(); ol.startDescForItem(); //ol.startParagraph(); writeExample(ol,m_impl->exampleSDict); //ol.endParagraph(); ol.endDescForItem(); - ol.endSimpleSect(); + ol.endExamples(); } //ol.newParagraph(); writeSourceDef(ol,name()); @@ -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; } } @@ -1582,7 +1751,11 @@ void ClassDef::writeSummaryLinks(OutputList &ol) void ClassDef::writeTagFile(FTextStream &tagFile) { if (!isLinkableInProject()) return; - tagFile << " <compound kind=\"" << compoundTypeString(); + tagFile << " <compound kind=\""; + if (isFortran() && (compoundTypeString() == "type")) + tagFile << "struct"; + else + tagFile << compoundTypeString(); tagFile << "\""; if (isObjectiveC()) { tagFile << " objc=\"yes\""; } tagFile << ">" << endl; @@ -1835,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); @@ -1870,19 +2044,42 @@ 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); } else if (lang==SrcLangExt_VHDL) { - ol.parseText(VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE)); + ol.parseText(theTranslator->trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE)); } else { @@ -1901,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(); @@ -1935,21 +2136,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade if (rootNode && !rootNode->isEmpty()) { ol.startMemberDescription(anchor()); - - ol.pushGeneratorState(); - ol.disableAll(); - ol.enable(OutputGenerator::RTF); - ol.writeString("{"); - ol.popGeneratorState(); - ol.writeDoc(rootNode,this,0); - - ol.pushGeneratorState(); - ol.disableAll(); - ol.enable(OutputGenerator::RTF); - ol.writeString("\\par}"); - ol.popGeneratorState(); - if (isLinkableInProject()) { writeMoreLink(ol,anchor()); @@ -2018,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); @@ -2080,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: @@ -2120,9 +2320,15 @@ 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 = VhdlDocGen::getClassTitle(this)+" Reference"; + pageTitle = theTranslator->trCustomReference(VhdlDocGen::getClassTitle(this)); } else if (isJavaEnum()) { @@ -2158,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) @@ -2287,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) @@ -2315,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); @@ -2343,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++; @@ -2396,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++; @@ -2474,7 +2741,7 @@ void ClassDef::writeMemberList(OutputList &ol) QStrList sl; if (lang==SrcLangExt_VHDL) { - sl.append(VhdlDocGen::trVhdlType(md->getMemberSpecifiers())); //append vhdl type + sl.append(theTranslator->trVhdlType(md->getMemberSpecifiers(),TRUE)); //append vhdl type } else if (md->isFriend()) sl.append("friend"); else if (md->isRelated()) sl.append("related"); @@ -2525,7 +2792,7 @@ void ClassDef::writeMemberList(OutputList &ol) } //ol.endItemList(); - ol.writeString("</table>"); + if (!first) ol.writeString("</table>"); endFile(ol); ol.popGeneratorState(); @@ -2687,7 +2954,7 @@ bool ClassDef::hasNonReferenceSuperClass() return found; } -/*! called from MemberDef::writeDeclaration() to (recusively) write the +/*! called from MemberDef::writeDeclaration() to (recursively) write the * definition of an anonymous struct, union or class. */ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup, @@ -2873,7 +3140,7 @@ static bool isStandardFunc(MemberDef *md) } /*! - * recusively merges the `all members' lists of a class base + * recursively merges the `all members' lists of a class base * with that of this class. Must only be called for classes without * subclasses! */ @@ -4514,6 +4781,11 @@ bool ClassDef::isObjectiveC() const return getLanguage()==SrcLangExt_ObjC; } +bool ClassDef::isFortran() const +{ + return getLanguage()==SrcLangExt_Fortran; +} + bool ClassDef::isCSharp() const { return getLanguage()==SrcLangExt_CSharp; @@ -4742,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 23c5c5c..14f9fc8 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -200,7 +200,7 @@ class ClassDef : public Definition MemberDef *getMemberByName(const QCString &) const; /** Returns TRUE iff \a bcd is a direct or indirect base class of this - * class. This function will recusively traverse all branches of the + * class. This function will recursively traverse all branches of the * inheritance tree. */ bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0); @@ -266,6 +266,9 @@ class ClassDef : public Definition /** Returns TRUE if this class is implemented in Objective-C */ bool isObjectiveC() const; + /** Returns TRUE if this class is implemented in Fortran */ + bool isFortran() const; + /** Returns TRUE if this class is implemented in C# */ bool isCSharp() const; @@ -333,6 +336,7 @@ class ClassDef : public Definition QCString getMemberListFileName() const; bool subGrouping() const; + bool isSliceLocal() const; //----------------------------------------------------------------------------------- // --- setters ---- @@ -373,6 +377,8 @@ class ClassDef : public Definition void setTagLessReference(ClassDef *cd); void setName(const char *name); + void setMetaData(const char *md); + //----------------------------------------------------------------------------------- // --- actions ---- //----------------------------------------------------------------------------------- @@ -426,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 2c8effc..55f8214 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -111,6 +111,7 @@ CommandMap cmdMap[] = { "\\", CMD_BSLASH }, { "@", CMD_AT }, { "<", CMD_LESS }, + { "=", CMD_EQUAL }, { ">", CMD_GREATER }, { "&", CMD_AMP }, { "$", CMD_DOLLAR }, @@ -147,6 +148,7 @@ CommandMap cmdMap[] = { "--", CMD_NDASH }, { "---", CMD_MDASH }, { "_setscope", CMD_SETSCOPE }, + { "emoji", CMD_EMOJI }, { 0, 0 }, }; @@ -193,6 +195,8 @@ CommandMap htmlTagMap[] = { "span", HTML_SPAN }, { "div", HTML_DIV }, { "blockquote", HTML_BLOCKQUOTE }, + { "strike", HTML_STRIKE }, + { "u", HTML_UNDERLINE }, { "c", XML_C }, // { "code", XML_CODE }, <= ambiguous <code> is also a HTML tag diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 8cb529d..8c49b3f 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -136,7 +136,9 @@ enum CommandType CMD_MINUS = 106, CMD_INCLUDEDOC = 107, CMD_SNIPPETDOC = 108, - CMD_SNIPWITHLINES= 109 + CMD_SNIPWITHLINES= 109, + CMD_EMOJI = 110, + CMD_EQUAL = 111 }; enum HtmlTagType @@ -175,6 +177,8 @@ enum HtmlTagType HTML_SPAN = 31, HTML_DIV = 32, HTML_BLOCKQUOTE= 33, + HTML_STRIKE = 34, + HTML_UNDERLINE = 35, XML_CmdMask = 0x100, @@ -116,11 +116,13 @@ static int g_memCallContext; static int g_lastCContext; static int g_skipInlineInitContext; +static bool g_insideCpp; static bool g_insideObjC; 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; @@ -904,7 +906,7 @@ static bool getLinkInScope(const QCString &c, // scope return TRUE; } } - else // found member, but is is not linkable, so make sure content inside is not assign + else // found member, but it is not linkable, so make sure content inside is not assigned // to the previous member, see bug762760 { DBG_CTX((stderr,"unlinkable member %s\n",md->name().data())); @@ -982,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); @@ -1323,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; @@ -1796,6 +1800,11 @@ static QCString escapeComment(const char *s) return result; } +static bool skipLanguageSpecificKeyword(const QCString &kw) +{ + return g_insideCpp && (kw == "remove" || kw == "set" || kw == "get"); +} + /* ----------------------------------------------------------------- */ #undef YY_INPUT @@ -1823,10 +1832,11 @@ TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID}) SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+ KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property") -KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"set"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"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}) +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 "+"|"-"|"/"|"*"|"%"|"--"|"++" @@ -2164,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") { @@ -2229,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(); @@ -2415,6 +2429,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" g_prefixed_with_this_keyword = TRUE; } <Body>{KEYWORD}/([^a-z_A-Z0-9]) { + if (g_insideJava && qstrcmp("internal",yytext) ==0) REJECT; + if (skipLanguageSpecificKeyword(yytext)) REJECT; startFontClass("keyword"); codifyLines(yytext); if (QCString(yytext)=="typedef") @@ -2425,11 +2441,13 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" endFontClass(); } <Body>{KEYWORD}/{B}* { + if (skipLanguageSpecificKeyword(yytext)) REJECT; startFontClass("keyword"); codifyLines(yytext); endFontClass(); } <Body>{KEYWORD}/{BN}*"(" { + if (skipLanguageSpecificKeyword(yytext)) REJECT; startFontClass("keyword"); codifyLines(yytext); endFontClass(); @@ -2526,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); @@ -2586,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) @@ -2617,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); @@ -2984,6 +3017,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" <MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) { //addParmType(); //g_parmName=yytext; + if (skipLanguageSpecificKeyword(yytext)) REJECT; startFontClass("keyword"); g_code->codify(yytext); endFontClass(); @@ -2995,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; @@ -3567,6 +3615,9 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" endFontClass(); } } +<SkipComment>[^\*\n]+ { + g_code->codify(yytext); + } <*>"/*" { startFontClass("comment"); g_code->codify(yytext); @@ -3738,10 +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_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/commentcnv.l b/src/commentcnv.l index 44e2543..88236ed 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -294,12 +294,12 @@ void replaceComment(int offset); } else { - /* check for fixed format; we might have some conditional as part of multilene if like C<5 .and. & */ + /* check for fixed format; we might have some conditional as part of multiline if like C<5 .and. & */ if (isFixedForm && (g_col == 0)) { copyToOutput(yytext,(int)yyleng); g_nestingCount=0; - g_commentStack.clear(); /* to be on the save side */ + g_commentStack.clear(); /* to be on the safe side */ BEGIN(CComment); g_commentStack.push(new CommentCtx(g_lineNr)); } @@ -591,7 +591,15 @@ void replaceComment(int offset); copyToOutput(yytext,(int)yyleng); } <SkipString>\\. { /* escaped character in string */ - copyToOutput(yytext,(int)yyleng); + if (g_lang==SrcLangExt_Fortran) + { + unput(yytext[1]); + copyToOutput(yytext,1); + } + else + { + copyToOutput(yytext,(int)yyleng); + } } <SkipString>"\"" { /* end of string */ copyToOutput(yytext,(int)yyleng); @@ -604,7 +612,15 @@ void replaceComment(int offset); copyToOutput(yytext,(int)yyleng); } <SkipChar>\\. { /* escaped character */ - copyToOutput(yytext,(int)yyleng); + if (g_lang==SrcLangExt_Fortran) + { + unput(yytext[1]); + copyToOutput(yytext,1); + } + else + { + copyToOutput(yytext,(int)yyleng); + } } <SkipChar>' { /* end of character literal */ copyToOutput(yytext,(int)yyleng); @@ -1068,7 +1084,7 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) { CondCtx *ctx = g_condStack.pop(); QCString sectionInfo = " "; - if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label %s ",ctx->sectionId.data()); + if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label '%s' ",ctx->sectionId.stripWhiteSpace().data()); warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have " "a corresponding \\endcond command within this file.",sectionInfo.data()); } @@ -1093,7 +1109,9 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) if (Debug::isFlagSet(Debug::CommentCnv)) { g_outBuf->at(g_outBuf->curPos())='\0'; - msg("-------------\n%s\n-------------\n",g_outBuf->data()); + Debug::print(Debug::CommentCnv,0,"-----------\nCommentCnv: %s\n" + "output=[\n%s]\n-----------\n",fileName,g_outBuf->data() + ); } printlex(yy_flex_debug, FALSE, __FILE__, fileName); } 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 588d40a..90e7ac3 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -30,7 +30,7 @@ #include <qstack.h> #include <qregexp.h> #include <qfile.h> - +#include <qcstringlist.h> #include "scanner.h" #include "entry.h" #include "doxygen.h" @@ -54,81 +54,85 @@ #define YY_NO_UNISTD_H 1 // forward declarations -static bool handleBrief(const QCString &); -static bool handleFn(const QCString &); -static bool handleDef(const QCString &); -static bool handleOverload(const QCString &); -static bool handleEnum(const QCString &); -static bool handleDefGroup(const QCString &); -static bool handleAddToGroup(const QCString &); -static bool handleWeakGroup(const QCString &); -static bool handleNamespace(const QCString &); -static bool handlePackage(const QCString &); -static bool handleClass(const QCString &); -static bool handleHeaderFile(const QCString &); -static bool handleProtocol(const QCString &); -static bool handleCategory(const QCString &); -static bool handleUnion(const QCString &); -static bool handleStruct(const QCString &); -static bool handleInterface(const QCString &); -static bool handleIdlException(const QCString &); -static bool handlePage(const QCString &); -static bool handleMainpage(const QCString &); -static bool handleFile(const QCString &); -static bool handleDir(const QCString &); -static bool handleExample(const QCString &); -static bool handleDetails(const QCString &); -static bool handleName(const QCString &); -static bool handleTodo(const QCString &); -static bool handleTest(const QCString &); -static bool handleBug(const QCString &); -static bool handleSubpage(const QCString &s); -static bool handleDeprecated(const QCString &); -static bool handleXRefItem(const QCString &); -static bool handleRelated(const QCString &); -static bool handleRelatedAlso(const QCString &); -static bool handleMemberOf(const QCString &); -static bool handleRefItem(const QCString &); -static bool handleSection(const QCString &); -static bool handleAnchor(const QCString &); -static bool handleCite(const QCString &); -static bool handleFormatBlock(const QCString &); -static bool handleAddIndex(const QCString &); -static bool handleIf(const QCString &); -static bool handleIfNot(const QCString &); -static bool handleElseIf(const QCString &); -static bool handleElse(const QCString &); -static bool handleEndIf(const QCString &); -static bool handleIngroup(const QCString &); -static bool handleNoSubGrouping(const QCString &); -static bool handleShowInitializer(const QCString &); -static bool handleHideInitializer(const QCString &); -static bool handleCallgraph(const QCString &); -static bool handleHideCallgraph(const QCString &); -static bool handleCallergraph(const QCString &); -static bool handleHideCallergraph(const QCString &); -static bool handleInternal(const QCString &); -static bool handleLineBr(const QCString &); -static bool handleStatic(const QCString &); -static bool handlePure(const QCString &); -static bool handlePrivate(const QCString &); -static bool handlePrivateSection(const QCString &); -static bool handleProtected(const QCString &); -static bool handleProtectedSection(const QCString &); -static bool handlePublic(const QCString &s); -static bool handlePublicSection(const QCString &s); -static bool handleToc(const QCString &s); -static bool handleInherit(const QCString &); -static bool handleExtends(const QCString &); -static bool handleCopyDoc(const QCString &); -static bool handleCopyBrief(const QCString &); -static bool handleCopyDetails(const QCString &); -static bool handleParBlock(const QCString &); -static bool handleEndParBlock(const QCString &); -static bool handleParam(const QCString &); -static bool handleRetval(const QCString &); - -typedef bool (*DocCmdFunc)(const QCString &name); +static bool handleBrief(const QCString &, const QCStringList &); +static bool handleFn(const QCString &, const QCStringList &); +static bool handleDef(const QCString &, const QCStringList &); +static bool handleOverload(const QCString &, const QCStringList &); +static bool handleEnum(const QCString &, const QCStringList &); +static bool handleDefGroup(const QCString &, const QCStringList &); +static bool handleAddToGroup(const QCString &, const QCStringList &); +static bool handleWeakGroup(const QCString &, const QCStringList &); +static bool handleNamespace(const QCString &, const QCStringList &); +static bool handlePackage(const QCString &, const QCStringList &); +static bool handleClass(const QCString &, const QCStringList &); +static bool handleHeaderFile(const QCString &, const QCStringList &); +static bool handleProtocol(const QCString &, const QCStringList &); +static bool handleCategory(const QCString &, const QCStringList &); +static bool handleUnion(const QCString &, const QCStringList &); +static bool handleStruct(const QCString &, const QCStringList &); +static bool handleInterface(const QCString &, const QCStringList &); +static bool handleIdlException(const QCString &, const QCStringList &); +static bool handlePage(const QCString &, const QCStringList &); +static bool handleMainpage(const QCString &, const QCStringList &); +static bool handleFile(const QCString &, const QCStringList &); +static bool handleDir(const QCString &, const QCStringList &); +static bool handleExample(const QCString &, const QCStringList &); +static bool handleDetails(const QCString &, const QCStringList &); +static bool handleName(const QCString &, const QCStringList &); +static bool handleTodo(const QCString &, const QCStringList &); +static bool handleTest(const QCString &, const QCStringList &); +static bool handleBug(const QCString &, const QCStringList &); +static bool handleSubpage(const QCString &s, const QCStringList &); +static bool handleDeprecated(const QCString &, const QCStringList &); +static bool handleXRefItem(const QCString &, const QCStringList &); +static bool handleRelated(const QCString &, const QCStringList &); +static bool handleRelatedAlso(const QCString &, const QCStringList &); +static bool handleMemberOf(const QCString &, const QCStringList &); +static bool handleRefItem(const QCString &, const QCStringList &); +static bool handleSection(const QCString &, const QCStringList &); +static bool handleAnchor(const QCString &, const QCStringList &); +static bool handleCite(const QCString &, const QCStringList &); +static bool handleFormatBlock(const QCString &, const QCStringList &); +static bool handleAddIndex(const QCString &, const QCStringList &); +static bool handleIf(const QCString &, const QCStringList &); +static bool handleIfNot(const QCString &, const QCStringList &); +static bool handleElseIf(const QCString &, const QCStringList &); +static bool handleElse(const QCString &, const QCStringList &); +static bool handleEndIf(const QCString &, const QCStringList &); +static bool handleIngroup(const QCString &, const QCStringList &); +static bool handleNoSubGrouping(const QCString &, const QCStringList &); +static bool handleShowInitializer(const QCString &, const QCStringList &); +static bool handleHideInitializer(const QCString &, const QCStringList &); +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 &); +static bool handlePure(const QCString &, const QCStringList &); +static bool handlePrivate(const QCString &, const QCStringList &); +static bool handlePrivateSection(const QCString &, const QCStringList &); +static bool handleProtected(const QCString &, const QCStringList &); +static bool handleProtectedSection(const QCString &, const QCStringList &); +static bool handlePublic(const QCString &s, const QCStringList &); +static bool handlePublicSection(const QCString &s, const QCStringList &); +static bool handleToc(const QCString &s, const QCStringList &); +static bool handleInherit(const QCString &, const QCStringList &); +static bool handleExtends(const QCString &, const QCStringList &); +static bool handleCopyDoc(const QCString &, const QCStringList &); +static bool handleCopyBrief(const QCString &, const QCStringList &); +static bool handleCopyDetails(const QCString &, const QCStringList &); +static bool handleParBlock(const QCString &, const QCStringList &); +static bool handleEndParBlock(const QCString &, const QCStringList &); +static bool handleParam(const QCString &, const QCStringList &); +static bool handleRetval(const QCString &, const QCStringList &); + +typedef bool (*DocCmdFunc)(const QCString &name, const QCStringList &optList); struct DocCmdMap { @@ -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 }, @@ -548,7 +556,7 @@ static void addXRefItem(const char *listName,const char *itemTitle, if (docEntry->sli) { QListIterator<ListItemInfo> slii(*docEntry->sli); - for (slii.toFirst();(lii=slii.current());++slii) + for (slii.toLast();(lii=slii.current());--slii) { if (qstrcmp(lii->type,listName)==0) { @@ -563,14 +571,7 @@ static void addXRefItem(const char *listName,const char *itemTitle, RefItem *item = refList->getRefItem(lii->itemId); ASSERT(item!=0); item->text += " <p>"; - if (Doxygen::markdownSupport) - { - item->text += processMarkdown(yyFileName,yyLineNr,current,outputXRef); - } - else - { - item->text += outputXRef; - } + item->text += outputXRef; //printf("%s: text +=%s\n",listName,item->text.data()); } else // new item @@ -585,18 +586,11 @@ static void addXRefItem(const char *listName,const char *itemTitle, sprintf(anchorLabel,"_%s%06d",listName,itemId); RefItem *item = refList->getRefItem(itemId); ASSERT(item!=0); - if (Doxygen::markdownSupport) - { - item->text = processMarkdown(yyFileName,yyLineNr,current,outputXRef); - } - else - { - item->text = outputXRef; - } + item->text = outputXRef; item->listAnchor = anchorLabel; docEntry->addSpecialListItem(listName,itemId); QCString cmdString; - cmdString.sprintf("\\xrefitem %s %d.",listName,itemId); + cmdString.sprintf(" \\xrefitem %s %d.",listName,itemId); if (inBody) { docEntry->inbodyDocs += cmdString; @@ -702,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()); } //----------------------------------------------------------------------------- @@ -934,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" @@ -949,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}*">" @@ -1003,6 +1005,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" %x CiteLabel %x CopyDoc %x GuardExpr +%x CdataSection %% @@ -1018,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> */ @@ -1060,10 +1063,13 @@ RCSTAG "$"{ID}":"[^\n$]+"$" addOutput(yytext); } <Comment>"</summary>" { // start of a .NET XML style detailed description + setOutput(OutputBrief); addOutput(yytext); setOutput(OutputDoc); } <Comment>"</remarks>" { // end of a brief or detailed description + + setOutput(OutputDoc); addOutput(yytext); } <Comment>"<"{CAPTION}{ATTR}">" { @@ -1092,24 +1098,42 @@ RCSTAG "$"{ID}":"[^\n$]+"$" insidePre=FALSE; addOutput(yytext); } -<Comment>{RCSTAG} { // RCS tag which end a brief description - setOutput(OutputDoc); - REJECT; - } -<Comment>"<!--" { - BEGIN(HtmlComment); - } +<Comment>{RCSTAG} { // RCS tag which end a brief description + setOutput(OutputDoc); + REJECT; + } +<Comment>"<!--" { + BEGIN(HtmlComment); + } +<Comment>"<!\[CDATA\[" { + BEGIN(CdataSection); + } <Comment>{B}*{CMD}"endinternal"{B}* { - addOutput("\\endinternal "); + addOutput(" \\endinternal "); if (!inInternalDocs) warn(yyFileName,yyLineNr, "found \\endinternal without matching \\internal" ); inInternalDocs = FALSE; } +<Comment>{B}*{CMD}[a-z_A-Z]+"{"[a-zA-Z_,:0-9\. ]*"}"{B}* | <Comment>{B}*{CMD}[a-z_A-Z]+{B}* { // potentially interesting command // the {B}* in the front was added for bug620924 - QCString cmdName = QCString(yytext).stripWhiteSpace().data()+1; + QCString fullMatch = QCString(yytext); + int idx = fullMatch.find('{'); + int idxEnd = fullMatch.find("}",idx+1); + QCString cmdName; + QCStringList optList; + if (idx == -1) // no options + { + cmdName = QCString(yytext).stripWhiteSpace().data()+1; // to remove {CMD} + } + else // options present + { + cmdName = fullMatch.left(idx).stripWhiteSpace().data()+1; // to remove {CMD} + QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace(); + optList = QCStringList::split(',',optStr); + } DocCmdMapper::Cmd *cmdPtr = DocCmdMapper::map(cmdName); if (cmdPtr) // special action is required { @@ -1123,7 +1147,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" setOutput(OutputDoc); } //if (i>0) addOutput(QCString(yytext).left(i)); // removed for bug 689341 - if (cmdPtr->func && cmdPtr->func(cmdName)) + if (cmdPtr->func && cmdPtr->func(cmdName, optList)) { // implicit split of the comment block into two // entries. Restart the next block at the start @@ -1329,6 +1353,24 @@ RCSTAG "$"{ID}":"[^\n$]+"$" <HtmlComment>. { // ignore every else } +<CdataSection>"\]\]>" { + BEGIN( Comment ); + } +<CdataSection>{DOCNL} { + addOutput('\n'); + if (*yytext=='\n') yyLineNr++; + } +<CdataSection>[<>&] { // the special XML characters for iwhich the CDATA section is especially used + addOutput('\\'); + addOutput(*yytext); + } +<CdataSection>[^\\\n\]<>&]+ { + addOutput(yytext); + } +<CdataSection>. { + addOutput(*yytext); + } + /* -------------- Rules for handling formulas ---------------- */ <ReadFormulaShort>{CMD}"f$" { // end of inline formula @@ -1355,7 +1397,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" formulaText+=*yytext; yyLineNr++; } -<ReadFormulaLong,ReadFormulaShort>. { // any othe character +<ReadFormulaLong,ReadFormulaShort>. { // any other character formulaText+=*yytext; } @@ -1517,14 +1559,16 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (*yytext=='\n') yyLineNr++; BEGIN( Comment ); } +<GroupDocArg1>. { // ignore other stuff + } <GroupDocArg2>"\\"{B}*"\n" { // line continuation yyLineNr++; addOutput('\n'); } -<GroupDocArg2>[^\n\\\*]+ { // title (stored in type) +<GroupDocArg2>[^\n\*]+ { // title (stored in type) current->type += yytext; current->type = current->type.stripWhiteSpace(); - } + } <GroupDocArg2>{DOCNL} { if ( current->groupDocType==Entry::GROUPDOC_NORMAL && current->type.isEmpty() @@ -1561,28 +1605,24 @@ 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,"@<","<"),"@>",">"); + tmp = substitute(substitute(tmp,"\\<","<"),"\\>",">"); + current->args = tmp; addOutput('\n'); BEGIN( Comment ); } /* --------- handle arguments of the param command ------------ */ <ParamArg1>{ID}/{B}*"," { - if (yytext[0]=='_' && Config_getBool(MARKDOWN_SUPPORT)) - { - addOutput('\\'); - } addOutput(yytext); } <ParamArg1>"," { addOutput(" , "); } <ParamArg1>{ID} { - if (yytext[0]=='_' && Config_getBool(MARKDOWN_SUPPORT)) - { - addOutput('\\'); - } addOutput(yytext); BEGIN( Comment ); } @@ -1716,7 +1756,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" /* ----- handle arguments of the section/subsection/.. commands ------- */ -<SectionLabel>{LABELID} { // first argyment +<SectionLabel>{LABELID} { // first argument g_sectionLabel=yytext; addOutput(yytext); g_sectionTitle.resize(0); @@ -1860,10 +1900,10 @@ RCSTAG "$"{ID}":"[^\n$]+"$" addOutput(*yytext); } <FormatBlock><<EOF>> { - QCString endTag = "@end"+blockName; + QCString endTag = "end"+blockName; if (blockName=="startuml") endTag="enduml"; warn(yyFileName,yyLineNr, - "reached end of comment while inside a @%s block; check for missing @%s tag!", + "reached end of comment while inside a \\%s block; check for missing \\%s tag!", blockName.data(),endTag.data() ); yyterminate(); @@ -1944,7 +1984,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "found @endif without matching start command"); + "found \\endif without matching start command"); } else { @@ -1962,7 +2002,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "found @else without matching start command"); + "found \\else without matching start command"); } else { @@ -1979,7 +2019,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "found @elseif without matching start command"); + "found \\elseif without matching start command"); } else { @@ -2050,7 +2090,6 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } } <SkipInternal>[@\\]"endinternal"[ \t]* { - addOutput("\\endinternal "); BEGIN(Comment); } <SkipInternal>[^ \\@\n]+ { // skip non-special characters @@ -2221,7 +2260,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" /* ----- handle arguments of the cite command ------- */ -<CiteLabel>{CITEID} { // found argyment +<CiteLabel>{CITEID} { // found argument addCite(); addOutput(yytext); BEGIN(Comment); @@ -2267,14 +2306,14 @@ RCSTAG "$"{ID}":"[^\n$]+"$" //---------------------------------------------------------------------------- -static bool handleBrief(const QCString &) +static bool handleBrief(const QCString &, const QCStringList &) { //printf("handleBrief\n"); setOutput(OutputBrief); return FALSE; } -static bool handleFn(const QCString &) +static bool handleFn(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::MEMBERDOC_SEC); functionProto.resize(0); @@ -2283,7 +2322,7 @@ static bool handleFn(const QCString &) return stop; } -static bool handleDef(const QCString &) +static bool handleDef(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::DEFINEDOC_SEC); functionProto.resize(0); @@ -2291,21 +2330,21 @@ static bool handleDef(const QCString &) return stop; } -static bool handleOverload(const QCString &) +static bool handleOverload(const QCString &, const QCStringList &) { functionProto.resize(0); BEGIN(OverloadParam); return FALSE; } -static bool handleEnum(const QCString &) +static bool handleEnum(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::ENUMDOC_SEC); BEGIN(EnumDocArg1); return stop; } -static bool handleDefGroup(const QCString &) +static bool handleDefGroup(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC); current->groupDocType = Entry::GROUPDOC_NORMAL; @@ -2313,7 +2352,7 @@ static bool handleDefGroup(const QCString &) return stop; } -static bool handleAddToGroup(const QCString &) +static bool handleAddToGroup(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC); current->groupDocType = Entry::GROUPDOC_ADD; @@ -2321,7 +2360,7 @@ static bool handleAddToGroup(const QCString &) return stop; } -static bool handleWeakGroup(const QCString &) +static bool handleWeakGroup(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC); current->groupDocType = Entry::GROUPDOC_WEAK; @@ -2329,83 +2368,83 @@ static bool handleWeakGroup(const QCString &) return stop; } -static bool handleNamespace(const QCString &) +static bool handleNamespace(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::NAMESPACEDOC_SEC); BEGIN( NameSpaceDocArg1 ); return stop; } -static bool handlePackage(const QCString &) +static bool handlePackage(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::PACKAGEDOC_SEC); BEGIN( PackageDocArg1 ); return stop; } -static bool handleClass(const QCString &) +static bool handleClass(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::CLASSDOC_SEC); BEGIN( ClassDocArg1 ); return stop; } -static bool handleHeaderFile(const QCString &) +static bool handleHeaderFile(const QCString &, const QCStringList &) { BEGIN( ClassDocArg2 ); return FALSE; } -static bool handleProtocol(const QCString &) +static bool handleProtocol(const QCString &, const QCStringList &) { // Obj-C protocol bool stop=makeStructuralIndicator(Entry::PROTOCOLDOC_SEC); BEGIN( ClassDocArg1 ); return stop; } -static bool handleCategory(const QCString &) +static bool handleCategory(const QCString &, const QCStringList &) { // Obj-C category bool stop=makeStructuralIndicator(Entry::CATEGORYDOC_SEC); BEGIN( CategoryDocArg1 ); return stop; } -static bool handleUnion(const QCString &) +static bool handleUnion(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::UNIONDOC_SEC); BEGIN( ClassDocArg1 ); return stop; } -static bool handleStruct(const QCString &) +static bool handleStruct(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::STRUCTDOC_SEC); BEGIN( ClassDocArg1 ); return stop; } -static bool handleInterface(const QCString &) +static bool handleInterface(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::INTERFACEDOC_SEC); BEGIN( ClassDocArg1 ); return stop; } -static bool handleIdlException(const QCString &) +static bool handleIdlException(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::EXCEPTIONDOC_SEC); BEGIN( ClassDocArg1 ); return stop; } -static bool handlePage(const QCString &) +static bool handlePage(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::PAGEDOC_SEC); BEGIN( PageDocArg1 ); return stop; } -static bool handleMainpage(const QCString &) +static bool handleMainpage(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::MAINPAGEDOC_SEC); if (!stop) @@ -2416,7 +2455,7 @@ static bool handleMainpage(const QCString &) return stop; } -static bool handleFile(const QCString &) +static bool handleFile(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::FILEDOC_SEC); if (!stop) @@ -2427,7 +2466,7 @@ static bool handleFile(const QCString &) return stop; } -static bool handleParam(const QCString &) +static bool handleParam(const QCString &, const QCStringList &) { // we need process param and retval arguments to escape leading underscores in case of // markdown processing, see bug775493 @@ -2436,14 +2475,14 @@ static bool handleParam(const QCString &) return FALSE; } -static bool handleRetval(const QCString &) +static bool handleRetval(const QCString &, const QCStringList &) { addOutput("@retval "); BEGIN( ParamArg1 ); return FALSE; } -static bool handleDir(const QCString &) +static bool handleDir(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::DIRDOC_SEC); if (!stop) current->name = yyFileName; @@ -2451,15 +2490,30 @@ static bool handleDir(const QCString &) return stop; } -static bool handleExample(const QCString &) +static bool handleExample(const QCString &cmd, const QCStringList &optList) { - bool stop=makeStructuralIndicator(Entry::EXAMPLE_SEC); + Entry::Sections section=Entry::EXAMPLE_SEC; + QCStringList::ConstIterator it; + for ( it = optList.begin(); it != optList.end(); ++it ) + { + QCString opt = (*it).stripWhiteSpace().lower(); + if (opt=="lineno") + { + section=Entry::EXAMPLE_LINENO_SEC; + } + else + { + warn(yyFileName,yyLineNr, + "unsupported option '%s' for command '\\%s'",qPrint(opt),qPrint(cmd)); + } + } + bool stop=makeStructuralIndicator(section); if (!stop) current->name = yyFileName; BEGIN( FileDocArg1 ); return stop; } -static bool handleDetails(const QCString &) +static bool handleDetails(const QCString &, const QCStringList &) { if (inContext!=OutputBrief) { @@ -2470,7 +2524,7 @@ static bool handleDetails(const QCString &) return FALSE; } -static bool handleName(const QCString &) +static bool handleName(const QCString &, const QCStringList &) { bool stop=makeStructuralIndicator(Entry::MEMBERGRP_SEC); if (!stop) @@ -2485,7 +2539,7 @@ static bool handleName(const QCString &) return stop; } -static bool handleTodo(const QCString &) +static bool handleTodo(const QCString &, const QCStringList &) { newXRefKind = XRef_Todo; setOutput(OutputXRef); @@ -2493,7 +2547,7 @@ static bool handleTodo(const QCString &) return FALSE; } -static bool handleTest(const QCString &) +static bool handleTest(const QCString &, const QCStringList &) { newXRefKind = XRef_Test; setOutput(OutputXRef); @@ -2501,7 +2555,7 @@ static bool handleTest(const QCString &) return FALSE; } -static bool handleBug(const QCString &) +static bool handleBug(const QCString &, const QCStringList &) { newXRefKind = XRef_Bug; setOutput(OutputXRef); @@ -2509,7 +2563,7 @@ static bool handleBug(const QCString &) return FALSE; } -static bool handleDeprecated(const QCString &) +static bool handleDeprecated(const QCString &, const QCStringList &) { newXRefKind = XRef_Deprecated; setOutput(OutputXRef); @@ -2517,14 +2571,14 @@ static bool handleDeprecated(const QCString &) return FALSE; } -static bool handleXRefItem(const QCString &) +static bool handleXRefItem(const QCString &, const QCStringList &) { newXRefKind = XRef_Item; BEGIN(XRefItemParam1); return FALSE; } -static bool handleParBlock(const QCString &) +static bool handleParBlock(const QCString &, const QCStringList &) { if (g_insideParBlock) { @@ -2541,7 +2595,7 @@ static bool handleParBlock(const QCString &) return FALSE; } -static bool handleEndParBlock(const QCString &) +static bool handleEndParBlock(const QCString &, const QCStringList &) { if (!g_insideParBlock) { @@ -2554,34 +2608,50 @@ static bool handleEndParBlock(const QCString &) return FALSE; } -static bool handleRelated(const QCString &) +static bool handleRelated(const QCString &, const QCStringList &) { + if (!current->relates.isEmpty()) + { + warn(yyFileName,yyLineNr, + "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition"); + } + current->relatesType = Simple; BEGIN(RelatesParam1); return FALSE; } -static bool handleRelatedAlso(const QCString &) +static bool handleRelatedAlso(const QCString &, const QCStringList &) { + if (!current->relates.isEmpty()) + { + warn(yyFileName,yyLineNr, + "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition"); + } current->relatesType = Duplicate; BEGIN(RelatesParam1); return FALSE; } -static bool handleMemberOf(const QCString &) +static bool handleMemberOf(const QCString &, const QCStringList &) { + if (!current->relates.isEmpty()) + { + warn(yyFileName,yyLineNr, + "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition"); + } current->relatesType = MemberOf; BEGIN(RelatesParam1); return FALSE; } -static bool handleRefItem(const QCString &) +static bool handleRefItem(const QCString &, const QCStringList &) { addOutput("@refitem "); BEGIN(LineParam); return FALSE; } -static bool handleSection(const QCString &s) +static bool handleSection(const QCString &s, const QCStringList &) { setOutput(OutputDoc); addOutput("@"+s+" "); @@ -2593,7 +2663,7 @@ static bool handleSection(const QCString &s) return FALSE; } -static bool handleSubpage(const QCString &s) +static bool handleSubpage(const QCString &s, const QCStringList &) { if (current->section!=Entry::EMPTY_SEC && current->section!=Entry::PAGEDOC_SEC && @@ -2613,14 +2683,14 @@ static bool handleSubpage(const QCString &s) return FALSE; } -static bool handleAnchor(const QCString &s) +static bool handleAnchor(const QCString &s, const QCStringList &) { addOutput("@"+s+" "); BEGIN(AnchorLabel); return FALSE; } -static bool handleCite(const QCString &s) +static bool handleCite(const QCString &s, const QCStringList &) { if (!g_spaceBeforeCmd.isEmpty()) { @@ -2632,24 +2702,31 @@ static bool handleCite(const QCString &s) return FALSE; } -static bool handleFormatBlock(const QCString &s) +static bool handleFormatBlock(const QCString &s, const QCStringList &optList) { - addOutput("@"+s+" "); - //printf("handleFormatBlock(%s)\n",s.data()); + if (optList.isEmpty()) + { + addOutput("@"+s+" "); + } + else + { + addOutput("@"+s+"{"+optList.join(",")+"} "); + } + //printf("handleFormatBlock(%s) with option(%s)\n",s.data(),opt.data()); blockName=s; g_commentCount=0; BEGIN(FormatBlock); return FALSE; } -static bool handleAddIndex(const QCString &) +static bool handleAddIndex(const QCString &, const QCStringList &) { addOutput("@addindex "); BEGIN(LineParam); return FALSE; } -static bool handleIf(const QCString &) +static bool handleIf(const QCString &, const QCStringList &) { enabledSectionFound=FALSE; guardType = Guard_If; @@ -2658,7 +2735,7 @@ static bool handleIf(const QCString &) return FALSE; } -static bool handleIfNot(const QCString &) +static bool handleIfNot(const QCString &, const QCStringList &) { enabledSectionFound=FALSE; guardType = Guard_IfNot; @@ -2667,7 +2744,7 @@ static bool handleIfNot(const QCString &) return FALSE; } -static bool handleElseIf(const QCString &) +static bool handleElseIf(const QCString &, const QCStringList &) { if (guards.isEmpty()) { @@ -2682,7 +2759,7 @@ static bool handleElseIf(const QCString &) return FALSE; } -static bool handleElse(const QCString &) +static bool handleElse(const QCString &, const QCStringList &) { if (guards.isEmpty()) { @@ -2696,7 +2773,7 @@ static bool handleElse(const QCString &) return FALSE; } -static bool handleEndIf(const QCString &) +static bool handleEndIf(const QCString &, const QCStringList &) { if (guards.isEmpty()) { @@ -2717,56 +2794,80 @@ static bool handleEndIf(const QCString &) return FALSE; } -static bool handleIngroup(const QCString &) +static bool handleIngroup(const QCString &, const QCStringList &) { inGroupParamFound=FALSE; BEGIN( InGroupParam ); return FALSE; } -static bool handleNoSubGrouping(const QCString &) +static bool handleNoSubGrouping(const QCString &, const QCStringList &) { current->subGrouping = FALSE; return FALSE; } -static bool handleShowInitializer(const QCString &) +static bool handleShowInitializer(const QCString &, const QCStringList &) { current->initLines = 100000; // ON return FALSE; } -static bool handleHideInitializer(const QCString &) +static bool handleHideInitializer(const QCString &, const QCStringList &) { current->initLines = 0; // OFF return FALSE; } -static bool handleCallgraph(const QCString &) +static bool handleCallgraph(const QCString &, const QCStringList &) { current->callGraph = TRUE; // ON return FALSE; } -static bool handleHideCallgraph(const QCString &) +static bool handleHideCallgraph(const QCString &, const QCStringList &) { current->callGraph = FALSE; // OFF return FALSE; } -static bool handleCallergraph(const QCString &) +static bool handleCallergraph(const QCString &, const QCStringList &) { current->callerGraph = TRUE; // ON return FALSE; } -static bool handleHideCallergraph(const QCString &) +static bool handleHideCallergraph(const QCString &, const QCStringList &) { current->callerGraph = FALSE; // OFF return FALSE; } -static bool handleInternal(const QCString &) +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)) { @@ -2782,91 +2883,141 @@ static bool handleInternal(const QCString &) else { // re-enabled for bug640828 - addOutput("\\internal "); + addOutput(" \\internal "); inInternalDocs = TRUE; } return FALSE; } -static bool handleLineBr(const QCString &) +static bool handleLineBr(const QCString &, const QCStringList &) { addOutput('\n'); return FALSE; } -static bool handleStatic(const QCString &) +static bool handleStatic(const QCString &, const QCStringList &) { endBrief(); current->stat = TRUE; return FALSE; } -static bool handlePure(const QCString &) +static bool handlePure(const QCString &, const QCStringList &) { endBrief(); current->virt = Pure; return FALSE; } -static bool handlePrivate(const QCString &) +static bool handlePrivate(const QCString &, const QCStringList &) { current->protection = Private; return FALSE; } -static bool handlePrivateSection(const QCString &) +static bool handlePrivateSection(const QCString &, const QCStringList &) { current->protection = protection = Private; return FALSE; } -static bool handleProtected(const QCString &) +static bool handleProtected(const QCString &, const QCStringList &) { current->protection = Protected; return FALSE; } -static bool handleProtectedSection(const QCString &) +static bool handleProtectedSection(const QCString &, const QCStringList &) { current->protection = protection = Protected ; return FALSE; } -static bool handlePublic(const QCString &) +static bool handlePublic(const QCString &, const QCStringList &) { current->protection = Public; return FALSE; } -static bool handlePublicSection(const QCString &) +static bool handlePublicSection(const QCString &, const QCStringList &) { current->protection = protection = Public; return FALSE; } -static bool handleToc(const QCString &) +static bool handleToc(const QCString &, const QCStringList &optList) { if (current->section==Entry::PAGEDOC_SEC || current->section==Entry::MAINPAGEDOC_SEC) { - current->stat=TRUE; // we 'abuse' stat to pass whether or the TOC is enabled + QCStringList::ConstIterator it; + for ( it = optList.begin(); it != optList.end(); ++it ) + { + QCString opt = (*it).stripWhiteSpace().lower(); + char dum; + int level = 5; + int i = opt.find(':'); + if (i>0) // found ':' but not on position 0 what would mean just a level + { + if (sscanf(opt.right(opt.length() - i - 1).data(),"%d%c",&level,&dum) != 1) + { + warn(yyFileName,yyLineNr,"Unknown option:level specified with \\tableofcontents: `%s'", (*it).stripWhiteSpace().data()); + opt = ""; + } + else + { + level = (level > 5 ? 5 : level); + level = (level <= 0 ? 5 : level); + opt = opt.left(i).stripWhiteSpace(); + } + } + if (!opt.isEmpty()) + { + if (opt == "html") + { + current->localToc.enableHtml(level); + } + else if (opt == "latex") + { + current->localToc.enableLatex(level); + } + else if (opt == "xml") + { + 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()); + } + } + } + if (current->localToc.nothingEnabled()) + { + // for backward compatibility + current->localToc.enableHtml(5); + current->localToc.enableXml(5); + } } return FALSE; } -static bool handleInherit(const QCString &) +static bool handleInherit(const QCString &, const QCStringList &) { BEGIN(InheritParam); return FALSE; } -static bool handleExtends(const QCString &) +static bool handleExtends(const QCString &, const QCStringList &) { BEGIN(ExtendsParam); return FALSE; } -static bool handleCopyBrief(const QCString &) +static bool handleCopyBrief(const QCString &, const QCStringList &) { if (current->brief.isEmpty() && current->doc.isEmpty()) { // if we don't have a brief or detailed description yet, @@ -2883,7 +3034,7 @@ static bool handleCopyBrief(const QCString &) return FALSE; } -static bool handleCopyDetails(const QCString &) +static bool handleCopyDetails(const QCString &, const QCStringList &) { setOutput(OutputDoc); if (!g_spaceBeforeCmd.isEmpty()) @@ -2895,7 +3046,7 @@ static bool handleCopyDetails(const QCString &) return FALSE; } -static bool handleCopyDoc(const QCString &) +static bool handleCopyDoc(const QCString &, const QCStringList &) { setOutput(OutputBrief); if (!g_spaceBeforeCmd.isEmpty()) @@ -2943,7 +3094,26 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, langParser = parser; current = curEntry; if (comment.isEmpty()) return FALSE; // avoid empty strings - inputString = comment; + if (Doxygen::markdownSupport) + { + inputString = processMarkdown(fileName,lineNr,NULL,comment); + const char *p = inputString.data(); + if (p) + { + while (*p==' ') p++; // skip over spaces + while (*p=='\n') p++; // skip over newlines + if (qstrncmp(p,"<br>",4)==0) p+=4; // skip over <br> + } + if (p>inputString.data()) + { + // strip part of the input + inputString = inputString.mid(p-inputString.data()); + } + } + else + { + inputString = comment; + } inputString.append(" "); inputPosition = position; yyLineNr = lineNr; @@ -2970,7 +3140,7 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, } Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\n" - "input=[\n%s]\n",qPrint(fileName),lineNr,qPrint(comment) + "input=[\n%s]\n",qPrint(fileName),lineNr,qPrint(inputString) ); commentscanYYrestart( commentscanYYin ); @@ -3008,15 +3178,9 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, openGroup(current,yyFileName,yyLineNr); } - if (Doxygen::markdownSupport) - { - current->brief = processMarkdown(fileName,lineNr,current,current->brief); - current->doc = processMarkdown(fileName,lineNr,current,current->doc); - current->inbodyDocs = processMarkdown(fileName,lineNr,current,current->inbodyDocs); - } - - Debug::print(Debug::CommentScan,0, - "brief=[line=%d\n%s]\ndocs=[line=%d\n%s]\ninbody=[line=%d\n%s]\n===========\n", + Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\noutput=[\n" + "brief=[line=%d\n%s]\ndocs=[line=%d\n%s]\ninbody=[line=%d\n%s]\n]\n===========\n", + qPrint(fileName),lineNr, current->briefLine,qPrint(current->brief), current->docLine,qPrint(current->doc), current->inbodyLine,qPrint(current->inbodyDocs) diff --git a/src/condparser.cpp b/src/condparser.cpp index 6c5d787..74e26bc 100644 --- a/src/condparser.cpp +++ b/src/condparser.cpp @@ -100,9 +100,10 @@ static bool isAlpha(const char c) return (c>='A' && c<='Z') || (c>='a' && c<='z') || c=='_'; } -static bool isAlphaNum(const char c) +static bool isAlphaNumSpec(const char c) { - return isAlpha(c) || (c>='0' && c<='9'); + return isAlpha(c) || (c>='0' && c<='9') || c=='-' || c=='.' || + (((unsigned char)c)>=0x80 && ((unsigned char)c)<=0xFF); } /** @@ -170,7 +171,7 @@ void CondParser::getToken() if (isAlpha(*m_e)) { m_tokenType = VARIABLE; - while (isAlphaNum(*m_e)) + while (isAlphaNumSpec(*m_e)) { m_token += *m_e++; } @@ -283,7 +284,7 @@ bool CondParser::parseVar() } /** - * evaluate an operator for given valuess + * evaluate an operator for given values */ bool CondParser::evalOperator(int opId, bool lhs, bool rhs) { 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 8426787..fdc562d 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>"..."</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 @@ -125,7 +125,7 @@ SEARCHENGINE = YES \endverbatim To regenerate the Qt-1.44 documentation from the sources, you could use the -following config file: +following configuration file: \verbatim PROJECT_NAME = Qt OUTPUT_DIRECTORY = qt_docs @@ -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 config 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> @@ -343,6 +343,19 @@ Go to the <a href="commands.html">next</a> section or return to the <value name='Ukrainian'/> <value name='Vietnamese'/> </option> + <option type='enum' id='OUTPUT_TEXT_DIRECTION' defval='None'> + <docs> +<![CDATA[ + The \c OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all + documentation generated by doxygen is written. Doxygen will use this + information to generate all generated output in the proper direction. +]]> + </docs> + <value name='None'/> + <value name='LTR'/> + <value name='RTL'/> + <value name='Context'/> + </option> <option type='bool' id='BRIEF_MEMBER_DESC' defval='1'> <docs> <![CDATA[ @@ -356,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> @@ -375,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'/> @@ -393,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. @@ -424,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> @@ -438,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> @@ -461,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.) ]]> @@ -521,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> @@ -552,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> @@ -563,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> @@ -580,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[ @@ -592,18 +639,18 @@ Go to the <a href="commands.html">next</a> section or return to the With this tag you can assign which parser to use for a given extension. 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, C#, C, C++, D, PHP, - Objective-C, Python, Fortran (fixed format Fortran: FortranFixed, + the parsers supported by doxygen: IDL, Java, Javascript, Csharp (C#), C, C++, D, PHP, + 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. + formatted code, this is the default for Fortran type files), VHDL, tcl. For instance to make doxygen treat <code>.inc</code> files as Fortran files (default is PHP), and <code>.f</code> files as C (default is Fortran), 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> @@ -611,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> @@ -633,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> @@ -663,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> @@ -676,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> @@ -708,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". @@ -727,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> @@ -740,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> @@ -753,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. ]]> @@ -771,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> @@ -786,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> @@ -794,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> @@ -810,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. ]]> @@ -820,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. @@ -841,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. @@ -852,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. @@ -872,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> @@ -904,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> @@ -915,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> @@ -923,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> @@ -931,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. ]]> @@ -940,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> @@ -993,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> @@ -1007,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> @@ -1016,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> @@ -1028,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> @@ -1037,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> @@ -1046,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> @@ -1055,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. ]]> @@ -1065,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. ]]> @@ -1117,14 +1164,16 @@ 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> <docs doxywizard='0' doxyfile='0'> <![CDATA[ +<br> +<br> Example of using a shell script as a filter for Unix: \verbatim FILE_VERSION_FILTER = "/bin/sh versionfilter.sh" @@ -1134,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 @@ -1144,7 +1193,7 @@ svn stat -v $1 | sed -n 's/^[ A-Z?\*|!]\{1,15\}/r/;s/ \{1,15\}/\/r/;s/ .*//p' <br> Example filter for ClearCase: \verbatim -FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" +FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn" \endverbatim ]]> </docs> @@ -1163,8 +1212,8 @@ FILE_VERSION_INFO = "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> @@ -1172,11 +1221,11 @@ FILE_VERSION_INFO = "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. @@ -1197,7 +1246,7 @@ FILE_VERSION_INFO = "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. @@ -1219,18 +1268,20 @@ FILE_VERSION_INFO = "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 documentation. + If \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES then this flag will + automatically be disabled. ]]> </docs> </option> @@ -1246,13 +1297,13 @@ FILE_VERSION_INFO = "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> @@ -1260,7 +1311,7 @@ FILE_VERSION_INFO = "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> @@ -1270,9 +1321,9 @@ FILE_VERSION_INFO = "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" @@ -1285,10 +1336,10 @@ FILE_VERSION_INFO = "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> @@ -1296,9 +1347,9 @@ FILE_VERSION_INFO = "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 @@ -1350,6 +1401,7 @@ FILE_VERSION_INFO = "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> @@ -1372,7 +1424,7 @@ FILE_VERSION_INFO = "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> @@ -1383,8 +1435,8 @@ FILE_VERSION_INFO = "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> @@ -1392,13 +1444,13 @@ FILE_VERSION_INFO = "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> @@ -1415,7 +1467,7 @@ FILE_VERSION_INFO = "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 @@ -1429,8 +1481,8 @@ FILE_VERSION_INFO = "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> @@ -1438,7 +1490,7 @@ FILE_VERSION_INFO = "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> @@ -1455,9 +1507,9 @@ FILE_VERSION_INFO = "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 @@ -1474,7 +1526,7 @@ FILE_VERSION_INFO = "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 @@ -1487,7 +1539,7 @@ FILE_VERSION_INFO = "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> @@ -1495,10 +1547,10 @@ FILE_VERSION_INFO = "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> @@ -1506,9 +1558,9 @@ FILE_VERSION_INFO = "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> @@ -1546,8 +1598,8 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" <docs> <![CDATA[ If the \c REFERENCED_BY_RELATION tag is set to \c YES - then for each documented function all documented - functions referencing it will be listed. + then for each documented entity all documented + functions referencing it will be listed. ]]> </docs> </option> @@ -1556,7 +1608,7 @@ FILE_VERSION_INFO = "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> @@ -1564,9 +1616,9 @@ FILE_VERSION_INFO = "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> @@ -1574,11 +1626,11 @@ FILE_VERSION_INFO = "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> @@ -1588,12 +1640,12 @@ 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 - -# Enable \ref cfg_source_browser "SOURCE_BROWSER" and \c USE_HTAGS in the config file + -# Enable \ref cfg_source_browser "SOURCE_BROWSER" and \c USE_HTAGS in the configuration file -# Make sure the \ref cfg_input "INPUT" points to the root of the source tree -# Run \c doxygen as normal <br> @@ -1619,28 +1671,28 @@ 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 - was generated with the `-Duse-libclang=ON` option for CMake. + was generated with the `-Duse_libclang=ON` option for CMake. ]]> </docs> </option> <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> </option> - <option type='string' id='CLANG_COMPILATION_DATABASE_PATH' setting='USE_LIBCLANG' defval='0'> + <option type='string' id='CLANG_DATABASE_PATH' setting='USE_LIBCLANG' defval=''> <docs> <![CDATA[ If clang assisted parsing is enabled you can provide the clang parser with the @@ -1650,7 +1702,7 @@ to disable this feature. will then be passed to the parser. @note The availability of this option depends on whether or not doxygen - was generated with the `-Duse-libclang=ON` option for CMake. + was generated with the `-Duse_libclang=ON` option for CMake. ]]> </docs> </option> @@ -1660,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> @@ -1668,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> @@ -1676,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> @@ -1705,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> @@ -1713,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 @@ -1732,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> @@ -1745,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") @@ -1753,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 @@ -1800,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> ]]> @@ -1817,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 @@ -1833,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> @@ -1851,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). @@ -1905,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> @@ -1918,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> @@ -1951,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> @@ -1961,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> @@ -1975,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> @@ -1997,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> @@ -2015,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> @@ -2025,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> @@ -2034,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> @@ -2051,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. @@ -2082,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. ]]> @@ -2100,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> @@ -2119,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> @@ -2150,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> @@ -2159,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> @@ -2167,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> @@ -2176,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> @@ -2184,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> @@ -2199,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. ]]> @@ -2216,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> @@ -2229,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> @@ -2253,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> @@ -2263,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. ]]> @@ -2281,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> @@ -2292,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> @@ -2300,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> @@ -2324,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. @@ -2334,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> @@ -2351,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 @@ -2362,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. ]]> @@ -2381,7 +2433,7 @@ MATHJAX_CODEFILE = disableRenderer.js MathJax.Hub.Config({ menuSettings: { showRenderer: false, - } + } }); \endverbatim ]]> @@ -2396,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> @@ -2421,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> @@ -2436,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. ]]> @@ -2452,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. ]]> @@ -2465,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> @@ -2475,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> @@ -2486,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> @@ -2513,28 +2565,43 @@ 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. ]]> </docs> </option> - <option type='string' id='LATEX_CMD_NAME' format='file' defval='latex' depends='GENERATE_LATEX'> + <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. - <br>Note that when enabling \ref cfg_use_pdflatex "USE_PDFLATEX" this option is only used for - generating bitmaps for formulas in the HTML output, but not in the - \c Makefile that is written to the output directory. + 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 + have been set differently, this depends on the implementation of the output language. ]]> </docs> </option> <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`. + \sa \ref cfg_latex_makeindex_cmd "LATEX_MAKEINDEX_CMD" for the part in the generated output file (`.tex`). +]]> + </docs> + </option> + <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 generate index for \f$\mbox{\LaTeX}\f$. + + @note This tag is used in the generated output file (`.tex`). + \sa \ref cfg_makeindex_cmd_name "MAKEINDEX_CMD_NAME" for the part in the `Makefile` / `make.bat`. ]]> </docs> </option> @@ -2562,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. @@ -2570,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: @@ -2584,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". ]]> @@ -2607,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> @@ -2622,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). @@ -2646,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. @@ -2659,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> @@ -2667,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> @@ -2678,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> @@ -2696,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. ]]> @@ -2713,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'> @@ -2759,7 +2836,7 @@ or <docs> <![CDATA[ Load stylesheet definitions from file. Syntax is similar to doxygen's - config file, i.e. a series of assignments. You only have to provide + configuration file, i.e. a series of assignments. You only have to provide replacements, missing definitions are set to their default value. <br> See also section \ref doxygen_usage for information on how to generate @@ -2772,8 +2849,8 @@ or <docs> <![CDATA[ Set optional variables used in the generation of an RTF document. - Syntax is similar to doxygen's config 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> @@ -2803,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> @@ -2831,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> @@ -2845,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> @@ -2868,12 +2945,21 @@ or ]]> </docs> </option> + <option type='bool' id='XML_NS_MEMB_FILE_SCOPE' defval='0' depends='GENERATE_XML'> + <docs> +<![CDATA[ + If the \c XML_NS_MEMB_FILE_SCOPE tag is set to \c YES, doxygen + will include namespace members in file scope as well, matching the HTML + output. +]]> + </docs> + </option> </group> <group name='Docbook' docs='Configuration options related to the DOCBOOK output'> <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> @@ -2881,8 +2967,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> @@ -2905,8 +2991,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> @@ -2924,8 +3010,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> @@ -2940,7 +3026,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. ]]> @@ -2949,28 +3035,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. ]]> @@ -2983,7 +3069,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> @@ -2991,7 +3077,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. ]]> @@ -3026,10 +3112,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> @@ -3039,7 +3125,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. @@ -3054,18 +3140,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> @@ -3074,25 +3160,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> @@ -3102,7 +3188,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> @@ -3128,9 +3214,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> @@ -3149,19 +3235,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> @@ -3169,9 +3255,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> @@ -3189,9 +3275,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> @@ -3199,11 +3285,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> @@ -3211,11 +3297,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> @@ -3230,8 +3316,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> @@ -3241,7 +3327,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> @@ -3276,10 +3362,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 @@ -3290,7 +3376,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> @@ -3299,7 +3385,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. @@ -3320,12 +3406,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> @@ -3333,12 +3419,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> @@ -3346,7 +3432,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> @@ -3354,7 +3440,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. @@ -3368,7 +3454,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). ]]> @@ -3390,10 +3476,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> @@ -3401,15 +3487,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). ]]> @@ -3418,7 +3504,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). ]]> @@ -3427,7 +3513,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). ]]> @@ -3436,9 +3522,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> @@ -3446,7 +3532,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> @@ -3455,16 +3541,16 @@ 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> <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 @@ -3475,7 +3561,7 @@ to be found in the default search path. <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 @@ -3489,12 +3575,12 @@ to be found in the default search path. <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/configgen.py b/src/configgen.py index 33857b7..ca2a5d1 100755 --- a/src/configgen.py +++ b/src/configgen.py @@ -272,7 +272,7 @@ def parseOption(node): print(" \"%s\"" % (line)) print(" );") if defval != '': - print(" cs->setDefaultValue(\"%s\");" % (defval)) + print(" cs->setDefaultValue(\"%s\");" % (defval.replace('\\','\\\\'))) if format == 'file': print(" cs->setWidgetType(ConfigString::File);") elif format == 'image': @@ -529,7 +529,7 @@ def parseOptionDoc(node, first): if defval != '': print("") print("The default value is: <code>%s</code>." % ( - defval)) + defval.replace('\\','\\\\'))) print("") # depends handling if (node.hasAttribute('depends')): 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..644250f 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) {} @@ -621,7 +712,7 @@ static void readIncludeFile(const char *incName) if (option==0) // oops not known { config_warn("ignoring unsupported tag `%s' at line %d, file %s\n", - yytext,yyLineNr,yyFileName.data()); + cmd.data(),yyLineNr,yyFileName.data()); BEGIN(SkipInvalid); } else // known tag @@ -697,7 +788,7 @@ static void readIncludeFile(const char *incName) if (option==0) // oops not known { config_warn("ignoring unsupported tag `%s' at line %d, file %s\n", - yytext,yyLineNr,yyFileName.data()); + cmd.data(),yyLineNr,yyFileName.data()); BEGIN(SkipInvalid); } else // known tag @@ -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 896c4e0..6b5d2ac 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -246,7 +246,6 @@ class PropertyMapper /** Add a property to the map * @param[in] name The name of the property to add. - * @param[in] obj The object handling access to the property. * @param[in] handle The method to call when the property is accessed. */ void addProperty(const char *name,typename PropertyFunc::Handler handle) @@ -262,6 +261,7 @@ class PropertyMapper } /** Gets the value of a property. + * @param[in] obj The object handling access to the property. * @param[in] name The name of the property. * @returns A variant representing the properties value or an * invalid variant if it was not found. @@ -617,7 +617,7 @@ class TranslateContext::Private TemplateVariant classes() const { return theTranslator->trClasses(); - // TODO: VHDL: trVhdlType(VhdlDocGen::ENTITY,FALSE) + // TODO: VHDL: theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE) // TODO: Fortran: trDataTypes() } TemplateVariant classList() const @@ -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"); @@ -927,13 +935,14 @@ class TranslateContext::Private { static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN); static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL); - return fortranOpt ? theTranslator->trSubprograms() : - vhdlOpt ? VhdlDocGen::trFunctionAndProc() : + return fortranOpt ? theTranslator->trSubprograms() : + vhdlOpt ? theTranslator->trFunctionAndProc() : theTranslator->trFunctions(); } 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()); @@ -2816,12 +2868,14 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri QCString title = theTranslator->trFunctions(); SrcLangExt lang = m_namespaceDef->getLanguage(); if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms(); - else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc(); + else if (lang==SrcLangExt_VHDL) title=theTranslator->trFunctionAndProc(); return getMemberList(getCache().functions,MemberListType_decFuncMembers,title); } 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()); @@ -3249,12 +3331,14 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> QCString title = theTranslator->trFunctions(); SrcLangExt lang = m_fileDef->getLanguage(); if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms(); - else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc(); + else if (lang==SrcLangExt_VHDL) title=theTranslator->trFunctionAndProc(); return getMemberList(getCache().functions,MemberListType_decFuncMembers,title); } 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(); @@ -5489,12 +5613,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private> QCString title = theTranslator->trFunctions(); SrcLangExt lang = m_groupDef->getLanguage(); if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms(); - else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc(); + else if (lang==SrcLangExt_VHDL) title=theTranslator->trFunctionAndProc(); return getMemberList(getCache().functions,MemberListType_decFuncMembers,title); } 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 { @@ -5828,7 +5954,7 @@ class ClassIndexContext::Private } else if (vhdlOpt) { - return VhdlDocGen::trDesignUnits(); + return theTranslator->trDesignUnits(); } else { @@ -6022,7 +6148,7 @@ class ClassHierarchyContext::Private static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL); if (vhdlOpt) { - return VhdlDocGen::trDesignUnitHierarchy(); + return theTranslator->trDesignUnitHierarchy(); } else { @@ -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) { @@ -6780,7 +6906,7 @@ class ClassTreeContext::Private } else if (vhdlOpt) { - return VhdlDocGen::trDesignUnitList(); + return theTranslator->trDesignUnitList(); } else { @@ -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..7e9ccca 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,38 @@ static int yyread(char *buf,int max_size) return c; } +/* bug_520975 */ +static bool nameIsActuallyPartOfType(QCString &name) +{ + static bool first=TRUE; + static QDict<void> keywords(17); + if (first) // fill keyword dict first time + { + #define DUMMY_ADDR (void*)0x8 + keywords.insert("unsigned", DUMMY_ADDR); // foo(... unsigned) + keywords.insert("signed", DUMMY_ADDR); // foo(... signed) + keywords.insert("bool", DUMMY_ADDR); // foo(... bool) + keywords.insert("char", DUMMY_ADDR); // foo(... char) + keywords.insert("char8_t", DUMMY_ADDR); // foo(... char8_t) + keywords.insert("char16_t", DUMMY_ADDR); // foo(... char16_t) + keywords.insert("char32_t", DUMMY_ADDR); // foo(... char32_t) + keywords.insert("int", DUMMY_ADDR); // foo(... int) + keywords.insert("short", DUMMY_ADDR); // foo(... short) + keywords.insert("long", DUMMY_ADDR); // foo(... long) + keywords.insert("float", DUMMY_ADDR); // foo(... float) + keywords.insert("double", DUMMY_ADDR); // foo(... double) + keywords.insert("int8_t", DUMMY_ADDR); // foo(... int8_t) + keywords.insert("uint8_t", DUMMY_ADDR); // foo(... uint8_t) + keywords.insert("int16_t", DUMMY_ADDR); // foo(... int16_t) + keywords.insert("uint16_t", DUMMY_ADDR); // foo(... uint16_t) + keywords.insert("int32_t", DUMMY_ADDR); // foo(... int32_t) + keywords.insert("uint32_t", DUMMY_ADDR); // foo(... uint32_t) + keywords.insert("const", DUMMY_ADDR); // foo(... const) + keywords.insert("volatile", DUMMY_ADDR); // foo(... volatile) + first=FALSE; + } + return name.length()>0 && keywords.find(name)!=0; +} %} B [ \t] @@ -384,10 +417,9 @@ 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" + nameIsActuallyPartOfType(a->name) ) - { + { a->type = a->type + " " + a->name; a->name.resize(0); } 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 ff30429..fbf5be8 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -41,6 +41,8 @@ #include "namespacedef.h" #include "filedef.h" #include "dirdef.h" +#include "pagedef.h" +#include "bufstr.h" #define START_MARKER 0x4445465B // DEF[ #define END_MARKER 0x4445465D // DEF] @@ -269,6 +271,7 @@ void Definition::removeFromMap(Definition *d) if (dl->isEmpty()) { Doxygen::symbolMap->take(symbolName); + delete dl; } } else // symbolName unique @@ -303,6 +306,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; @@ -714,6 +718,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 @@ -728,67 +865,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; @@ -802,16 +932,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 @@ -825,57 +955,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) - { - size_read=qstrlen(p); - } - else // nothing read + int i=0; + while ((c=*p++) && i<blockSize-1) { - size_read=-1; - lineStr[0]='\0'; + lineStr[i++]=c; + if (c=='\n') break; // stop at end of the line } - 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"; @@ -920,6 +1040,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(); @@ -944,11 +1065,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); @@ -956,6 +1081,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -974,6 +1103,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (!docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (!rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -986,6 +1119,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1008,6 +1145,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (!docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (!rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1020,6 +1161,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1034,15 +1179,19 @@ void Definition::writeSourceDef(OutputList &ol,const char *) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - if (!latexSourceCode) + ol.disableAllBut(OutputGenerator::Html); + if (latexSourceCode) { - ol.disable(OutputGenerator::Latex); + ol.enable(OutputGenerator::Latex); } - if (!rtfSourceCode) + if (docbookSourceCode) { - ol.disable(OutputGenerator::RTF); + ol.enable(OutputGenerator::Docbook); + } + if (rtfSourceCode) + { + ol.enable(OutputGenerator::RTF); } - ol.disableAllBut(OutputGenerator::Html); // write line link (HTML only) ol.writeObjectLink(0,fn,anchorStr,lineStr); ol.enableAll(); @@ -1051,6 +1200,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1144,6 +1297,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); @@ -1202,6 +1356,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); @@ -1220,6 +1378,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); @@ -1237,6 +1399,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); @@ -1254,6 +1420,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); @@ -1277,18 +1447,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 @@ -1475,13 +1639,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)); } } } @@ -1613,72 +1785,150 @@ void Definition::writeNavigationPath(OutputList &ol) const } // TODO: move to htmlgen -void Definition::writeToc(OutputList &ol) +void Definition::writeToc(OutputList &ol, const LocalToc &localToc) { SectionDict *sectionDict = m_impl->sectionDict; if (sectionDict==0) return; - ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); - ol.writeString("<div class=\"toc\">"); - ol.writeString("<h3>"); - ol.writeString(theTranslator->trRTFTableOfContents()); - ol.writeString("</h3>\n"); - ol.writeString("<ul>"); - SDict<SectionInfo>::Iterator li(*sectionDict); - SectionInfo *si; - int level=1,l; - char cs[2]; - cs[1]='\0'; - bool inLi[5]={ FALSE, FALSE, FALSE, FALSE }; - for (li.toFirst();(si=li.current());++li) - { - if (si->type==SectionInfo::Section || - si->type==SectionInfo::Subsection || - si->type==SectionInfo::Subsubsection || - si->type==SectionInfo::Paragraph) + if (localToc.isHtmlEnabled()) + { + int maxLevel = localToc.htmlLevel(); + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); + ol.writeString("<div class=\"toc\">"); + ol.writeString("<h3>"); + ol.writeString(theTranslator->trRTFTableOfContents()); + ol.writeString("</h3>\n"); + ol.writeString("<ul>"); + SDict<SectionInfo>::Iterator li(*sectionDict); + SectionInfo *si; + int level=1,l; + char cs[2]; + cs[1]='\0'; + bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; + for (li.toFirst();(si=li.current());++li) { - //printf(" level=%d title=%s\n",level,si->title.data()); - int nextLevel = (int)si->type; - if (nextLevel>level) + if (si->type==SectionInfo::Section || + si->type==SectionInfo::Subsection || + si->type==SectionInfo::Subsubsection || + si->type==SectionInfo::Paragraph) { - for (l=level;l<nextLevel;l++) + //printf(" level=%d title=%s\n",level,si->title.data()); + int nextLevel = (int)si->type; + if (nextLevel>level) { - ol.writeString("<ul>"); + for (l=level;l<nextLevel;l++) + { + if (l < maxLevel) ol.writeString("<ul>"); + } } + else if (nextLevel<level) + { + for (l=level;l>nextLevel;l--) + { + if (l <= maxLevel && inLi[l]) ol.writeString("</li>\n"); + inLi[l]=FALSE; + if (l <= maxLevel) ol.writeString("</ul>\n"); + } + } + cs[0]='0'+nextLevel; + if (nextLevel <= maxLevel && inLi[nextLevel]) ol.writeString("</li>\n"); + QCString titleDoc = convertToHtml(si->title); + if (nextLevel <= maxLevel) ol.writeString("<li class=\"level"+QCString(cs)+"\"><a href=\"#"+si->label+"\">"+(si->title.isEmpty()?si->label:titleDoc)+"</a>"); + inLi[nextLevel]=TRUE; + level = nextLevel; } - else if (nextLevel<level) + } + if (level > maxLevel) level = maxLevel; + while (level>1 && level <= maxLevel) + { + if (inLi[level]) ol.writeString("</li>\n"); + inLi[level]=FALSE; + ol.writeString("</ul>\n"); + level--; + } + if (level <= maxLevel && inLi[level]) ol.writeString("</li>\n"); + inLi[level]=FALSE; + ol.writeString("</ul>\n"); + ol.writeString("</div>\n"); + 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) { - for (l=level;l>nextLevel;l--) + //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) { - if (inLi[l]) ol.writeString("</li>\n"); - inLi[l]=FALSE; - ol.writeString("</ul>\n"); + QCString titleDoc = convertToDocBook(si->title); + ol.writeString(" <tocentry>" + (si->title.isEmpty()?si->label:titleDoc) + "</tocentry>\n"); } + inLi[nextLevel]=TRUE; + level = nextLevel; } - cs[0]='0'+nextLevel; - if (inLi[nextLevel]) ol.writeString("</li>\n"); - QCString titleDoc = convertToHtml(si->title); - ol.writeString("<li class=\"level"+QCString(cs)+"\"><a href=\"#"+si->label+"\">"+(si->title.isEmpty()?si->label:titleDoc)+"</a>"); - 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(); } - while (level>1) + + if (localToc.isLatexEnabled()) { - if (inLi[level]) ol.writeString("</li>\n"); - inLi[level]=FALSE; - ol.writeString("</ul>\n"); - level--; + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Latex); + int maxLevel = localToc.latexLevel(); + + ol.writeString("\\etocsetnexttocdepth{"+QCString().setNum(maxLevel)+"}\n"); + + ol.writeString("\\localtableofcontents\n"); + ol.popGeneratorState(); } - if (inLi[level]) ol.writeString("</li>\n"); - inLi[level]=FALSE; - ol.writeString("</ul>\n"); - ol.writeString("</div>\n"); - ol.popGeneratorState(); } //---------------------------------------------------------------------------------------- +SectionDict * Definition::getSectionDict(void) +{ + return m_impl->sectionDict; +} QCString Definition::symbolName() const { diff --git a/src/definition.h b/src/definition.h index d16c6b9..c0428a0 100644 --- a/src/definition.h +++ b/src/definition.h @@ -275,6 +275,9 @@ class Definition : public DefinitionIntf QCString id() const; + /** returns the section dictionary, only of importance for pagedef */ + SectionDict * getSectionDict(void); + //----------------------------------------------------------------------------------- // ---- setters ----- //----------------------------------------------------------------------------------- @@ -346,7 +349,7 @@ class Definition : public DefinitionIntf void setLocalName(const QCString name); void addSectionsToIndex(); - void writeToc(OutputList &ol); + void writeToc(OutputList &ol, const LocalToc <); void setCookie(Cookie *cookie) { delete m_cookie; m_cookie = cookie; } Cookie *cookie() const { return m_cookie; } diff --git a/src/diagram.cpp b/src/diagram.cpp index 42792ad..83e42b3 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -833,7 +833,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image, } ++rit; di=rit.current(); } - // add last horizonal line and a vertical connection line + // add last horizontal line and a vertical connection line if (bitmap) { if (doBase) // base classes @@ -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 b247ba7..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: @@ -930,14 +936,14 @@ void buildDirectories() for (;(fd=fni.current());++fni) { //printf("buildDirectories %s\n",fd->name().data()); - if (fd->getReference().isEmpty() && !fd->isDocumentationFile()) + if (fd->getReference().isEmpty()) { DirDef *dir; if ((dir=Doxygen::directories->find(fd->getPath()))==0) // new directory { dir = DirDef::mergeDirectoryInTree(fd->getPath()); } - if (dir) dir->addFile(fd); + if (dir && !fd->isDocumentationFile()) dir->addFile(fd); } else { 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 << "&"; col++; break; case '\'': t << "'"; col++; break; case '"': t << """; 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 << """; - } - else - { - t << "<"; - } - t << convertToXML(nm); - if (ii->local) - { - t << """; - } - else - { - t << ">"; - } - 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 << """; - } - else - { - t << "<"; - } - t << convertToXML(inc->includeName); - if (inc->local) - { - t << """; - } - else - { - t << ">"; - } - 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 ab10da0..99df99c 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> 
</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()) { @@ -196,6 +262,8 @@ void DocbookDocVisitor::visit(DocStyleChange *s) /* There is no equivalent Docbook tag for rendering Small text */ case DocStyleChange::Small: /* XSLT Stylesheets can be used */ break; /* HTML only */ + case DocStyleChange::Strike: break; + case DocStyleChange::Underline: break; case DocStyleChange::Div: /* HTML only */ break; case DocStyleChange::Span: /* HTML only */ break; } @@ -203,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()) @@ -215,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; @@ -230,7 +299,6 @@ void DocbookDocVisitor::visit(DocVerbatim *s) case DocVerbatim::XmlOnly: break; case DocVerbatim::DocbookOnly: - break; m_t << s->text(); break; case DocVerbatim::Dot: @@ -302,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()) @@ -343,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>"; @@ -391,6 +461,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) void DocbookDocVisitor::visit(DocIncOperator *op) { +DB_VIS_C if (op->isFirst()) { if (!m_hide) @@ -427,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()); @@ -460,6 +541,7 @@ void DocbookDocVisitor::visit(DocCite *cite) void DocbookDocVisitor::visitPre(DocAutoList *l) { +DB_VIS_C if (m_hide) return; if (l->isEnumList()) { @@ -473,6 +555,7 @@ void DocbookDocVisitor::visitPre(DocAutoList *l) void DocbookDocVisitor::visitPost(DocAutoList *l) { +DB_VIS_C if (m_hide) return; if (l->isEnumList()) { @@ -486,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>"; @@ -505,6 +591,7 @@ void DocbookDocVisitor::visitPre(DocPara *) void DocbookDocVisitor::visitPost(DocPara *) { +DB_VIS_C if (m_hide) return; m_t << "</para>"; m_t << endl; @@ -512,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()) { @@ -532,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: @@ -542,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: @@ -552,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: @@ -562,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: @@ -572,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: @@ -582,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: @@ -592,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: @@ -622,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: @@ -632,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: @@ -642,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: @@ -652,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>"; @@ -740,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"; @@ -754,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"; @@ -763,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; @@ -910,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 { @@ -921,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; @@ -961,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; @@ -1060,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; @@ -1114,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; @@ -1121,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>"; @@ -1133,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>"; @@ -1140,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 << " "; @@ -1153,6 +1511,7 @@ void DocbookDocVisitor::visitPost(DocInternalRef *) void DocbookDocVisitor::visitPre(DocCopy *) { +DB_VIS_C if (m_hide) return; // TODO: to be implemented } @@ -1160,6 +1519,7 @@ void DocbookDocVisitor::visitPre(DocCopy *) void DocbookDocVisitor::visitPost(DocCopy *) { +DB_VIS_C if (m_hide) return; // TODO: to be implemented } @@ -1167,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; @@ -1241,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) @@ -1249,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) @@ -1264,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) @@ -1289,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; @@ -1301,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) @@ -1309,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) @@ -1334,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; @@ -1346,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) @@ -1354,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) @@ -1380,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 25d4b0c..a5c0cc7 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -26,6 +26,7 @@ #include <qdict.h> #include <qregexp.h> #include <ctype.h> +#include <qcstringlist.h> #include "doxygen.h" #include "debug.h" @@ -54,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) @@ -146,6 +150,9 @@ struct DocParserContext static QStack<DocParserContext> g_parserStack; //--------------------------------------------------------------------------- +static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribList &tagHtmlAttribs); + +//--------------------------------------------------------------------------- static void docParserPushContext(bool saveParamInfo=TRUE) { //QCString indent; @@ -262,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; @@ -330,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 @@ -358,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)); @@ -369,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: " @@ -423,7 +431,7 @@ static void checkArgumentName(const QCString &name,bool isParam) } if (!found && isParam) { - //printf("member type=%d\n",memberDef->memberType()); + //printf("member type=%d\n",g_memberDef->memberType()); QCString scope=g_memberDef->getScopeString(); if (!scope.isEmpty()) scope+="::"; else scope=""; QCString inheritedFrom = ""; @@ -451,11 +459,12 @@ static void checkArgumentName(const QCString &name,bool isParam) } /*! Checks if the parameters that have been specified using \@param are - * indeed all parameters. + * indeed all parameters and that a parameter does not have multiple + * \@param blocks. * Must be called after checkArgumentName() has been called for each * argument. */ -static void checkUndocumentedParams() +static void checkUnOrMultipleDocumentedParams() { if (g_memberDef && g_hasParamCommand && Config_getBool(WARN_IF_DOC_ERROR)) { @@ -470,18 +479,37 @@ static void checkUndocumentedParams() bool found=FALSE; for (ali.toFirst();(a=ali.current());++ali) { + int count = 0; QCString argName = g_memberDef->isDefine() ? a->type : a->name; if (lang==SrcLangExt_Fortran) argName = argName.lower(); argName=argName.stripWhiteSpace(); + QCString aName = argName; if (argName.right(3)=="...") argName=argName.left(argName.length()-3); - if (g_memberDef->getLanguage()==SrcLangExt_Python && (argName=="self" || argName=="cls")) + if (lang==SrcLangExt_Python && (argName=="self" || argName=="cls")) { // allow undocumented self / cls parameter for Python } else if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a->docs.isEmpty()) { found = TRUE; - break; + } + else + { + QDictIterator<void> it1(g_paramsFound); + void *item1; + for (;(item1=it1.current());++it1) + { + if (argName == it1.currentKey()) count++; + } + } + if (count > 1) + { + warn_doc_error(g_memberDef->getDefFileName(), + g_memberDef->getDefLine(), + "argument '" + aName + + "' from the argument list of " + + QCString(g_memberDef->qualifiedName()) + + " has muliple @param documentation sections"); } } if (found) @@ -497,7 +525,7 @@ static void checkUndocumentedParams() QCString argName = g_memberDef->isDefine() ? a->type : a->name; if (lang==SrcLangExt_Fortran) argName = argName.lower(); argName=argName.stripWhiteSpace(); - if (g_memberDef->getLanguage()==SrcLangExt_Python && (argName=="self" || argName=="cls")) + if (lang==SrcLangExt_Python && (argName=="self" || argName=="cls")) { // allow undocumented self / cls parameter for Python } @@ -842,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 @@ -852,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) { @@ -877,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 @@ -893,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; @@ -1027,16 +1071,18 @@ const char *DocStyleChange::styleString() const { switch (m_style) { - case DocStyleChange::Bold: return "b"; - case DocStyleChange::Italic: return "em"; - case DocStyleChange::Code: return "code"; - case DocStyleChange::Center: return "center"; - case DocStyleChange::Small: return "small"; - case DocStyleChange::Subscript: return "subscript"; - case DocStyleChange::Superscript: return "superscript"; - case DocStyleChange::Preformatted: return "pre"; + case DocStyleChange::Bold: return "b"; + case DocStyleChange::Italic: return "em"; + case DocStyleChange::Code: return "code"; + case DocStyleChange::Center: return "center"; + case DocStyleChange::Small: return "small"; + case DocStyleChange::Subscript: return "subscript"; + case DocStyleChange::Superscript: return "superscript"; + case DocStyleChange::Preformatted: return "pre"; case DocStyleChange::Div: return "div"; case DocStyleChange::Span: return "span"; + case DocStyleChange::Strike: return "strike"; + case DocStyleChange::Underline: return "u"; } return "<invalid>"; } @@ -1271,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 @@ -1343,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))); @@ -1354,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: @@ -1405,6 +1439,9 @@ reparsetoken: case CMD_MINUS: children.append(new DocSymbol(parent,DocSymbol::Sym_Minus)); break; + case CMD_EQUAL: + children.append(new DocSymbol(parent,DocSymbol::Sym_Equal)); + break; case CMD_EMPHASIS: { children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,TRUE)); @@ -1538,6 +1575,9 @@ reparsetoken: doctokenizerYYsetStatePara(); } break; + case CMD_IMAGE: + ((DocPara *)parent) -> handleImage("image"); + break; default: return FALSE; } @@ -1562,6 +1602,26 @@ reparsetoken: handleStyleLeave(parent,children,DocStyleChange::Bold,tokenName); } break; + case HTML_STRIKE: + if (!g_token->endTag) + { + handleStyleEnter(parent,children,DocStyleChange::Strike,&g_token->attribs); + } + else + { + handleStyleLeave(parent,children,DocStyleChange::Strike,tokenName); + } + break; + case HTML_UNDERLINE: + if (!g_token->endTag) + { + handleStyleEnter(parent,children,DocStyleChange::Underline,&g_token->attribs); + } + else + { + handleStyleLeave(parent,children,DocStyleChange::Underline,tokenName); + } + break; case HTML_CODE: case XML_C: if (!g_token->endTag) @@ -1623,6 +1683,10 @@ reparsetoken: handleStyleLeave(parent,children,DocStyleChange::Small,tokenName); } break; + case HTML_IMG: + if (!g_token->endTag) + handleImg(parent,children,g_token->attribs); + break; default: return FALSE; break; @@ -1700,7 +1764,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; } @@ -1721,6 +1786,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(len-1)!=':') locSymName.append(":"); + if (locSymName.at(0)!=':') locSymName.prepend(":"); + } + 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) { @@ -1850,11 +1936,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) @@ -1869,6 +1952,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); @@ -2280,21 +2367,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(); @@ -2342,7 +2415,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)) { @@ -2422,21 +2495,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"); } } @@ -2580,19 +2639,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; } } @@ -2703,7 +2753,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: @@ -2719,13 +2771,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; @@ -2903,21 +2955,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(); @@ -2935,10 +2973,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; } @@ -2964,10 +3002,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); @@ -3042,17 +3076,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); } } } @@ -3084,16 +3113,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 @@ -3108,8 +3128,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; } } @@ -3242,29 +3261,32 @@ 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; + case CMD_EQUAL: 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", @@ -3330,14 +3352,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); @@ -3354,8 +3368,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; } } @@ -3485,14 +3498,34 @@ DocHtmlCell::Alignment DocHtmlCell::alignment() const { HtmlAttribList attrs = attribs(); uint i; - for (i=0; i<attrs.count(); ++i) + for (i=0; i<attrs.count(); ++i) { if (attrs.at(i)->name.lower()=="align") { - if (attrs.at(i)->value.lower()=="center") + if (attrs.at(i)->value.lower()=="center") + return Center; + else if (attrs.at(i)->value.lower()=="right") + return Right; + else return Left; + } + else if (attrs.at(i)->name.lower()=="class") + { + if (attrs.at(i)->value.lower()=="markdowntableheadcenter") + return Center; + else if (attrs.at(i)->value.lower()=="markdowntableheadright") + return Right; + else if (attrs.at(i)->value.lower()=="markdowntableheadleft") + return Left; + else if (attrs.at(i)->value.lower()=="markdowntableheadnone") + return Center; + else if (attrs.at(i)->value.lower()=="markdowntablebodycenter") return Center; - else if (attrs.at(i)->value.lower()=="right") + else if (attrs.at(i)->value.lower()=="markdowntablebodyright") return Right; + else if (attrs.at(i)->value.lower()=="markdowntablebodyleft") + return Left; + else if (attrs.at(i)->value.lower()=="markdowntablebodynone") + return Left; else return Left; } } @@ -3849,7 +3882,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; @@ -3860,7 +3895,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 @@ -3869,7 +3904,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 @@ -3890,7 +3925,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 @@ -3899,7 +3934,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 @@ -3918,13 +3953,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: @@ -3965,7 +4000,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; } @@ -4470,21 +4505,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(); @@ -4940,6 +4961,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(); @@ -5017,25 +5067,64 @@ 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", - qPrint(cmdName)); - return; + 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; + } } tok=doctokenizerYYlex(); if (tok!=TK_WORD && tok!=TK_LNKWORD) { warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s", - tokToString(tok),qPrint(cmdName)); + tokToString(tok),qPrint(saveCmdName)); return; } tok=doctokenizerYYlex(); if (tok!=TK_WHITESPACE) { warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command", - qPrint(cmdName)); + qPrint(saveCmdName)); return; } DocImage::Type t; @@ -5046,9 +5135,9 @@ void DocPara::handleImage(const QCString &cmdName) else if (imgType=="rtf") t=DocImage::Rtf; else { - warn_doc_error(g_fileName,doctokenizerYYlineno,"image type %s specified as the first argument of " - "%s is not valid", - qPrint(imgType),qPrint(cmdName)); + warn_doc_error(g_fileName,doctokenizerYYlineno,"output format %s specified as the first argument of " + "%s command is not valid", + qPrint(imgType),qPrint(saveCmdName)); return; } doctokenizerYYsetStateFile(); @@ -5057,11 +5146,11 @@ void DocPara::handleImage(const QCString &cmdName) if (tok!=TK_WORD) { warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s", - tokToString(tok),qPrint(cmdName)); + tokToString(tok),qPrint(saveCmdName)); 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(); } @@ -5155,7 +5244,40 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t) { DBG(("handleInclude(%s)\n",qPrint(cmdName))); int tok=doctokenizerYYlex(); - if (tok!=TK_WHITESPACE) + bool isBlock = false; + if (tok==TK_WORD && g_token->name=="{") + { + doctokenizerYYsetStateOptions(); + tok=doctokenizerYYlex(); + doctokenizerYYsetStatePara(); + QCStringList optList=QCStringList::split(",",g_token->name); + if (t==DocInclude::Include && optList.contains("lineno")) + { + t = DocInclude::IncWithLines; + } + else if (t==DocInclude::Snippet && optList.contains("lineno")) + { + t = DocInclude::SnipWithLines; + } + else if (t==DocInclude::Include && optList.contains("doc")) + { + t = DocInclude::IncludeDoc; + } + else if (t==DocInclude::Snippet && optList.contains("doc")) + { + t = DocInclude::SnippetDoc; + } + 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", qPrint(cmdName)); @@ -5213,7 +5335,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(); } @@ -5319,7 +5441,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; @@ -5327,6 +5449,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: @@ -5398,6 +5521,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_MINUS: m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus)); break; + case CMD_EQUAL: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Equal)); + break; case CMD_SA: g_inSeeBlock=TRUE; retval = handleSimpleSection(DocSimpleSect::See); @@ -5593,7 +5719,8 @@ int DocPara::handleCommand(const QCString &cmdName) defaultHandleTitleAndSize(CMD_STARTUML,dv,dv->children(),width,height); doctokenizerYYsetStatePlantUML(); retval = doctokenizerYYlex(); - dv->setText(g_token->verb); + int line=0; + dv->setText(stripLeadingAndTrailingEmptyLines(g_token->verb,line)); dv->setWidth(width); dv->setHeight(height); if (jarPath.isEmpty()) @@ -5750,6 +5877,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); @@ -5863,6 +5993,12 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta case HTML_BOLD: handleStyleEnter(this,m_children,DocStyleChange::Bold,&g_token->attribs); break; + case HTML_STRIKE: + handleStyleEnter(this,m_children,DocStyleChange::Strike,&g_token->attribs); + break; + case HTML_UNDERLINE: + handleStyleEnter(this,m_children,DocStyleChange::Underline,&g_token->attribs); + break; case HTML_CODE: if (/*getLanguageFromFileName(g_fileName)==SrcLangExt_CSharp ||*/ g_xmlComment) // for C# source or inside a <summary> or <remark> section we @@ -6125,16 +6261,15 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta } } } - else if (findAttribute(tagHtmlAttribs,"langword",&cref)) // <see langword="..."/> or <see langworld="..."></see> + else if (findAttribute(tagHtmlAttribs,"langword",&cref)) // <see langword="..."/> or <see langword="..."></see> { - doctokenizerYYsetStatePara(); - DocLink *lnk = new DocLink(this,cref); - m_children.append(lnk); - QCString leftOver = lnk->parse(FALSE,TRUE); - if (!leftOver.isEmpty()) - { - m_children.append(new DocWord(this,leftOver)); - } + bool inSeeBlock = g_inSeeBlock; + g_token->name = cref; + g_inSeeBlock = TRUE; + m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,TRUE)); + handleLinkedWord(this,m_children,TRUE); + m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,FALSE)); + g_inSeeBlock = inSeeBlock; } else { @@ -6273,6 +6408,12 @@ int DocPara::handleHtmlEndTag(const QCString &tagName) case HTML_BOLD: handleStyleLeave(this,m_children,DocStyleChange::Bold,"b"); break; + case HTML_STRIKE: + handleStyleLeave(this,m_children,DocStyleChange::Strike,"strike"); + break; + case HTML_UNDERLINE: + handleStyleLeave(this,m_children,DocStyleChange::Underline,"u"); + break; case HTML_CODE: handleStyleLeave(this,m_children,DocStyleChange::Code,"code"); break; @@ -6416,8 +6557,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))); @@ -6515,7 +6656,7 @@ reparsetoken: } else // other section { - tok = TK_COMMAND; + tok = TK_COMMAND_BS; } DBG(("reparsing command %s\n",qPrint(g_token->name))); goto reparsetoken; @@ -6560,7 +6701,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); @@ -6596,7 +6739,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 @@ -6614,7 +6757,7 @@ reparsetoken: } else // other section { - tok = TK_COMMAND; + tok = TK_COMMAND_BS; } DBG(("reparsing command %s\n",qPrint(g_token->name))); goto reparsetoken; @@ -6886,7 +7029,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: @@ -6937,6 +7082,9 @@ void DocText::parse() case CMD_MINUS: m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus)); break; + case CMD_EQUAL: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Equal)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command `%s' found", qPrint(g_token->name)); @@ -7232,8 +7380,129 @@ static QCString processCopyDoc(const char *data,uint &len) buf.addChar(0); return buf.get(); } +//--------------------------------------------------------------------------- +QString::Direction getTextDirByConfig(const QString &text) +{ + QCString configDir = Config_getEnum(OUTPUT_TEXT_DIRECTION); + if (configDir == "None") + return QString::DirNeutral; + if (configDir == "Context") + return text.basicDirection(); + if (configDir == "LTR") + { + QString::Direction textDir = text.direction(); + if (textDir == QString::DirMixed) + return QString::DirLTR; + return textDir; + } + if (configDir == "RTL") + { + QString::Direction textDir = text.direction(); + if (textDir == QString::DirMixed) + return QString::DirRTL; + return textDir; + } + return QString::DirNeutral; +} -//-------------------------------------------------------------------------- +QString::Direction getTextDirByConfig(const DocNode *node) +{ + QCString configDir = Config_getEnum(OUTPUT_TEXT_DIRECTION); + if (configDir == "None") + return QString::DirNeutral; + if (configDir == "Context") + return node->getTextBasicDir(); + if (configDir == "LTR") + { + QString::Direction textDir = node->getTextDir(); + if (textDir == QString::DirMixed) + return QString::DirLTR; + return textDir; + } + if (configDir == "RTL") + { + QString::Direction textDir = node->getTextDir(); + if (textDir == QString::DirMixed) + return QString::DirRTL; + return textDir; + } + return QString::DirNeutral; +} + +QString::Direction getTextDirByConfig(const DocPara *para, int nodeIndex) +{ + QCString configDir = Config_getEnum(OUTPUT_TEXT_DIRECTION); + if (configDir == "None") + return QString::DirNeutral; + if (configDir == "Context") + return para->getTextBasicDir(nodeIndex); + if (configDir == "LTR") + { + QString::Direction textDir = para->getTextDir(nodeIndex); + if (textDir == QString::DirMixed) + return QString::DirLTR; + return textDir; + } + if (configDir == "RTL") + { + QString::Direction textDir = para->getTextDir(nodeIndex); + if (textDir == QString::DirMixed) + return QString::DirRTL; + return textDir; + } + return QString::DirNeutral; +} + +QCString getDirHtmlClassOfNode(QString::Direction textDir, const QCString &initValue) +{ + QCString classFromDir; + if (textDir == QString::DirLTR) + classFromDir = "DocNodeLTR"; + else if (textDir == QString::DirRTL) + classFromDir = "DocNodeRTL"; + else + classFromDir = ""; + + if (initValue && !classFromDir.isEmpty()) + return QCString(" class=\"") + initValue + " " + classFromDir + "\""; + if (initValue) + return QCString(" class=\"") + initValue + "\""; + if (!classFromDir.isEmpty()) + return QCString(" class=\"") + classFromDir + "\""; + return ""; +} + +QCString getDirHtmlClassOfPage(QCString pageTitle) +{ + QCString result = ""; + result += " class=\"PageDoc"; + QString::Direction titleDir = getTextDirByConfig(pageTitle); + if (titleDir == QString::DirLTR) + result += " PageDocLTR-title"; + else if (titleDir == QString::DirRTL) + result += " PageDocRTL-title"; + result += "\""; + return result; +} + +QCString getHtmlDirEmbedingChar(QString::Direction textDir) +{ + if (textDir == QString::DirLTR) + return "‪"; + if (textDir == QString::DirRTL) + return "‫"; + return ""; +} + +QCString getJsDirEmbedingChar(QString::Direction textDir) +{ + if (textDir == QString::DirLTR) + return "\\u202A"; + if (textDir == QString::DirRTL) + return "\\u202B"; + return ""; +} +//--------------------------------------------------------------------------- DocRoot *validatingParseDoc(const char *fileName,int startLine, Definition *ctx,MemberDef *md, @@ -7420,7 +7689,7 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine, delete v; } - checkUndocumentedParams(); + checkUnOrMultipleDocumentedParams(); detectNoDocumentedParams(); // TODO: These should be called at the end of the program. diff --git a/src/docparser.h b/src/docparser.h index 02c727d..ca32b20 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -34,6 +34,14 @@ class MemberGroup; 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 QCString &initValue=""); +QCString getDirHtmlClassOfPage(QCString pageTitle); +QCString getHtmlDirEmbedingChar(QString::Direction textDir); +QCString getJsDirEmbedingChar(QString::Direction textDir); +//--------------------------------------------------------------------------- /*! Main entry point for the documentation parser. @@ -132,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) {} @@ -157,6 +166,9 @@ class DocNode /*! Returns TRUE iff this node is inside a preformatted section */ bool isPreformatted() const { return m_insidePre; } + virtual QString::Direction getTextDir() const { return QString::DirNeutral; } + virtual QString::Direction getTextBasicDir() const { return QString::DirNeutral; } + protected: /*! Sets whether or not this item is inside a preformatted section */ void setInsidePreformatted(bool p) { m_insidePre = p; } @@ -169,13 +181,13 @@ class DocNode /** Default accept implementation for compound nodes in the abstract * syntax tree. */ -template<class T> class CompAccept +template<class T> class CompAccept : public DocNode { public: CompAccept() { m_children.setAutoDelete(TRUE); } - virtual ~CompAccept() {} - void accept(T *obj, DocVisitor *v) - { + void accept(DocVisitor *v) + { + T *obj = dynamic_cast<T *>(this); v->visitPre(obj); QListIterator<DocNode> cli(m_children); DocNode *n; @@ -184,6 +196,38 @@ template<class T> class CompAccept } const QList<DocNode> &children() const { return m_children; } QList<DocNode> &children() { return m_children; } + QString::Direction getTextDir(int nodeIndex) const + { + unsigned char resultDir = QString::DirNeutral; + for (uint i = nodeIndex; i < m_children.count(); i++) + { + DocNode* node = m_children.at(i); + QString::Direction nodeDir = node->getTextDir(); + resultDir |= nodeDir; + if (resultDir == QString::DirMixed) + return QString::DirMixed; + } + return static_cast<QString::Direction>(resultDir); + } + QString::Direction getTextBasicDir(int nodeIndex) const + { + for (uint i = nodeIndex; i < m_children.count(); i++) + { + DocNode* node = m_children.at(i); + QString::Direction nodeDir = node->getTextBasicDir(); + if (nodeDir != QString::DirNeutral) + return nodeDir; + } + return QString::DirNeutral; + } + virtual QString::Direction getTextDir() const + { + return getTextDir(0); + } + virtual QString::Direction getTextBasicDir() const + { + return getTextBasicDir(0); + } protected: QList<DocNode> m_children; @@ -199,6 +243,8 @@ class DocWord : public DocNode QCString word() const { return m_word; } Kind kind() const { return Kind_Word; } void accept(DocVisitor *v) { v->visit(this); } + virtual QString::Direction getTextDir() const { return QString(word()).direction(); }; + virtual QString::Direction getTextBasicDir() const { return QString(word()).basicDirection(); }; private: QCString m_word; @@ -220,6 +266,8 @@ class DocLinkedWord : public DocNode QCString anchor() const { return m_anchor; } QCString tooltip() const { return m_tooltip; } void accept(DocVisitor *v) { v->visit(this); } + virtual QString::Direction getTextDir() const { return QString(word()).direction(); }; + virtual QString::Direction getTextBasicDir() const { return QString(word()).basicDirection(); }; private: QCString m_word; @@ -230,7 +278,7 @@ class DocLinkedWord : public DocNode QCString m_tooltip; }; -/** Node representing an URL (or email address) */ +/** Node representing a URL (or email address) */ class DocURL : public DocNode { public: @@ -240,6 +288,8 @@ class DocURL : public DocNode Kind kind() const { return Kind_URL; } void accept(DocVisitor *v) { v->visit(this); } bool isEmail() const { return m_isEmail; } + virtual QString::Direction getTextDir() const { return QString::DirLTR; }; + virtual QString::Direction getTextBasicDir() const { return QString::DirLTR; }; private: QCString m_url; @@ -257,7 +307,7 @@ class DocLineBreak : public DocNode private: }; -/** Node representing a horizonal ruler */ +/** Node representing a horizontal ruler */ class DocHorRuler : public DocNode { public: @@ -318,7 +368,9 @@ class DocStyleChange : public DocNode Superscript = (1<<6), Preformatted = (1<<7), Span = (1<<8), - Div = (1<<9) + Div = (1<<9), + Strike = (1<<10), + Underline = (1<<11) }; DocStyleChange(DocNode *parent,uint position,Style s,bool enable, @@ -403,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, Sym_Equal }; enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut, Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde, @@ -424,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 { @@ -431,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; @@ -488,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('.'); @@ -506,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(); @@ -515,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; }; @@ -616,7 +685,7 @@ class DocCopy : public DocNode }; /** Node representing an auto List */ -class DocAutoList : public CompAccept<DocAutoList>, public DocNode +class DocAutoList : public CompAccept<DocAutoList> { public: DocAutoList(DocNode *parent,int indent,bool isEnumList,int depth); @@ -624,7 +693,6 @@ class DocAutoList : public CompAccept<DocAutoList>, public DocNode bool isEnumList() const { return m_isEnumList; } int indent() const { return m_indent; } int depth() const { return m_depth; } - void accept(DocVisitor *v) { CompAccept<DocAutoList>::accept(this,v); } int parse(); private: @@ -634,13 +702,12 @@ class DocAutoList : public CompAccept<DocAutoList>, public DocNode }; /** Node representing an item of a auto list */ -class DocAutoListItem : public CompAccept<DocAutoListItem>, public DocNode +class DocAutoListItem : public CompAccept<DocAutoListItem> { public: DocAutoListItem(DocNode *parent,int indent,int num); Kind kind() const { return Kind_AutoListItem; } int itemNumber() const { return m_itemNum; } - void accept(DocVisitor *v) { CompAccept<DocAutoListItem>::accept(this,v); } int parse(); private: @@ -651,20 +718,20 @@ class DocAutoListItem : public CompAccept<DocAutoListItem>, public DocNode /** Node representing a simple section title */ -class DocTitle : public CompAccept<DocTitle>, public DocNode +class DocTitle : public CompAccept<DocTitle> { public: DocTitle(DocNode *parent) { m_parent = parent; } void parse(); void parseFromString(const QCString &title); Kind kind() const { return Kind_Title; } - void accept(DocVisitor *v) { CompAccept<DocTitle>::accept(this,v); } + bool hasTitle() const { return !m_children.isEmpty(); } private: }; /** Node representing an item of a cross-referenced list */ -class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode +class DocXRefItem : public CompAccept<DocXRefItem> { public: DocXRefItem(DocNode *parent,int id,const char *key); @@ -674,7 +741,6 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode QCString title() const { return m_title; } QCString relPath() const { return m_relPath; } QCString key() const { return m_key; } - void accept(DocVisitor *v) { CompAccept<DocXRefItem>::accept(this,v); } bool parse(); private: @@ -687,12 +753,12 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode }; /** Node representing an image */ -class DocImage : public CompAccept<DocImage>, public DocNode +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; } @@ -701,8 +767,8 @@ class DocImage : public CompAccept<DocImage>, public DocNode 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 accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); } void parse(); private: @@ -713,10 +779,11 @@ class DocImage : public CompAccept<DocImage>, public DocNode QCString m_height; QCString m_relPath; QCString m_url; + bool m_inlineImage; }; /** Node representing a dot file */ -class DocDotFile : public CompAccept<DocDotFile>, public DocNode +class DocDotFile : public CompAccept<DocDotFile> { public: DocDotFile(DocNode *parent,const QCString &name,const QCString &context); @@ -729,7 +796,6 @@ class DocDotFile : public CompAccept<DocDotFile>, public DocNode QCString width() const { return m_width; } QCString height() const { return m_height; } QCString context() const { return m_context; } - void accept(DocVisitor *v) { CompAccept<DocDotFile>::accept(this,v); } private: QCString m_name; QCString m_file; @@ -740,7 +806,7 @@ class DocDotFile : public CompAccept<DocDotFile>, public DocNode }; /** Node representing a msc file */ -class DocMscFile : public CompAccept<DocMscFile>, public DocNode +class DocMscFile : public CompAccept<DocMscFile> { public: DocMscFile(DocNode *parent,const QCString &name,const QCString &context); @@ -753,7 +819,6 @@ class DocMscFile : public CompAccept<DocMscFile>, public DocNode QCString width() const { return m_width; } QCString height() const { return m_height; } QCString context() const { return m_context; } - void accept(DocVisitor *v) { CompAccept<DocMscFile>::accept(this,v); } private: QCString m_name; QCString m_file; @@ -764,7 +829,7 @@ class DocMscFile : public CompAccept<DocMscFile>, public DocNode }; /** Node representing a dia file */ -class DocDiaFile : public CompAccept<DocDiaFile>, public DocNode +class DocDiaFile : public CompAccept<DocDiaFile> { public: DocDiaFile(DocNode *parent,const QCString &name,const QCString &context); @@ -777,7 +842,6 @@ class DocDiaFile : public CompAccept<DocDiaFile>, public DocNode QCString width() const { return m_width; } QCString height() const { return m_height; } QCString context() const { return m_context; } - void accept(DocVisitor *v) { CompAccept<DocDiaFile>::accept(this,v); } private: QCString m_name; QCString m_file; @@ -788,19 +852,18 @@ class DocDiaFile : public CompAccept<DocDiaFile>, public DocNode }; /** Node representing a VHDL flow chart */ -class DocVhdlFlow : public CompAccept<DocVhdlFlow>, public DocNode +class DocVhdlFlow : public CompAccept<DocVhdlFlow> { public: DocVhdlFlow(DocNode *parent); void parse(); Kind kind() const { return Kind_VhdlFlow; } bool hasCaption() { return !m_children.isEmpty(); } - void accept(DocVisitor *v) { CompAccept<DocVhdlFlow>::accept(this,v); } private: }; /** Node representing a link to some item */ -class DocLink : public CompAccept<DocLink>, public DocNode +class DocLink : public CompAccept<DocLink> { public: DocLink(DocNode *parent,const QCString &target); @@ -810,7 +873,6 @@ class DocLink : public CompAccept<DocLink>, public DocNode QCString relPath() const { return m_relPath; } QCString ref() const { return m_ref; } QCString anchor() const { return m_anchor; } - void accept(DocVisitor *v) { CompAccept<DocLink>::accept(this,v); } private: QCString m_file; @@ -821,7 +883,7 @@ class DocLink : public CompAccept<DocLink>, public DocNode }; /** Node representing a reference to some item */ -class DocRef : public CompAccept<DocRef>, public DocNode +class DocRef : public CompAccept<DocRef> { public: DocRef(DocNode *parent,const QCString &target,const QCString &context); @@ -837,7 +899,6 @@ class DocRef : public CompAccept<DocRef>, public DocNode bool refToSection() const { return m_refType==Section; } bool refToTable() const { return m_refType==Table; } bool isSubPage() const { return m_isSubPage; } - void accept(DocVisitor *v) { CompAccept<DocRef>::accept(this,v); } private: enum RefType { Unknown, Anchor, Section, Table }; @@ -851,7 +912,7 @@ class DocRef : public CompAccept<DocRef>, public DocNode }; /** Node representing an internal reference to some item */ -class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode +class DocInternalRef : public CompAccept<DocInternalRef> { public: DocInternalRef(DocNode *parent,const QCString &target); @@ -860,7 +921,6 @@ class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode QCString file() const { return m_file; } QCString relPath() const { return m_relPath; } QCString anchor() const { return m_anchor; } - void accept(DocVisitor *v) { CompAccept<DocInternalRef>::accept(this,v); } private: QCString m_file; @@ -869,7 +929,7 @@ class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode }; /** Node representing a Hypertext reference */ -class DocHRef : public CompAccept<DocHRef>, public DocNode +class DocHRef : public CompAccept<DocHRef> { public: DocHRef(DocNode *parent,const HtmlAttribList &attribs,const QCString &url, @@ -879,7 +939,6 @@ class DocHRef : public CompAccept<DocHRef>, public DocNode QCString url() const { return m_url; } QCString relPath() const { return m_relPath; } Kind kind() const { return Kind_HRef; } - void accept(DocVisitor *v) { CompAccept<DocHRef>::accept(this,v); } const HtmlAttribList &attribs() const { return m_attribs; } private: @@ -889,7 +948,7 @@ class DocHRef : public CompAccept<DocHRef>, public DocNode }; /** Node Html heading */ -class DocHtmlHeader : public CompAccept<DocHtmlHeader>, public DocNode +class DocHtmlHeader : public CompAccept<DocHtmlHeader> { public: DocHtmlHeader(DocNode *parent,const HtmlAttribList &attribs,int level) : @@ -897,7 +956,6 @@ class DocHtmlHeader : public CompAccept<DocHtmlHeader>, public DocNode int level() const { return m_level; } Kind kind() const { return Kind_HtmlHeader; } const HtmlAttribList &attribs() const { return m_attribs; } - void accept(DocVisitor *v) { CompAccept<DocHtmlHeader>::accept(this,v); } int parse(); private: @@ -906,14 +964,13 @@ class DocHtmlHeader : public CompAccept<DocHtmlHeader>, public DocNode }; /** Node representing a Html description item */ -class DocHtmlDescTitle : public CompAccept<DocHtmlDescTitle>, public DocNode +class DocHtmlDescTitle : public CompAccept<DocHtmlDescTitle> { public: DocHtmlDescTitle(DocNode *parent,const HtmlAttribList &attribs) : m_attribs(attribs) { m_parent = parent; } Kind kind() const { return Kind_HtmlDescTitle; } const HtmlAttribList &attribs() const { return m_attribs; } - void accept(DocVisitor *v) { CompAccept<DocHtmlDescTitle>::accept(this,v); } int parse(); private: @@ -921,14 +978,13 @@ class DocHtmlDescTitle : public CompAccept<DocHtmlDescTitle>, public DocNode }; /** Node representing a Html description list */ -class DocHtmlDescList : public CompAccept<DocHtmlDescList>, public DocNode +class DocHtmlDescList : public CompAccept<DocHtmlDescList> { public: DocHtmlDescList(DocNode *parent,const HtmlAttribList &attribs) : m_attribs(attribs) { m_parent = parent; } Kind kind() const { return Kind_HtmlDescList; } const HtmlAttribList &attribs() const { return m_attribs; } - void accept(DocVisitor *v) { CompAccept<DocHtmlDescList>::accept(this,v); } int parse(); private: @@ -936,7 +992,7 @@ class DocHtmlDescList : public CompAccept<DocHtmlDescList>, public DocNode }; /** Node representing a normal section */ -class DocSection : public CompAccept<DocSection>, public DocNode +class DocSection : public CompAccept<DocSection> { public: DocSection(DocNode *parent,int level,const QCString &id) : @@ -947,7 +1003,6 @@ class DocSection : public CompAccept<DocSection>, public DocNode QCString anchor() const { return m_anchor; } QCString id() const { return m_id; } QCString file() const { return m_file; } - void accept(DocVisitor *v) { CompAccept<DocSection>::accept(this,v); } int parse(); private: @@ -959,7 +1014,7 @@ class DocSection : public CompAccept<DocSection>, public DocNode }; /** Node representing a reference to a section */ -class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode +class DocSecRefItem : public CompAccept<DocSecRefItem> { public: DocSecRefItem(DocNode *parent,const QCString &target) : @@ -968,7 +1023,6 @@ class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode QCString target() const { return m_target; } QCString file() const { return m_file; } QCString anchor() const { return m_anchor; } - void accept(DocVisitor *v) { CompAccept<DocSecRefItem>::accept(this,v); } void parse(); private: @@ -978,56 +1032,52 @@ class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode }; /** Node representing a list of section references */ -class DocSecRefList : public CompAccept<DocSecRefList>, public DocNode +class DocSecRefList : public CompAccept<DocSecRefList> { public: DocSecRefList(DocNode *parent) { m_parent = parent; } void parse(); Kind kind() const { return Kind_SecRefList; } - void accept(DocVisitor *v) { CompAccept<DocSecRefList>::accept(this,v); } private: }; /** Node representing an internal section of documentation */ -class DocInternal : public CompAccept<DocInternal>, public DocNode +class DocInternal : public CompAccept<DocInternal> { public: DocInternal(DocNode *parent) { m_parent = parent; } int parse(int); Kind kind() const { return Kind_Internal; } - void accept(DocVisitor *v) { CompAccept<DocInternal>::accept(this,v); } private: }; /** Node representing an block of paragraphs */ -class DocParBlock : public CompAccept<DocParBlock>, public DocNode +class DocParBlock : public CompAccept<DocParBlock> { public: DocParBlock(DocNode *parent) { m_parent = parent; } int parse(); Kind kind() const { return Kind_ParBlock; } - void accept(DocVisitor *v) { CompAccept<DocParBlock>::accept(this,v); } private: }; /** Node representing a simple list */ -class DocSimpleList : public CompAccept<DocSimpleList>, public DocNode +class DocSimpleList : public CompAccept<DocSimpleList> { public: DocSimpleList(DocNode *parent) { m_parent = parent; } Kind kind() const { return Kind_SimpleList; } - void accept(DocVisitor *v) { CompAccept<DocSimpleList>::accept(this,v); } int parse(); private: }; /** Node representing a Html list */ -class DocHtmlList : public CompAccept<DocHtmlList>, public DocNode +class DocHtmlList : public CompAccept<DocHtmlList> { public: enum Type { Unordered, Ordered }; @@ -1035,7 +1085,6 @@ class DocHtmlList : public CompAccept<DocHtmlList>, public DocNode m_type(t), m_attribs(attribs) { m_parent = parent; } Kind kind() const { return Kind_HtmlList; } Type type() const { return m_type; } - void accept(DocVisitor *v) { CompAccept<DocHtmlList>::accept(this,v); } const HtmlAttribList &attribs() const { return m_attribs; } int parse(); int parseXml(); @@ -1046,7 +1095,7 @@ class DocHtmlList : public CompAccept<DocHtmlList>, public DocNode }; /** Node representing a simple section */ -class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode +class DocSimpleSect : public CompAccept<DocSimpleSect> { public: enum Type @@ -1064,6 +1113,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode int parseRcs(); int parseXml(); void appendLinkWord(const QCString &word); + bool hasTitle() const { return m_title->hasTitle(); } private: Type m_type; @@ -1084,7 +1134,7 @@ class DocSimpleSectSep : public DocNode }; /** Node representing a parameter section */ -class DocParamSect : public CompAccept<DocParamSect>, public DocNode +class DocParamSect : public CompAccept<DocParamSect> { friend class DocParamList; public: @@ -1102,7 +1152,6 @@ class DocParamSect : public CompAccept<DocParamSect>, public DocNode int parse(const QCString &cmdName,bool xmlContext,Direction d); Kind kind() const { return Kind_ParamSect; } Type type() const { return m_type; } - void accept(DocVisitor *v) { CompAccept<DocParamSect>::accept(this,v); } bool hasInOutSpecifier() const { return m_hasInOutSpecifier; } bool hasTypeSpecifier() const { return m_hasTypeSpecifier; } @@ -1113,7 +1162,7 @@ class DocParamSect : public CompAccept<DocParamSect>, public DocNode }; /** Node representing a paragraph in the documentation tree */ -class DocPara : public CompAccept<DocPara>, public DocNode +class DocPara : public CompAccept<DocPara> { public: DocPara(DocNode *parent) : @@ -1121,13 +1170,12 @@ class DocPara : public CompAccept<DocPara>, public DocNode int parse(); Kind kind() const { return Kind_Para; } bool isEmpty() const { return m_children.isEmpty(); } - void accept(DocVisitor *v) { CompAccept<DocPara>::accept(this,v); } void markFirst(bool v=TRUE) { m_isFirst=v; } void markLast(bool v=TRUE) { m_isLast=v; } 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); @@ -1141,6 +1189,7 @@ class DocPara : public CompAccept<DocPara>, public DocNode 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(); @@ -1219,7 +1268,7 @@ class DocSimpleListItem : public DocNode }; /** Node representing a HTML list item */ -class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode +class DocHtmlListItem : public CompAccept<DocHtmlListItem> { public: DocHtmlListItem(DocNode *parent,const HtmlAttribList &attribs,int num) : @@ -1227,7 +1276,6 @@ class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode Kind kind() const { return Kind_HtmlListItem; } int itemNumber() const { return m_itemNum; } const HtmlAttribList &attribs() const { return m_attribs; } - void accept(DocVisitor *v) { CompAccept<DocHtmlListItem>::accept(this,v); } int parse(); int parseXml(); @@ -1237,13 +1285,12 @@ class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode }; /** Node representing a HTML description data */ -class DocHtmlDescData : public CompAccept<DocHtmlDescData>, public DocNode +class DocHtmlDescData : public CompAccept<DocHtmlDescData> { public: DocHtmlDescData(DocNode *parent) { m_parent = parent; } Kind kind() const { return Kind_HtmlDescData; } const HtmlAttribList &attribs() const { return m_attribs; } - void accept(DocVisitor *v) { CompAccept<DocHtmlDescData>::accept(this,v); } int parse(); private: @@ -1251,7 +1298,7 @@ class DocHtmlDescData : public CompAccept<DocHtmlDescData>, public DocNode }; /** Node representing a HTML table cell */ -class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode +class DocHtmlCell : public CompAccept<DocHtmlCell> { friend class DocHtmlTable; public: @@ -1264,7 +1311,6 @@ class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode bool isFirst() const { return m_isFirst; } bool isLast() const { return m_isLast; } Kind kind() const { return Kind_HtmlCell; } - void accept(DocVisitor *v) { CompAccept<DocHtmlCell>::accept(this,v); } void markFirst(bool v=TRUE) { m_isFirst=v; } void markLast(bool v=TRUE) { m_isLast=v; } const HtmlAttribList &attribs() const { return m_attribs; } @@ -1288,12 +1334,11 @@ class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode }; /** Node representing a HTML table caption */ -class DocHtmlCaption : public CompAccept<DocHtmlCaption>, public DocNode +class DocHtmlCaption : public CompAccept<DocHtmlCaption> { public: DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs); Kind kind() const { return Kind_HtmlCaption; } - void accept(DocVisitor *v) { CompAccept<DocHtmlCaption>::accept(this,v); } const HtmlAttribList &attribs() const { return m_attribs; } int parse(); bool hasCaptionId() const { return m_hasCaptionId; } @@ -1308,7 +1353,7 @@ class DocHtmlCaption : public CompAccept<DocHtmlCaption>, public DocNode }; /** Node representing a HTML table row */ -class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode +class DocHtmlRow : public CompAccept<DocHtmlRow> { friend class DocHtmlTable; public: @@ -1316,7 +1361,6 @@ class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode m_attribs(attribs), m_visibleCells(-1), m_rowIdx(-1) { m_parent = parent; } Kind kind() const { return Kind_HtmlRow; } uint numCells() const { return m_children.count(); } - void accept(DocVisitor *v) { CompAccept<DocHtmlRow>::accept(this,v); } const HtmlAttribList &attribs() const { return m_attribs; } int parse(); int parseXml(bool header); @@ -1345,11 +1389,11 @@ class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode }; /** Node representing a HTML table */ -class DocHtmlTable : public CompAccept<DocHtmlTable>, public DocNode +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(); } @@ -1374,14 +1418,13 @@ class DocHtmlTable : public CompAccept<DocHtmlTable>, public DocNode }; /** Node representing an HTML blockquote */ -class DocHtmlBlockQuote : public CompAccept<DocHtmlBlockQuote>, public DocNode +class DocHtmlBlockQuote : public CompAccept<DocHtmlBlockQuote> { public: DocHtmlBlockQuote(DocNode *parent,const HtmlAttribList &attribs) : m_attribs(attribs) { m_parent = parent; } Kind kind() const { return Kind_HtmlBlockQuote; } int parse(); - void accept(DocVisitor *v) { CompAccept<DocHtmlBlockQuote>::accept(this,v); } const HtmlAttribList &attribs() const { return m_attribs; } private: @@ -1389,23 +1432,21 @@ class DocHtmlBlockQuote : public CompAccept<DocHtmlBlockQuote>, public DocNode }; /** Root node of a text fragment */ -class DocText : public CompAccept<DocText>, public DocNode +class DocText : public CompAccept<DocText> { public: DocText() {} Kind kind() const { return Kind_Text; } - void accept(DocVisitor *v) { CompAccept<DocText>::accept(this,v); } void parse(); bool isEmpty() const { return m_children.isEmpty(); } }; /** Root node of documentation tree */ -class DocRoot : public CompAccept<DocRoot>, public DocNode +class DocRoot : public CompAccept<DocRoot> { public: DocRoot(bool indent,bool sl) : m_indent(indent), m_singleLine(sl) {} Kind kind() const { return Kind_Root; } - void accept(DocVisitor *v) { CompAccept<DocRoot>::accept(this,v); } void parse(); bool indent() const { return m_indent; } bool singleLine() const { return m_singleLine; } 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 eb39906..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, @@ -163,5 +164,8 @@ void doctokenizerYYendAutoList(); void doctokenizerYYsetStatePlantUML(); void doctokenizerYYsetStateSetScope(); void doctokenizerYYsetStatePlantUMLOpt(); +void doctokenizerYYsetStateOptions(); +void doctokenizerYYsetStateBlock(); +void doctokenizerYYsetStateEmoji(); #endif diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 7545cba..eb14470 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,18 +360,20 @@ 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}* SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---") -SPCMD2 {CMD}[\\@<>&$#%~".+|-] +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 "..." TEMPCHAR [a-z_A-Z0-9.,: \t\*\&\(\)\[\]] -FUNCCHAR [a-z_A-Z0-9,:\<\> \t\^\*\&\[\]] +FUNCCHAR [a-z_A-Z0-9,:\<\> \t\^\*\&\[\]]|{VARARGS} FUNCPART {FUNCCHAR}*("("{FUNCCHAR}*")"{FUNCCHAR}*)? SCOPESEP "::"|"#"|"." TEMPLPART "<"{TEMPCHAR}*">" @@ -386,14 +398,15 @@ LNKWORD2 (({SCOPEPRE}*"operator"{OPMASK})|({SCOPEPRE}"operator"{OPMASKOPT})|((" LNKWORD3 ([0-9a-z_A-Z\-]+("/"|"\\"))*[0-9a-z_A-Z\-]+("."[0-9a-z_A-Z]+)+ CHARWORDQ [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,."='] ESCWORD ("%"{ID}(("::"|"."){ID})*)|("%'") -WORD1 {ESCWORD}|{CHARWORDQ}+|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"") -WORD2 "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="|"'" +CHARWORDQ1 [^ \-+0-9\t\n\r\\@<>()\[\]:;\?{}&%$#,."='] +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" -HTMLKEYU "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" +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" +HTMLKEYU "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" HTMLKEYW {HTMLKEYL}|{HTMLKEYU} REFWORD2_PRE ("#"|"::")?((({ID}{TEMPLPART}?)|{ANONNS})("."|"#"|"::"|"-"|"/"))*({ID}{TEMPLPART}?(":")?) REFWORD2 {REFWORD2_PRE}{FUNCARG2}? @@ -401,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 @@ -445,6 +458,9 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} %x St_Snippet %x St_SetScope %x St_SetScopeEnd +%x St_Options +%x St_Block +%x St_Emoji %x St_Sections %s St_SecLabel1 @@ -553,13 +569,13 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->indent = computeIndent(text,dotPos); return TK_ENDLIST; } -<St_Para>"{"{BLANK}*"@link" { +<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++; @@ -569,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"; @@ -610,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; @@ -656,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); @@ -695,6 +713,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} } /********* patterns for normal words ******************/ +<St_Para,St_Text>[\-+0-9] | <St_Para,St_Text>{WORD1} | <St_Para,St_Text>{WORD2} { /* function call */ if (yytext[0]=='%') // strip % if present @@ -728,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) @@ -921,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 @@ -930,6 +949,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_WORD; } +<St_TitleN>[\-+0-9] | <St_TitleN>{WORD1} | <St_TitleN>{WORD2} { /* word */ if (yytext[0]=='%') // strip % if present @@ -954,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 */ @@ -1000,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 @@ -1049,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; @@ -1085,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} { @@ -1143,6 +1171,29 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->chars=yytext; return TK_WHITESPACE; } +<St_Options>{ID} { + g_token->name+=yytext; + } +<St_Options>{WS}*","{WS}* +<St_Options>{WS} { /* option separator */ + g_token->name+=","; + } +<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; @@ -1307,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); @@ -1505,6 +1556,24 @@ void doctokenizerYYsetStateSetScope() BEGIN(St_SetScope); } +void doctokenizerYYsetStateOptions() +{ + g_token->name=""; + 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 db77b18..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" @@ -266,6 +267,7 @@ static void writeGraphHeader(FTextStream &t,const QCString &title=QCString()) { t << " // INTERACTIVE_SVG=YES\n"; } + t << " // LATEX_PDF_SIZE\n"; // write placeholder for LaTeX PDF bounding box size repacement if (Config_getBool(DOT_TRANSPARENT)) { t << " bgcolor=\"transparent\";" << endl; @@ -375,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" @@ -393,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,""); } } } @@ -437,6 +440,55 @@ static void unsetDotFontPath() g_dotFontPath=""; } +static bool resetPDFSize(const int width,const int height, const char *base) +{ + QString tmpName = QString::fromUtf8(QCString(base)+".tmp"); + QString patchFile = QString::fromUtf8(QCString(base)+".dot"); + if (!QDir::current().rename(patchFile,tmpName)) + { + err("Failed to rename file %s to %s!\n",patchFile.data(),tmpName.data()); + return FALSE; + } + QFile fi(tmpName); + QFile fo(patchFile); + if (!fi.open(IO_ReadOnly)) + { + err("problem opening file %s for patching!\n",tmpName.data()); + QDir::current().rename(tmpName,patchFile); + return FALSE; + } + if (!fo.open(IO_WriteOnly)) + { + err("problem opening file %s for patching!\n",patchFile.data()); + QDir::current().rename(tmpName,patchFile); + fi.close(); + return FALSE; + } + FTextStream t(&fo); + const int maxLineLen=100*1024; + while (!fi.atEnd()) // foreach line + { + QCString line(maxLineLen); + int numBytes = fi.readLine(line.rawData(),maxLineLen); + if (numBytes<=0) + { + break; + } + line.resize(numBytes+1); + if (line.find("LATEX_PDF_SIZE") != -1) + { + double scale = (width > height ? width : height)/double(MAX_LATEX_GRAPH_INCH); + t << " size=\""<<width/scale << "," <<height/scale <<"\";\n"; + } + else + t << line; + } + fi.close(); + fo.close(); + // remove temporary file + QDir::current().remove(tmpName); + return TRUE; +} static bool readBoundingBox(const char *fileName,int *width,int *height,bool isEps) { QCString bb = isEps ? QCString("%%PageBoundingBox:") : QCString("/MediaBox ["); @@ -765,10 +817,10 @@ DotRunner::DotRunner(const QCString &file,const QCString &path, m_jobs.setAutoDelete(TRUE); } -void DotRunner::addJob(const char *format,const char *output) +void DotRunner::addJob(const char *format,const char *output, const char *base) { QCString args = QCString("-T")+format+" -o \""+output+"\""; - m_jobs.append(new DotConstString(args)); + m_jobs.append(new DotConstString(args, base)); } void DotRunner::addPostProcessing(const char *cmd,const char *args) @@ -780,6 +832,7 @@ void DotRunner::addPostProcessing(const char *cmd,const char *args) bool DotRunner::run() { int exitCode=0; + int width=0,height=0; QCString dotArgs; QListIterator<DotConstString> li(m_jobs); @@ -792,9 +845,26 @@ bool DotRunner::run() dotArgs+=' '; dotArgs+=s->data(); } - if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) + if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; + dotArgs=QCString("\"")+m_file.data()+"\""; + bool redo = FALSE; + for (li.toFirst();(s=li.current());++li) { - goto error; + if (s->pdfData()) + { + if (!readBoundingBox(QCString(s->pdfData())+".pdf",&width,&height,FALSE)) goto error; + if ((width > MAX_LATEX_GRAPH_SIZE) || (height > MAX_LATEX_GRAPH_SIZE)) + { + if (!resetPDFSize(width,height,s->pdfData())) goto error; + dotArgs+=' '; + dotArgs+=s->data(); + redo = TRUE; + } + } + } + if (redo) + { + if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; } } else @@ -802,9 +872,15 @@ bool DotRunner::run() for (li.toFirst();(s=li.current());++li) { dotArgs=QCString("\"")+m_file.data()+"\" "+s->data(); - if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) + if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; + if (s->pdfData()) { - goto error; + if (!readBoundingBox(QCString(s->pdfData())+".pdf",&width,&height,FALSE)) goto error; + if ((width > MAX_LATEX_GRAPH_SIZE) || (height > MAX_LATEX_GRAPH_SIZE)) + { + if (!resetPDFSize(width,height,s->pdfData())) goto error; + if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error; + } } } } @@ -1034,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! { @@ -1309,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; @@ -1428,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) { } @@ -1524,21 +1612,21 @@ void DotNode::setDistance(int distance) static QCString convertLabel(const QCString &l) { - QCString result; - QCString bBefore("\\_/<({[: =-+@%#~?$"); // break before character set - QCString bAfter(">]),:;|"); // break after character set - const char *p=l.data(); - if (p==0) return result; - char c,pc=0; - char cs[2]; - cs[1]=0; - int len=l.length(); + QString bBefore("\\_/<({[: =-+@%#~?$"); // break before character set + QString bAfter(">]),:;|"); // break after character set + QString p(l); + if (p.isEmpty()) return QCString(); + QString result; + QChar c,pc=0; + uint idx = 0; + int len=p.length(); int charsLeft=len; int sinceLast=0; int foldLen=17; // ideal text length - while ((c=*p++)) + while (idx < p.length()) { - QCString replacement; + c = p[idx++]; + QString replacement; switch(c) { case '\\': replacement="\\\\"; break; @@ -1549,7 +1637,7 @@ static QCString convertLabel(const QCString &l) case '{': replacement="\\{"; break; case '}': replacement="\\}"; break; case '"': replacement="\\\""; break; - default: cs[0]=c; replacement=cs; break; + default: replacement=c; break; } // Some heuristics to insert newlines to prevent too long // boxes and at the same time prevent ugly breaks @@ -1567,14 +1655,14 @@ static QCString convertLabel(const QCString &l) sinceLast=1; } else if (charsLeft>1+foldLen/4 && sinceLast>foldLen+foldLen/3 && - !isupper(c) && isupper(*p)) + !isupper(c) && p[idx].category()==QChar::Letter_Uppercase) { result+=replacement; result+="\\l"; foldLen = (foldLen+sinceLast+1)/2; sinceLast=0; } - else if (charsLeft>foldLen/3 && sinceLast>foldLen && bAfter.contains(c) && (c!=':' || *p!=':')) + else if (charsLeft>foldLen/3 && sinceLast>foldLen && bAfter.contains(c) && (c!=':' || p[idx]!=':')) { result+=replacement; result+="\\l"; @@ -1589,7 +1677,7 @@ static QCString convertLabel(const QCString &l) charsLeft--; pc=c; } - return result; + return result.utf8(); } static QCString escapeTooltip(const QCString &tooltip) @@ -1804,10 +1892,14 @@ void DotNode::writeBox(FTextStream &t, << m_url.right(m_url.length()-anchorPos) << "\""; } } - if (!m_tooltip.isEmpty()) - { - t << ",tooltip=\"" << escapeTooltip(m_tooltip) << "\""; - } + } + if (!m_tooltip.isEmpty()) + { + t << ",tooltip=\"" << escapeTooltip(m_tooltip) << "\""; + } + else + { + t << ",tooltip=\" \""; // space in tooltip is required otherwise still something like 'Node0' is used } t << "];" << endl; } @@ -2196,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); + } } } } @@ -2245,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; @@ -2437,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) @@ -2448,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 @@ -2480,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); @@ -2993,7 +3100,7 @@ DotClassGraph::~DotClassGraph() QCString computeMd5Signature(DotNode *root, DotNode::GraphType gt, GraphOutputFormat format, - bool lrRank, + const QCString &rank, // either "LR", "RL", or "" bool renderParents, bool backArrows, const QCString &title, @@ -3004,9 +3111,9 @@ QCString computeMd5Signature(DotNode *root, QGString buf; FTextStream md5stream(&buf); writeGraphHeader(md5stream,title); - if (lrRank) + if (!rank.isEmpty()) { - md5stream << " rankdir=\"LR\";" << endl; + md5stream << " rankdir=\"" << rank << "\";" << endl; } root->clearWriteFlag(); root->write(md5stream, @@ -3055,7 +3162,7 @@ static bool updateDotGraph(DotNode *root, DotNode::GraphType gt, const QCString &baseName, GraphOutputFormat format, - bool lrRank, + const QCString &rank, bool renderParents, bool backArrows, const QCString &title=QCString() @@ -3064,7 +3171,7 @@ static bool updateDotGraph(DotNode *root, QCString theGraph; // TODO: write graph to theGraph, then compute md5 checksum QCString md5 = computeMd5Signature( - root,gt,format,lrRank,renderParents, + root,gt,format,rank,renderParents, backArrows,title,theGraph); QFile f(baseName+".dot"); if (f.open(IO_WriteOnly)) @@ -3125,7 +3232,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, m_graphType, absBaseName, graphFormat, - m_lrRank, + m_lrRank ? "LR" : "", m_graphType==DotNode::Inheritance, TRUE, m_startNode->label() @@ -3150,7 +3257,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) { - dotRun->addJob("pdf",absPdfName); + dotRun->addJob("pdf",absPdfName,absBaseName); } else { @@ -3164,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 @@ -3409,9 +3502,10 @@ DotInclDepGraph::DotInclDepGraph(FileDef *fd,bool inverse) m_inclDepFileName = fd->includeDependencyGraphFileName(); m_inclByDepFileName = fd->includedByDependencyGraphFileName(); QCString tmp_url=fd->getReference()+"$"+fd->getOutputFileBase(); + QCString tooltip = fd->briefDescriptionAsTooltip(); m_startNode = new DotNode(m_curNodeNumber++, fd->docName(), - "", + tooltip, tmp_url.data(), TRUE // root node ); @@ -3484,7 +3578,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, DotNode::Dependency, absBaseName, graphFormat, - FALSE, // lrRank + "", // lrRank FALSE, // renderParents m_inverse, // backArrows m_startNode->label() @@ -3508,7 +3602,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) { - dotRun->addJob("pdf",absPdfName); + dotRun->addJob("pdf",absPdfName,absBaseName); } else { @@ -3522,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) @@ -3738,9 +3830,10 @@ DotCallGraph::DotCallGraph(MemberDef *md,bool inverse) { name = md->qualifiedName(); } + QCString tooltip = md->briefDescriptionAsTooltip(); m_startNode = new DotNode(m_curNodeNumber++, linkToText(md->getLanguage(),name,FALSE), - "", + tooltip, uniqueId.data(), TRUE // root node ); @@ -3796,11 +3889,12 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat graphForma QCString absImgName = absBaseName+"."+imgExt; bool regenerate = FALSE; + if (updateDotGraph(m_startNode, DotNode::CallGraph, absBaseName, graphFormat, - TRUE, // lrRank + m_inverse ? "RL" : "LR", // lrRank FALSE, // renderParents m_inverse, // backArrows m_startNode->label() @@ -3826,7 +3920,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat graphForma DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) { - dotRun->addJob("pdf",absPdfName); + dotRun->addJob("pdf",absPdfName,absBaseName); } else { @@ -3841,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) @@ -3992,7 +4084,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) { - dotRun->addJob("pdf",absPdfName); + dotRun->addJob("pdf",absPdfName,absBaseName); } else { @@ -4006,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) @@ -4170,7 +4260,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir, { if (Config_getBool(USE_PDFLATEX)) { - dotRun.addJob("pdf",absOutFile+".pdf"); + dotRun.addJob("pdf",absOutFile+".pdf",absOutFile); } else { @@ -4238,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); } @@ -4262,7 +4357,8 @@ DotGroupCollaboration::DotGroupCollaboration(GroupDef* gd) { QCString tmp_url = gd->getReference()+"$"+gd->getOutputFileBase(); m_usedNodes = new QDict<DotNode>(1009); - m_rootNode = new DotNode(m_curNodeNumber++, gd->groupTitle(), "", tmp_url, TRUE ); + QCString tooltip = gd->briefDescriptionAsTooltip(); + m_rootNode = new DotNode(m_curNodeNumber++, gd->groupTitle(), tooltip, tmp_url, TRUE ); m_rootNode->markAsVisible(); m_usedNodes->insert(gd->name(), m_rootNode ); m_edges.setAutoDelete(TRUE); @@ -4555,7 +4651,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) { - dotRun->addJob("pdf",absPdfName); + dotRun->addJob("pdf",absPdfName,absBaseName); } else { @@ -4568,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) @@ -4715,7 +4809,7 @@ void DotGroupCollaboration::writeGraphHeader(FTextStream &t, } t << " edge [fontname=\"" << FONTNAME << "\",fontsize=\"" << FONTSIZE << "\"," "labelfontname=\"" << FONTNAME << "\",labelfontsize=\"" << FONTSIZE << "\"];\n"; - t << " node [fontname=\"" << FONTNAME << "\",fontsize=\"" << FONTSIZE << "\",shape=record];\n"; + t << " node [fontname=\"" << FONTNAME << "\",fontsize=\"" << FONTSIZE << "\",shape=box];\n"; t << " rankdir=LR;\n"; } @@ -26,8 +26,8 @@ #include <qqueue.h> #include <qthread.h> #include "sortdict.h" +#include "classdef.h" -class ClassDef; class FileDef; class FTextStream; class DotNodeList; @@ -42,6 +42,12 @@ class DotRunnerQueue; enum GraphOutputFormat { GOF_BITMAP, GOF_EPS }; enum EmbeddedOutputFormat { EOF_Html, EOF_LaTeX, EOF_Rtf, EOF_DocBook }; +// the graphicx LaTeX has a limitation of maximum size of 16384 +// To be on the save side we take it a little bit smaller i.e. 150 inch * 72 dpi +// It is anyway hard to view these size of images +#define MAX_LATEX_GRAPH_INCH 150 +#define MAX_LATEX_GRAPH_SIZE (MAX_LATEX_GRAPH_INCH * 72) + /** Attributes of an edge of a dot graph */ struct EdgeInfo { @@ -116,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; @@ -127,8 +134,9 @@ class DotNode friend QCString computeMd5Signature( DotNode *root, GraphType gt, - GraphOutputFormat f, - bool lrRank, bool renderParents, + GraphOutputFormat f, + const QCString &rank, + bool renderParents, bool backArrows, const QCString &title, QCString &graphStr @@ -149,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; @@ -159,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 */ @@ -338,11 +348,12 @@ class DotGroupCollaboration class DotConstString { public: - DotConstString() { m_str=0; } - ~DotConstString() { delete[] m_str; } - DotConstString(const QCString &s) : m_str(0) { set(s); } - DotConstString(const DotConstString &s) : m_str(0) { set(s.data()); } + DotConstString() { m_str=0; m_pdfstr=0;} + ~DotConstString() { delete[] m_str; delete[] m_pdfstr;} + DotConstString(const QCString &s, const QCString &p = NULL) : m_str(0), m_pdfstr(0) { set(s); setpdf(p);} + DotConstString(const DotConstString &s) : m_str(0), m_pdfstr(0) { set(s.data()); } const char *data() const { return m_str; } + const char *pdfData() const { return m_pdfstr; } bool isEmpty() const { return m_str==0 || m_str[0]=='\0'; } void set(const QCString &s) { @@ -354,9 +365,20 @@ class DotConstString qstrcpy(m_str,s.data()); } } + void setpdf(const QCString &p) + { + delete[] m_pdfstr; + m_pdfstr=0; + if (!p.isEmpty()) + { + m_pdfstr=new char[p.length()+1]; + qstrcpy(m_pdfstr,p.data()); + } + } private: DotConstString &operator=(const DotConstString &); char *m_str; + char *m_pdfstr; }; /** Helper class to run dot from doxygen. @@ -377,7 +399,7 @@ class DotRunner /** Adds an additional job to the run. * Performing multiple jobs one file can be faster. */ - void addJob(const char *format,const char *output); + void addJob(const char *format,const char *output, const char *base = NULL); void addPostProcessing(const char *cmd,const char *args); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 00826d6..2d55ae6 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -13,6 +13,10 @@ * */ +#if !defined(_WIN32) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE 1 +#endif + #include <locale.h> #include <qfileinfo.h> @@ -99,6 +103,7 @@ #include "settings.h" #include "context.h" #include "fileparser.h" +#include "emoji.h" // provided by the generated file resources.cpp extern void initResources(); @@ -163,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; @@ -342,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 @@ -515,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; @@ -605,7 +612,7 @@ static void addRelatedPage(EntryNav *rootNav) { pd->setBriefDescription(root->brief,root->briefFile,root->briefLine); pd->addSectionsToDefinition(root->anchors); - pd->setShowToc(root->stat); + pd->setLocalToc(root->localToc); addPageToContext(pd,rootNav); } } @@ -1298,6 +1305,8 @@ static void addClassToContext(EntryNav *rootNav) } cd->setCompoundType(convertToCompoundType(root->section,root->spec)); + + cd->setMetaData(root->metaData); } else // new class { @@ -1362,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); @@ -1581,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()); @@ -1753,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(); @@ -1782,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); @@ -1957,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; @@ -2162,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); @@ -2182,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()); @@ -2355,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); @@ -2378,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); @@ -2598,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); @@ -2615,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) @@ -2816,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(); @@ -2935,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; @@ -3049,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. @@ -3109,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); @@ -3128,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" @@ -3296,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); @@ -3380,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" @@ -3647,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) @@ -3686,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); @@ -3766,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]); @@ -3917,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()); } } } @@ -5318,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; @@ -5410,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); @@ -6431,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); @@ -6442,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); @@ -6498,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); @@ -6507,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; @@ -6636,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) { @@ -6711,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); @@ -6774,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); @@ -6783,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); @@ -7110,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); @@ -7125,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); @@ -7332,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()); @@ -7692,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 ) && @@ -8462,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); @@ -8712,7 +8817,7 @@ static void findMainPage(EntryNav *rootNav) //setFileNameForSections(root->anchors,"index",Doxygen::mainPage); Doxygen::mainPage->setBriefDescription(root->brief,root->briefFile,root->briefLine); Doxygen::mainPage->setFileName(indexName); - Doxygen::mainPage->setShowToc(root->stat); + Doxygen::mainPage->setLocalToc(root->localToc); addPageToContext(Doxygen::mainPage,rootNav); SectionInfo *si = Doxygen::sectionDict->find(Doxygen::mainPage->name()); @@ -8922,7 +9027,7 @@ static void generatePageDocs() static void buildExampleList(EntryNav *rootNav) { - if (rootNav->section()==Entry::EXAMPLE_SEC && !rootNav->name().isEmpty()) + if ((rootNav->section()==Entry::EXAMPLE_SEC || rootNav->section()==Entry::EXAMPLE_LINENO_SEC) && !rootNav->name().isEmpty()) { rootNav->loadEntry(g_storage); Entry *root = rootNav->entry(); @@ -8943,7 +9048,7 @@ static void buildExampleList(EntryNav *rootNav) pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE)); pd->addSectionsToDefinition(root->anchors); pd->setLanguage(root->lang); - //pi->addSections(root->anchors); + pd->setShowLineNo(rootNav->section()==Entry::EXAMPLE_LINENO_SEC); Doxygen::exampleSDict->inSort(root->name,pd); //we don't add example to groups @@ -8992,11 +9097,16 @@ static void generateExampleDocs() g_outputList->docify(pd->name()); endTitle(*g_outputList,n,0); g_outputList->startContents(); + QCString lineNoOptStr; + if (pd->showLineNo()) + { + lineNoOptStr="{lineno}"; + } g_outputList->generateDoc(pd->docFile(), // file pd->docLine(), // startLine pd, // context 0, // memberDef - pd->documentation()+"\n\n\\include "+pd->name(), // docs + pd->documentation()+"\n\n\\include"+lineNoOptStr+" "+pd->name(), // docs TRUE, // index words TRUE, // is example pd->name() @@ -9042,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); @@ -9058,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()); } } } @@ -9142,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 @@ -9574,7 +9714,7 @@ int readDir(QFileInfo *fi, if (fi->isSymLink()) { dirName = resolveSymlink(dirName.data()); - if (dirName.isEmpty()) return 0; // recusive symlink + if (dirName.isEmpty()) return 0; // recursive symlink if (g_pathsVisited.find(dirName)) return 0; // already visited path g_pathsVisited.insert(dirName,(void*)0x8); } @@ -9624,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); } } @@ -9723,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); } } @@ -9752,14 +9892,17 @@ int readFileOrDirectory(const char *s, //---------------------------------------------------------------------------- -void readFormulaRepository() +void readFormulaRepository(QCString dir, bool cmp) { - QFile f(Config_getString(HTML_OUTPUT)+"/formula.repository"); + static int current_repository = 0; + int new_repository = 0; + QFile f(dir+"/formula.repository"); if (f.open(IO_ReadOnly)) // open repository { msg("Reading formula repository...\n"); QTextStream t(&f); QCString line; + Formula *f; while (!t.eof()) { line=t.readLine().utf8(); @@ -9773,14 +9916,41 @@ void readFormulaRepository() { QCString formName = line.left(se); QCString formText = line.right(line.length()-se-1); - Formula *f=new Formula(formText); - Doxygen::formulaList->setAutoDelete(TRUE); - Doxygen::formulaList->append(f); - Doxygen::formulaDict->insert(formText,f); - Doxygen::formulaNameDict->insert(formName,f); + if (cmp) + { + if ((f=Doxygen::formulaDict->find(formText))==0) + { + err("discrepancy between formula repositories! Remove " + "formula.repository and from_* files from output directories."); + exit(1); + } + QCString formLabel; + formLabel.sprintf("\\form#%d",f->getId()); + if (formLabel != formName) + { + err("discrepancy between formula repositories! Remove " + "formula.repository and from_* files from output directories."); + exit(1); + } + new_repository++; + } + else + { + f=new Formula(formText); + Doxygen::formulaList->append(f); + Doxygen::formulaDict->insert(formText,f); + Doxygen::formulaNameDict->insert(formName,f); + current_repository++; + } } } } + if (cmp && (current_repository != new_repository)) + { + err("size discrepancy between formula repositories! Remove " + "formula.repository and from_* files from output directories."); + exit(1); + } } //---------------------------------------------------------------------------- @@ -9831,7 +10001,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); @@ -9969,6 +10139,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"); @@ -10055,6 +10230,7 @@ void initDoxygen() Doxygen::genericsDict = new GenericsSDict; Doxygen::indexList = new IndexList; Doxygen::formulaList = new FormulaList; + Doxygen::formulaList->setAutoDelete(TRUE); Doxygen::formulaDict = new FormulaDict(1009); Doxygen::formulaNameDict = new FormulaDict(1009); Doxygen::sectionDict = new SectionDict(257); @@ -10169,10 +10345,11 @@ 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; - bool genLayout=FALSE; int retVal; while (optind<argc && argv[optind][0]=='-' && (isalpha(argv[optind][1]) || argv[optind][1]=='?' || @@ -10183,17 +10360,14 @@ void readConfiguration(int argc, char **argv) { case 'g': genConfig=TRUE; - configName=getArg(argc,argv,optind); - if (optind+1<argc && qstrcmp(argv[optind+1],"-")==0) - { configName="-"; optind++; } - if (!configName) - { configName="Doxyfile"; } break; case 'l': - genLayout=TRUE; layoutName=getArg(argc,argv,optind); if (!layoutName) { layoutName="DoxygenLayout.xml"; } + writeDefaultLayoutFile(layoutName); + cleanUpDoxygen(); + exit(0); break; case 'd': debugLabel=getArg(argc,argv,optind); @@ -10212,6 +10386,9 @@ void readConfiguration(int argc, char **argv) exit(1); } break; + case 'x': + diffList=TRUE; + break; case 's': shortList=TRUE; break; @@ -10246,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) @@ -10426,26 +10631,6 @@ void readConfiguration(int argc, char **argv) Config::init(); - if (genConfig && g_useOutputTemplate) - { - generateTemplateFiles("templates"); - cleanUpDoxygen(); - exit(0); - } - - if (genConfig) - { - generateConfigFile(configName,shortList); - cleanUpDoxygen(); - exit(0); - } - if (genLayout) - { - writeDefaultLayoutFile(layoutName); - cleanUpDoxygen(); - exit(0); - } - QFileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile"); if (optind>=argc) { @@ -10457,6 +10642,10 @@ void readConfiguration(int argc, char **argv) { configName="doxyfile"; } + else if (genConfig) + { + configName="Doxyfile"; + } else { err("Doxyfile not found and no input file specified!\n"); @@ -10467,7 +10656,7 @@ void readConfiguration(int argc, char **argv) else { QFileInfo fi(argv[optind]); - if (fi.exists() || qstrcmp(argv[optind],"-")==0) + if (fi.exists() || qstrcmp(argv[optind],"-")==0 || genConfig) { configName=argv[optind]; } @@ -10479,6 +10668,19 @@ void readConfiguration(int argc, char **argv) } } + if (genConfig && g_useOutputTemplate) + { + generateTemplateFiles("templates"); + cleanUpDoxygen(); + exit(0); + } + + if (genConfig) + { + generateConfigFile(configName,shortList); + cleanUpDoxygen(); + exit(0); + } if (!Config::parse(configName,updateConfig)) { @@ -10487,6 +10689,13 @@ void readConfiguration(int argc, char **argv) exit(1); } + if (diffList) + { + compareDoxyfile(); + cleanUpDoxygen(); + exit(0); + } + if (updateConfig) { generateConfigFile(configName,shortList,TRUE); @@ -10520,8 +10729,11 @@ void adjustConfiguration() Doxygen::imageNameDict = new FileNameDict(257); Doxygen::imageNameDict->setAutoDelete(TRUE); Doxygen::dotFileNameDict = new FileNameDict(257); + Doxygen::dotFileNameDict->setAutoDelete(TRUE); Doxygen::mscFileNameDict = new FileNameDict(257); + Doxygen::mscFileNameDict->setAutoDelete(TRUE); Doxygen::diaFileNameDict = new FileNameDict(257); + Doxygen::diaFileNameDict->setAutoDelete(TRUE); QCString outputLanguage=Config_getEnum(OUTPUT_LANGUAGE); if (!setTranslator(outputLanguage)) @@ -10616,6 +10828,10 @@ static void stopDoxygen(int) { thisDir.remove(Doxygen::objDBFileName); } + if (!Doxygen::filterDBFileName.isEmpty()) + { + thisDir.remove(Doxygen::filterDBFileName); + } killpg(0,SIGINT); exit(1); } @@ -10716,6 +10932,10 @@ static void exitDoxygen() { thisDir.remove(Doxygen::objDBFileName); } + if (!Doxygen::filterDBFileName.isEmpty()) + { + thisDir.remove(Doxygen::filterDBFileName); + } } } @@ -10891,6 +11111,7 @@ void searchInputFiles() } s=inputList.next(); } + Doxygen::inputNameList->sort(); delete killDict; g_s.end(); } @@ -10955,6 +11176,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) { @@ -10965,7 +11188,7 @@ void parseInput() /************************************************************************** - * Check/create output directorties * + * Check/create output directories * **************************************************************************/ QCString htmlOutput; @@ -11068,9 +11291,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) && !Config_getBool(USE_MATHJAX)); + } + if (Config_getBool(GENERATE_DOCBOOK)) { - readFormulaRepository(); + // 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)); } /************************************************************************** @@ -11190,6 +11424,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 @@ -11419,6 +11664,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); @@ -11446,6 +11692,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); @@ -11472,6 +11723,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"); @@ -11558,6 +11810,19 @@ void generateOutput() Doxygen::formulaList->generateBitmaps(Config_getString(HTML_OUTPUT)); g_s.end(); } + if (Doxygen::formulaList->count()>0 && generateRtf) + { + g_s.begin("Generating bitmaps for formulas in RTF...\n"); + Doxygen::formulaList->generateBitmaps(Config_getString(RTF_OUTPUT)); + 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)) { @@ -11591,6 +11856,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)) @@ -11608,13 +11875,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"); @@ -11685,6 +11945,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)); @@ -11763,6 +12027,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 b3467c1..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; @@ -159,7 +160,7 @@ void searchInputFiles(StringList &inputFiles); void parseInput(); void generateOutput(); void readAliases(); -void readFormulaRepository(); +void readFormulaRepository(QCString dir, bool cmp = FALSE); void cleanUpDoxygen(); int readFileOrDirectory(const char *s, FileNameList *fnList, diff --git a/src/doxygen.md b/src/doxygen.md index ccb47b9..17144ec 100644 --- a/src/doxygen.md +++ b/src/doxygen.md @@ -9,7 +9,7 @@ links to the relevant parts of the code. This document is intended for developers who want to work on doxygen. Users of doxygen are referred to the [User Manual](http://www.doxygen.org/manual.html). -The generic starting point of the application is of cource the main() function. +The generic starting point of the application is of course the main() function. Configuration options --------------------- 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:", "👍" }, + { ":-1:", "👎" }, + { ":100:", "💯" }, + { ":1234:", "🔢" }, + { ":1st_place_medal:", "🥇" }, + { ":2nd_place_medal:", "🥈" }, + { ":3rd_place_medal:", "🥉" }, + { ":8ball:", "🎱" }, + { ":a:", "🅰" }, + { ":ab:", "🆎" }, + { ":abc:", "🔤" }, + { ":abcd:", "🔡" }, + { ":accept:", "🉑" }, + { ":aerial_tramway:", "🚡" }, + { ":afghanistan:", "🇦🇫" }, + { ":airplane:", "✈" }, + { ":aland_islands:", "🇦🇽" }, + { ":alarm_clock:", "⏰" }, + { ":albania:", "🇦🇱" }, + { ":alembic:", "⚗" }, + { ":algeria:", "🇩🇿" }, + { ":alien:", "👽" }, + { ":ambulance:", "🚑" }, + { ":american_samoa:", "🇦🇸" }, + { ":amphora:", "🏺" }, + { ":anchor:", "⚓" }, + { ":andorra:", "🇦🇩" }, + { ":angel:", "👼" }, + { ":anger:", "💢" }, + { ":angola:", "🇦🇴" }, + { ":angry:", "😠" }, + { ":anguilla:", "🇦🇮" }, + { ":anguished:", "😧" }, + { ":ant:", "🐜" }, + { ":antarctica:", "🇦🇶" }, + { ":antigua_barbuda:", "🇦🇬" }, + { ":apple:", "🍎" }, + { ":aquarius:", "♒" }, + { ":argentina:", "🇦🇷" }, + { ":aries:", "♈" }, + { ":armenia:", "🇦🇲" }, + { ":arrow_backward:", "◀" }, + { ":arrow_double_down:", "⏬" }, + { ":arrow_double_up:", "⏫" }, + { ":arrow_down:", "⬇" }, + { ":arrow_down_small:", "🔽" }, + { ":arrow_forward:", "▶" }, + { ":arrow_heading_down:", "⤵" }, + { ":arrow_heading_up:", "⤴" }, + { ":arrow_left:", "⬅" }, + { ":arrow_lower_left:", "↙" }, + { ":arrow_lower_right:", "↘" }, + { ":arrow_right:", "➡" }, + { ":arrow_right_hook:", "↪" }, + { ":arrow_up:", "⬆" }, + { ":arrow_up_down:", "↕" }, + { ":arrow_up_small:", "🔼" }, + { ":arrow_upper_left:", "↖" }, + { ":arrow_upper_right:", "↗" }, + { ":arrows_clockwise:", "🔃" }, + { ":arrows_counterclockwise:", "🔄" }, + { ":art:", "🎨" }, + { ":articulated_lorry:", "🚛" }, + { ":artificial_satellite:", "🛰" }, + { ":aruba:", "🇦🇼" }, + { ":asterisk:", "*⃣" }, + { ":astonished:", "😲" }, + { ":athletic_shoe:", "👟" }, + { ":atm:", "🏧" }, + { ":atom_symbol:", "⚛" }, + { ":australia:", "🇦🇺" }, + { ":austria:", "🇦🇹" }, + { ":avocado:", "🥑" }, + { ":azerbaijan:", "🇦🇿" }, + { ":b:", "🅱" }, + { ":baby:", "👶" }, + { ":baby_bottle:", "🍼" }, + { ":baby_chick:", "🐤" }, + { ":baby_symbol:", "🚼" }, + { ":back:", "🔙" }, + { ":bacon:", "🥓" }, + { ":badminton:", "🏸" }, + { ":baggage_claim:", "🛄" }, + { ":baguette_bread:", "🥖" }, + { ":bahamas:", "🇧🇸" }, + { ":bahrain:", "🇧🇭" }, + { ":balance_scale:", "⚖" }, + { ":balloon:", "🎈" }, + { ":ballot_box:", "🗳" }, + { ":ballot_box_with_check:", "☑" }, + { ":bamboo:", "🎍" }, + { ":banana:", "🍌" }, + { ":bangbang:", "‼" }, + { ":bangladesh:", "🇧🇩" }, + { ":bank:", "🏦" }, + { ":bar_chart:", "📊" }, + { ":barbados:", "🇧🇧" }, + { ":barber:", "💈" }, + { ":baseball:", "⚾" }, + { ":basketball:", "🏀" }, + { ":basketball_man:", "⛹" }, + { ":basketball_woman:", "⛹♀" }, + { ":bat:", "🦇" }, + { ":bath:", "🛀" }, + { ":bathtub:", "🛁" }, + { ":battery:", "🔋" }, + { ":beach_umbrella:", "🏖" }, + { ":bear:", "🐻" }, + { ":bed:", "🛏" }, + { ":bee:", "🐝" }, + { ":beer:", "🍺" }, + { ":beers:", "🍻" }, + { ":beetle:", "🐞" }, + { ":beginner:", "🔰" }, + { ":belarus:", "🇧🇾" }, + { ":belgium:", "🇧🇪" }, + { ":belize:", "🇧🇿" }, + { ":bell:", "🔔" }, + { ":bellhop_bell:", "🛎" }, + { ":benin:", "🇧🇯" }, + { ":bento:", "🍱" }, + { ":bermuda:", "🇧🇲" }, + { ":bhutan:", "🇧🇹" }, + { ":bicyclist:", "🚴" }, + { ":bike:", "🚲" }, + { ":biking_man:", "🚴" }, + { ":biking_woman:", "🚴♀" }, + { ":bikini:", "👙" }, + { ":biohazard:", "☣" }, + { ":bird:", "🐦" }, + { ":birthday:", "🎂" }, + { ":black_circle:", "⚫" }, + { ":black_flag:", "🏴" }, + { ":black_heart:", "🖤" }, + { ":black_joker:", "🃏" }, + { ":black_large_square:", "⬛" }, + { ":black_medium_small_square:", "◾" }, + { ":black_medium_square:", "◼" }, + { ":black_nib:", "✒" }, + { ":black_small_square:", "▪" }, + { ":black_square_button:", "🔲" }, + { ":blonde_man:", "👱" }, + { ":blonde_woman:", "👱♀" }, + { ":blossom:", "🌼" }, + { ":blowfish:", "🐡" }, + { ":blue_book:", "📘" }, + { ":blue_car:", "🚙" }, + { ":blue_heart:", "💙" }, + { ":blush:", "😊" }, + { ":boar:", "🐗" }, + { ":boat:", "⛵" }, + { ":bolivia:", "🇧🇴" }, + { ":bomb:", "💣" }, + { ":book:", "📖" }, + { ":bookmark:", "🔖" }, + { ":bookmark_tabs:", "📑" }, + { ":books:", "📚" }, + { ":boom:", "💥" }, + { ":boot:", "👢" }, + { ":bosnia_herzegovina:", "🇧🇦" }, + { ":botswana:", "🇧🇼" }, + { ":bouquet:", "💐" }, + { ":bow:", "🙇" }, + { ":bow_and_arrow:", "🏹" }, + { ":bowing_man:", "🙇" }, + { ":bowing_woman:", "🙇♀" }, + { ":bowling:", "🎳" }, + { ":boxing_glove:", "🥊" }, + { ":boy:", "👦" }, + { ":brazil:", "🇧🇷" }, + { ":bread:", "🍞" }, + { ":bride_with_veil:", "👰" }, + { ":bridge_at_night:", "🌉" }, + { ":briefcase:", "💼" }, + { ":british_indian_ocean_territory:", "🇮🇴" }, + { ":british_virgin_islands:", "🇻🇬" }, + { ":broken_heart:", "💔" }, + { ":brunei:", "🇧🇳" }, + { ":bug:", "🐛" }, + { ":building_construction:", "🏗" }, + { ":bulb:", "💡" }, + { ":bulgaria:", "🇧🇬" }, + { ":bullettrain_front:", "🚅" }, + { ":bullettrain_side:", "🚄" }, + { ":burkina_faso:", "🇧🇫" }, + { ":burrito:", "🌯" }, + { ":burundi:", "🇧🇮" }, + { ":bus:", "🚌" }, + { ":business_suit_levitating:", "🕴" }, + { ":busstop:", "🚏" }, + { ":bust_in_silhouette:", "👤" }, + { ":busts_in_silhouette:", "👥" }, + { ":butterfly:", "🦋" }, + { ":cactus:", "🌵" }, + { ":cake:", "🍰" }, + { ":calendar:", "📆" }, + { ":call_me_hand:", "🤙" }, + { ":calling:", "📲" }, + { ":cambodia:", "🇰🇭" }, + { ":camel:", "🐫" }, + { ":camera:", "📷" }, + { ":camera_flash:", "📸" }, + { ":cameroon:", "🇨🇲" }, + { ":camping:", "🏕" }, + { ":canada:", "🇨🇦" }, + { ":canary_islands:", "🇮🇨" }, + { ":cancer:", "♋" }, + { ":candle:", "🕯" }, + { ":candy:", "🍬" }, + { ":canoe:", "🛶" }, + { ":cape_verde:", "🇨🇻" }, + { ":capital_abcd:", "🔠" }, + { ":capricorn:", "♑" }, + { ":car:", "🚗" }, + { ":card_file_box:", "🗃" }, + { ":card_index:", "📇" }, + { ":card_index_dividers:", "🗂" }, + { ":caribbean_netherlands:", "🇧🇶" }, + { ":carousel_horse:", "🎠" }, + { ":carrot:", "🥕" }, + { ":cat:", "🐱" }, + { ":cat2:", "🐈" }, + { ":cayman_islands:", "🇰🇾" }, + { ":cd:", "💿" }, + { ":central_african_republic:", "🇨🇫" }, + { ":chad:", "🇹🇩" }, + { ":chains:", "⛓" }, + { ":champagne:", "🍾" }, + { ":chart:", "💹" }, + { ":chart_with_downwards_trend:", "📉" }, + { ":chart_with_upwards_trend:", "📈" }, + { ":checkered_flag:", "🏁" }, + { ":cheese:", "🧀" }, + { ":cherries:", "🍒" }, + { ":cherry_blossom:", "🌸" }, + { ":chestnut:", "🌰" }, + { ":chicken:", "🐔" }, + { ":children_crossing:", "🚸" }, + { ":chile:", "🇨🇱" }, + { ":chipmunk:", "🐿" }, + { ":chocolate_bar:", "🍫" }, + { ":christmas_island:", "🇨🇽" }, + { ":christmas_tree:", "🎄" }, + { ":church:", "⛪" }, + { ":cinema:", "🎦" }, + { ":circus_tent:", "🎪" }, + { ":city_sunrise:", "🌇" }, + { ":city_sunset:", "🌆" }, + { ":cityscape:", "🏙" }, + { ":cl:", "🆑" }, + { ":clamp:", "🗜" }, + { ":clap:", "👏" }, + { ":clapper:", "🎬" }, + { ":classical_building:", "🏛" }, + { ":clinking_glasses:", "🥂" }, + { ":clipboard:", "📋" }, + { ":clock1:", "🕐" }, + { ":clock10:", "🕙" }, + { ":clock1030:", "🕥" }, + { ":clock11:", "🕚" }, + { ":clock1130:", "🕦" }, + { ":clock12:", "🕛" }, + { ":clock1230:", "🕧" }, + { ":clock130:", "🕜" }, + { ":clock2:", "🕑" }, + { ":clock230:", "🕝" }, + { ":clock3:", "🕒" }, + { ":clock330:", "🕞" }, + { ":clock4:", "🕓" }, + { ":clock430:", "🕟" }, + { ":clock5:", "🕔" }, + { ":clock530:", "🕠" }, + { ":clock6:", "🕕" }, + { ":clock630:", "🕡" }, + { ":clock7:", "🕖" }, + { ":clock730:", "🕢" }, + { ":clock8:", "🕗" }, + { ":clock830:", "🕣" }, + { ":clock9:", "🕘" }, + { ":clock930:", "🕤" }, + { ":closed_book:", "📕" }, + { ":closed_lock_with_key:", "🔐" }, + { ":closed_umbrella:", "🌂" }, + { ":cloud:", "☁" }, + { ":cloud_with_lightning:", "🌩" }, + { ":cloud_with_lightning_and_rain:", "⛈" }, + { ":cloud_with_rain:", "🌧" }, + { ":cloud_with_snow:", "🌨" }, + { ":clown_face:", "🤡" }, + { ":clubs:", "♣" }, + { ":cn:", "🇨🇳" }, + { ":cocktail:", "🍸" }, + { ":cocos_islands:", "🇨🇨" }, + { ":coffee:", "☕" }, + { ":coffin:", "⚰" }, + { ":cold_sweat:", "😰" }, + { ":collision:", "💥" }, + { ":colombia:", "🇨🇴" }, + { ":comet:", "☄" }, + { ":comoros:", "🇰🇲" }, + { ":computer:", "💻" }, + { ":computer_mouse:", "🖱" }, + { ":confetti_ball:", "🎊" }, + { ":confounded:", "😖" }, + { ":confused:", "😕" }, + { ":congo_brazzaville:", "🇨🇬" }, + { ":congo_kinshasa:", "🇨🇩" }, + { ":congratulations:", "㊗" }, + { ":construction:", "🚧" }, + { ":construction_worker:", "👷" }, + { ":construction_worker_man:", "👷" }, + { ":construction_worker_woman:", "👷♀" }, + { ":control_knobs:", "🎛" }, + { ":convenience_store:", "🏪" }, + { ":cook_islands:", "🇨🇰" }, + { ":cookie:", "🍪" }, + { ":cool:", "🆒" }, + { ":cop:", "👮" }, + { ":copyright:", "©" }, + { ":corn:", "🌽" }, + { ":costa_rica:", "🇨🇷" }, + { ":cote_divoire:", "🇨🇮" }, + { ":couch_and_lamp:", "🛋" }, + { ":couple:", "👫" }, + { ":couple_with_heart:", "💑" }, + { ":couple_with_heart_man_man:", "👨❤👨" }, + { ":couple_with_heart_woman_man:", "💑" }, + { ":couple_with_heart_woman_woman:", "👩❤👩" }, + { ":couplekiss_man_man:", "👨❤💋👨" }, + { ":couplekiss_man_woman:", "💏" }, + { ":couplekiss_woman_woman:", "👩❤💋👩" }, + { ":cow:", "🐮" }, + { ":cow2:", "🐄" }, + { ":cowboy_hat_face:", "🤠" }, + { ":crab:", "🦀" }, + { ":crayon:", "🖍" }, + { ":credit_card:", "💳" }, + { ":crescent_moon:", "🌙" }, + { ":cricket:", "🏏" }, + { ":croatia:", "🇭🇷" }, + { ":crocodile:", "🐊" }, + { ":croissant:", "🥐" }, + { ":crossed_fingers:", "🤞" }, + { ":crossed_flags:", "🎌" }, + { ":crossed_swords:", "⚔" }, + { ":crown:", "👑" }, + { ":cry:", "😢" }, + { ":crying_cat_face:", "😿" }, + { ":crystal_ball:", "🔮" }, + { ":cuba:", "🇨🇺" }, + { ":cucumber:", "🥒" }, + { ":cupid:", "💘" }, + { ":curacao:", "🇨🇼" }, + { ":curly_loop:", "➰" }, + { ":currency_exchange:", "💱" }, + { ":curry:", "🍛" }, + { ":custard:", "🍮" }, + { ":customs:", "🛃" }, + { ":cyclone:", "🌀" }, + { ":cyprus:", "🇨🇾" }, + { ":czech_republic:", "🇨🇿" }, + { ":dagger:", "🗡" }, + { ":dancer:", "💃" }, + { ":dancers:", "👯" }, + { ":dancing_men:", "👯♂" }, + { ":dancing_women:", "👯" }, + { ":dango:", "🍡" }, + { ":dark_sunglasses:", "🕶" }, + { ":dart:", "🎯" }, + { ":dash:", "💨" }, + { ":date:", "📅" }, + { ":de:", "🇩🇪" }, + { ":deciduous_tree:", "🌳" }, + { ":deer:", "🦌" }, + { ":denmark:", "🇩🇰" }, + { ":department_store:", "🏬" }, + { ":derelict_house:", "🏚" }, + { ":desert:", "🏜" }, + { ":desert_island:", "🏝" }, + { ":desktop_computer:", "🖥" }, + { ":detective:", "🕵" }, + { ":diamond_shape_with_a_dot_inside:", "💠" }, + { ":diamonds:", "♦" }, + { ":disappointed:", "😞" }, + { ":disappointed_relieved:", "😥" }, + { ":dizzy:", "💫" }, + { ":dizzy_face:", "😵" }, + { ":djibouti:", "🇩🇯" }, + { ":do_not_litter:", "🚯" }, + { ":dog:", "🐶" }, + { ":dog2:", "🐕" }, + { ":dollar:", "💵" }, + { ":dolls:", "🎎" }, + { ":dolphin:", "🐬" }, + { ":dominica:", "🇩🇲" }, + { ":dominican_republic:", "🇩🇴" }, + { ":door:", "🚪" }, + { ":doughnut:", "🍩" }, + { ":dove:", "🕊" }, + { ":dragon:", "🐉" }, + { ":dragon_face:", "🐲" }, + { ":dress:", "👗" }, + { ":dromedary_camel:", "🐪" }, + { ":drooling_face:", "🤤" }, + { ":droplet:", "💧" }, + { ":drum:", "🥁" }, + { ":duck:", "🦆" }, + { ":dvd:", "📀" }, + { ":e-mail:", "📧" }, + { ":eagle:", "🦅" }, + { ":ear:", "👂" }, + { ":ear_of_rice:", "🌾" }, + { ":earth_africa:", "🌍" }, + { ":earth_americas:", "🌎" }, + { ":earth_asia:", "🌏" }, + { ":ecuador:", "🇪🇨" }, + { ":egg:", "🥚" }, + { ":eggplant:", "🍆" }, + { ":egypt:", "🇪🇬" }, + { ":eight:", "8⃣" }, + { ":eight_pointed_black_star:", "✴" }, + { ":eight_spoked_asterisk:", "✳" }, + { ":el_salvador:", "🇸🇻" }, + { ":electric_plug:", "🔌" }, + { ":elephant:", "🐘" }, + { ":email:", "✉" }, + { ":end:", "🔚" }, + { ":envelope:", "✉" }, + { ":envelope_with_arrow:", "📩" }, + { ":equatorial_guinea:", "🇬🇶" }, + { ":eritrea:", "🇪🇷" }, + { ":es:", "🇪🇸" }, + { ":estonia:", "🇪🇪" }, + { ":ethiopia:", "🇪🇹" }, + { ":eu:", "🇪🇺" }, + { ":euro:", "💶" }, + { ":european_castle:", "🏰" }, + { ":european_post_office:", "🏤" }, + { ":european_union:", "🇪🇺" }, + { ":evergreen_tree:", "🌲" }, + { ":exclamation:", "❗" }, + { ":expressionless:", "😑" }, + { ":eye:", "👁" }, + { ":eye_speech_bubble:", "👁🗨" }, + { ":eyeglasses:", "👓" }, + { ":eyes:", "👀" }, + { ":face_with_head_bandage:", "🤕" }, + { ":face_with_thermometer:", "🤒" }, + { ":facepunch:", "👊" }, + { ":factory:", "🏭" }, + { ":falkland_islands:", "🇫🇰" }, + { ":fallen_leaf:", "🍂" }, + { ":family:", "👪" }, + { ":family_man_boy:", "👨👦" }, + { ":family_man_boy_boy:", "👨👦👦" }, + { ":family_man_girl:", "👨👧" }, + { ":family_man_girl_boy:", "👨👧👦" }, + { ":family_man_girl_girl:", "👨👧👧" }, + { ":family_man_man_boy:", "👨👨👦" }, + { ":family_man_man_boy_boy:", "👨👨👦👦" }, + { ":family_man_man_girl:", "👨👨👧" }, + { ":family_man_man_girl_boy:", "👨👨👧👦" }, + { ":family_man_man_girl_girl:", "👨👨👧👧" }, + { ":family_man_woman_boy:", "👪" }, + { ":family_man_woman_boy_boy:", "👨👩👦👦" }, + { ":family_man_woman_girl:", "👨👩👧" }, + { ":family_man_woman_girl_boy:", "👨👩👧👦" }, + { ":family_man_woman_girl_girl:", "👨👩👧👧" }, + { ":family_woman_boy:", "👩👦" }, + { ":family_woman_boy_boy:", "👩👦👦" }, + { ":family_woman_girl:", "👩👧" }, + { ":family_woman_girl_boy:", "👩👧👦" }, + { ":family_woman_girl_girl:", "👩👧👧" }, + { ":family_woman_woman_boy:", "👩👩👦" }, + { ":family_woman_woman_boy_boy:", "👩👩👦👦" }, + { ":family_woman_woman_girl:", "👩👩👧" }, + { ":family_woman_woman_girl_boy:", "👩👩👧👦" }, + { ":family_woman_woman_girl_girl:", "👩👩👧👧" }, + { ":faroe_islands:", "🇫🇴" }, + { ":fast_forward:", "⏩" }, + { ":fax:", "📠" }, + { ":fearful:", "😨" }, + { ":feet:", "🐾" }, + { ":female_detective:", "🕵♀" }, + { ":ferris_wheel:", "🎡" }, + { ":ferry:", "⛴" }, + { ":field_hockey:", "🏑" }, + { ":fiji:", "🇫🇯" }, + { ":file_cabinet:", "🗄" }, + { ":file_folder:", "📁" }, + { ":film_projector:", "📽" }, + { ":film_strip:", "🎞" }, + { ":finland:", "🇫🇮" }, + { ":fire:", "🔥" }, + { ":fire_engine:", "🚒" }, + { ":fireworks:", "🎆" }, + { ":first_quarter_moon:", "🌓" }, + { ":first_quarter_moon_with_face:", "🌛" }, + { ":fish:", "🐟" }, + { ":fish_cake:", "🍥" }, + { ":fishing_pole_and_fish:", "🎣" }, + { ":fist:", "✊" }, + { ":fist_left:", "🤛" }, + { ":fist_oncoming:", "👊" }, + { ":fist_raised:", "✊" }, + { ":fist_right:", "🤜" }, + { ":five:", "5⃣" }, + { ":flags:", "🎏" }, + { ":flashlight:", "🔦" }, + { ":fleur_de_lis:", "⚜" }, + { ":flight_arrival:", "🛬" }, + { ":flight_departure:", "🛫" }, + { ":flipper:", "🐬" }, + { ":floppy_disk:", "💾" }, + { ":flower_playing_cards:", "🎴" }, + { ":flushed:", "😳" }, + { ":fog:", "🌫" }, + { ":foggy:", "🌁" }, + { ":football:", "🏈" }, + { ":footprints:", "👣" }, + { ":fork_and_knife:", "🍴" }, + { ":fountain:", "⛲" }, + { ":fountain_pen:", "🖋" }, + { ":four:", "4⃣" }, + { ":four_leaf_clover:", "🍀" }, + { ":fox_face:", "🦊" }, + { ":fr:", "🇫🇷" }, + { ":framed_picture:", "🖼" }, + { ":free:", "🆓" }, + { ":french_guiana:", "🇬🇫" }, + { ":french_polynesia:", "🇵🇫" }, + { ":french_southern_territories:", "🇹🇫" }, + { ":fried_egg:", "🍳" }, + { ":fried_shrimp:", "🍤" }, + { ":fries:", "🍟" }, + { ":frog:", "🐸" }, + { ":frowning:", "😦" }, + { ":frowning_face:", "☹" }, + { ":frowning_man:", "🙍♂" }, + { ":frowning_woman:", "🙍" }, + { ":fu:", "🖕" }, + { ":fuelpump:", "⛽" }, + { ":full_moon:", "🌕" }, + { ":full_moon_with_face:", "🌝" }, + { ":funeral_urn:", "⚱" }, + { ":gabon:", "🇬🇦" }, + { ":gambia:", "🇬🇲" }, + { ":game_die:", "🎲" }, + { ":gb:", "🇬🇧" }, + { ":gear:", "⚙" }, + { ":gem:", "💎" }, + { ":gemini:", "♊" }, + { ":georgia:", "🇬🇪" }, + { ":ghana:", "🇬🇭" }, + { ":ghost:", "👻" }, + { ":gibraltar:", "🇬🇮" }, + { ":gift:", "🎁" }, + { ":gift_heart:", "💝" }, + { ":girl:", "👧" }, + { ":globe_with_meridians:", "🌐" }, + { ":goal_net:", "🥅" }, + { ":goat:", "🐐" }, + { ":golf:", "⛳" }, + { ":golfing_man:", "🏌" }, + { ":golfing_woman:", "🏌♀" }, + { ":gorilla:", "🦍" }, + { ":grapes:", "🍇" }, + { ":greece:", "🇬🇷" }, + { ":green_apple:", "🍏" }, + { ":green_book:", "📗" }, + { ":green_heart:", "💚" }, + { ":green_salad:", "🥗" }, + { ":greenland:", "🇬🇱" }, + { ":grenada:", "🇬🇩" }, + { ":grey_exclamation:", "❕" }, + { ":grey_question:", "❔" }, + { ":grimacing:", "😬" }, + { ":grin:", "😁" }, + { ":grinning:", "😀" }, + { ":guadeloupe:", "🇬🇵" }, + { ":guam:", "🇬🇺" }, + { ":guardsman:", "💂" }, + { ":guardswoman:", "💂♀" }, + { ":guatemala:", "🇬🇹" }, + { ":guernsey:", "🇬🇬" }, + { ":guinea:", "🇬🇳" }, + { ":guinea_bissau:", "🇬🇼" }, + { ":guitar:", "🎸" }, + { ":gun:", "🔫" }, + { ":guyana:", "🇬🇾" }, + { ":haircut:", "💇" }, + { ":haircut_man:", "💇♂" }, + { ":haircut_woman:", "💇" }, + { ":haiti:", "🇭🇹" }, + { ":hamburger:", "🍔" }, + { ":hammer:", "🔨" }, + { ":hammer_and_pick:", "⚒" }, + { ":hammer_and_wrench:", "🛠" }, + { ":hamster:", "🐹" }, + { ":hand:", "✋" }, + { ":handbag:", "👜" }, + { ":handshake:", "🤝" }, + { ":hankey:", "💩" }, + { ":hash:", "#⃣" }, + { ":hatched_chick:", "🐥" }, + { ":hatching_chick:", "🐣" }, + { ":headphones:", "🎧" }, + { ":hear_no_evil:", "🙉" }, + { ":heart:", "❤" }, + { ":heart_decoration:", "💟" }, + { ":heart_eyes:", "😍" }, + { ":heart_eyes_cat:", "😻" }, + { ":heartbeat:", "💓" }, + { ":heartpulse:", "💗" }, + { ":hearts:", "♥" }, + { ":heavy_check_mark:", "✔" }, + { ":heavy_division_sign:", "➗" }, + { ":heavy_dollar_sign:", "💲" }, + { ":heavy_exclamation_mark:", "❗" }, + { ":heavy_heart_exclamation:", "❣" }, + { ":heavy_minus_sign:", "➖" }, + { ":heavy_multiplication_x:", "✖" }, + { ":heavy_plus_sign:", "➕" }, + { ":helicopter:", "🚁" }, + { ":herb:", "🌿" }, + { ":hibiscus:", "🌺" }, + { ":high_brightness:", "🔆" }, + { ":high_heel:", "👠" }, + { ":hocho:", "🔪" }, + { ":hole:", "🕳" }, + { ":honduras:", "🇭🇳" }, + { ":honey_pot:", "🍯" }, + { ":honeybee:", "🐝" }, + { ":hong_kong:", "🇭🇰" }, + { ":horse:", "🐴" }, + { ":horse_racing:", "🏇" }, + { ":hospital:", "🏥" }, + { ":hot_pepper:", "🌶" }, + { ":hotdog:", "🌭" }, + { ":hotel:", "🏨" }, + { ":hotsprings:", "♨" }, + { ":hourglass:", "⌛" }, + { ":hourglass_flowing_sand:", "⏳" }, + { ":house:", "🏠" }, + { ":house_with_garden:", "🏡" }, + { ":houses:", "🏘" }, + { ":hugs:", "🤗" }, + { ":hungary:", "🇭🇺" }, + { ":hushed:", "😯" }, + { ":ice_cream:", "🍨" }, + { ":ice_hockey:", "🏒" }, + { ":ice_skate:", "⛸" }, + { ":icecream:", "🍦" }, + { ":iceland:", "🇮🇸" }, + { ":id:", "🆔" }, + { ":ideograph_advantage:", "🉐" }, + { ":imp:", "👿" }, + { ":inbox_tray:", "📥" }, + { ":incoming_envelope:", "📨" }, + { ":india:", "🇮🇳" }, + { ":indonesia:", "🇮🇩" }, + { ":information_desk_person:", "💁" }, + { ":information_source:", "ℹ" }, + { ":innocent:", "😇" }, + { ":interrobang:", "⁉" }, + { ":iphone:", "📱" }, + { ":iran:", "🇮🇷" }, + { ":iraq:", "🇮🇶" }, + { ":ireland:", "🇮🇪" }, + { ":isle_of_man:", "🇮🇲" }, + { ":israel:", "🇮🇱" }, + { ":it:", "🇮🇹" }, + { ":izakaya_lantern:", "🏮" }, + { ":jack_o_lantern:", "🎃" }, + { ":jamaica:", "🇯🇲" }, + { ":japan:", "🗾" }, + { ":japanese_castle:", "🏯" }, + { ":japanese_goblin:", "👺" }, + { ":japanese_ogre:", "👹" }, + { ":jeans:", "👖" }, + { ":jersey:", "🇯🇪" }, + { ":jordan:", "🇯🇴" }, + { ":joy:", "😂" }, + { ":joy_cat:", "😹" }, + { ":joystick:", "🕹" }, + { ":jp:", "🇯🇵" }, + { ":kaaba:", "🕋" }, + { ":kazakhstan:", "🇰🇿" }, + { ":kenya:", "🇰🇪" }, + { ":key:", "🔑" }, + { ":keyboard:", "⌨" }, + { ":keycap_ten:", "🔟" }, + { ":kick_scooter:", "🛴" }, + { ":kimono:", "👘" }, + { ":kiribati:", "🇰🇮" }, + { ":kiss:", "💋" }, + { ":kissing:", "😗" }, + { ":kissing_cat:", "😽" }, + { ":kissing_closed_eyes:", "😚" }, + { ":kissing_heart:", "😘" }, + { ":kissing_smiling_eyes:", "😙" }, + { ":kiwi_fruit:", "🥝" }, + { ":knife:", "🔪" }, + { ":koala:", "🐨" }, + { ":koko:", "🈁" }, + { ":kosovo:", "🇽🇰" }, + { ":kr:", "🇰🇷" }, + { ":kuwait:", "🇰🇼" }, + { ":kyrgyzstan:", "🇰🇬" }, + { ":label:", "🏷" }, + { ":lantern:", "🏮" }, + { ":laos:", "🇱🇦" }, + { ":large_blue_circle:", "🔵" }, + { ":large_blue_diamond:", "🔷" }, + { ":large_orange_diamond:", "🔶" }, + { ":last_quarter_moon:", "🌗" }, + { ":last_quarter_moon_with_face:", "🌜" }, + { ":latin_cross:", "✝" }, + { ":latvia:", "🇱🇻" }, + { ":laughing:", "😆" }, + { ":leaves:", "🍃" }, + { ":lebanon:", "🇱🇧" }, + { ":ledger:", "📒" }, + { ":left_luggage:", "🛅" }, + { ":left_right_arrow:", "↔" }, + { ":leftwards_arrow_with_hook:", "↩" }, + { ":lemon:", "🍋" }, + { ":leo:", "♌" }, + { ":leopard:", "🐆" }, + { ":lesotho:", "🇱🇸" }, + { ":level_slider:", "🎚" }, + { ":liberia:", "🇱🇷" }, + { ":libra:", "♎" }, + { ":libya:", "🇱🇾" }, + { ":liechtenstein:", "🇱🇮" }, + { ":light_rail:", "🚈" }, + { ":link:", "🔗" }, + { ":lion:", "🦁" }, + { ":lips:", "👄" }, + { ":lipstick:", "💄" }, + { ":lithuania:", "🇱🇹" }, + { ":lizard:", "🦎" }, + { ":lock:", "🔒" }, + { ":lock_with_ink_pen:", "🔏" }, + { ":lollipop:", "🍭" }, + { ":loop:", "➿" }, + { ":loud_sound:", "🔊" }, + { ":loudspeaker:", "📢" }, + { ":love_hotel:", "🏩" }, + { ":love_letter:", "💌" }, + { ":low_brightness:", "🔅" }, + { ":luxembourg:", "🇱🇺" }, + { ":lying_face:", "🤥" }, + { ":m:", "Ⓜ" }, + { ":macau:", "🇲🇴" }, + { ":macedonia:", "🇲🇰" }, + { ":madagascar:", "🇲🇬" }, + { ":mag:", "🔍" }, + { ":mag_right:", "🔎" }, + { ":mahjong:", "🀄" }, + { ":mailbox:", "📫" }, + { ":mailbox_closed:", "📪" }, + { ":mailbox_with_mail:", "📬" }, + { ":mailbox_with_no_mail:", "📭" }, + { ":malawi:", "🇲🇼" }, + { ":malaysia:", "🇲🇾" }, + { ":maldives:", "🇲🇻" }, + { ":male_detective:", "🕵" }, + { ":mali:", "🇲🇱" }, + { ":malta:", "🇲🇹" }, + { ":man:", "👨" }, + { ":man_artist:", "👨🎨" }, + { ":man_astronaut:", "👨🚀" }, + { ":man_cartwheeling:", "🤸♂" }, + { ":man_cook:", "👨🍳" }, + { ":man_dancing:", "🕺" }, + { ":man_facepalming:", "🤦♂" }, + { ":man_factory_worker:", "👨🏭" }, + { ":man_farmer:", "👨🌾" }, + { ":man_firefighter:", "👨🚒" }, + { ":man_health_worker:", "👨⚕" }, + { ":man_in_tuxedo:", "🤵" }, + { ":man_judge:", "👨⚖" }, + { ":man_juggling:", "🤹♂" }, + { ":man_mechanic:", "👨🔧" }, + { ":man_office_worker:", "👨💼" }, + { ":man_pilot:", "👨✈" }, + { ":man_playing_handball:", "🤾♂" }, + { ":man_playing_water_polo:", "🤽♂" }, + { ":man_scientist:", "👨🔬" }, + { ":man_shrugging:", "🤷♂" }, + { ":man_singer:", "👨🎤" }, + { ":man_student:", "👨🎓" }, + { ":man_teacher:", "👨🏫" }, + { ":man_technologist:", "👨💻" }, + { ":man_with_gua_pi_mao:", "👲" }, + { ":man_with_turban:", "👳" }, + { ":mandarin:", "🍊" }, + { ":mans_shoe:", "👞" }, + { ":mantelpiece_clock:", "🕰" }, + { ":maple_leaf:", "🍁" }, + { ":marshall_islands:", "🇲🇭" }, + { ":martial_arts_uniform:", "🥋" }, + { ":martinique:", "🇲🇶" }, + { ":mask:", "😷" }, + { ":massage:", "💆" }, + { ":massage_man:", "💆♂" }, + { ":massage_woman:", "💆" }, + { ":mauritania:", "🇲🇷" }, + { ":mauritius:", "🇲🇺" }, + { ":mayotte:", "🇾🇹" }, + { ":meat_on_bone:", "🍖" }, + { ":medal_military:", "🎖" }, + { ":medal_sports:", "🏅" }, + { ":mega:", "📣" }, + { ":melon:", "🍈" }, + { ":memo:", "📝" }, + { ":men_wrestling:", "🤼♂" }, + { ":menorah:", "🕎" }, + { ":mens:", "🚹" }, + { ":metal:", "🤘" }, + { ":metro:", "🚇" }, + { ":mexico:", "🇲🇽" }, + { ":micronesia:", "🇫🇲" }, + { ":microphone:", "🎤" }, + { ":microscope:", "🔬" }, + { ":middle_finger:", "🖕" }, + { ":milk_glass:", "🥛" }, + { ":milky_way:", "🌌" }, + { ":minibus:", "🚐" }, + { ":minidisc:", "💽" }, + { ":mobile_phone_off:", "📴" }, + { ":moldova:", "🇲🇩" }, + { ":monaco:", "🇲🇨" }, + { ":money_mouth_face:", "🤑" }, + { ":money_with_wings:", "💸" }, + { ":moneybag:", "💰" }, + { ":mongolia:", "🇲🇳" }, + { ":monkey:", "🐒" }, + { ":monkey_face:", "🐵" }, + { ":monorail:", "🚝" }, + { ":montenegro:", "🇲🇪" }, + { ":montserrat:", "🇲🇸" }, + { ":moon:", "🌔" }, + { ":morocco:", "🇲🇦" }, + { ":mortar_board:", "🎓" }, + { ":mosque:", "🕌" }, + { ":motor_boat:", "🛥" }, + { ":motor_scooter:", "🛵" }, + { ":motorcycle:", "🏍" }, + { ":motorway:", "🛣" }, + { ":mount_fuji:", "🗻" }, + { ":mountain:", "⛰" }, + { ":mountain_bicyclist:", "🚵" }, + { ":mountain_biking_man:", "🚵" }, + { ":mountain_biking_woman:", "🚵♀" }, + { ":mountain_cableway:", "🚠" }, + { ":mountain_railway:", "🚞" }, + { ":mountain_snow:", "🏔" }, + { ":mouse:", "🐭" }, + { ":mouse2:", "🐁" }, + { ":movie_camera:", "🎥" }, + { ":moyai:", "🗿" }, + { ":mozambique:", "🇲🇿" }, + { ":mrs_claus:", "🤶" }, + { ":muscle:", "💪" }, + { ":mushroom:", "🍄" }, + { ":musical_keyboard:", "🎹" }, + { ":musical_note:", "🎵" }, + { ":musical_score:", "🎼" }, + { ":mute:", "🔇" }, + { ":myanmar:", "🇲🇲" }, + { ":nail_care:", "💅" }, + { ":name_badge:", "📛" }, + { ":namibia:", "🇳🇦" }, + { ":national_park:", "🏞" }, + { ":nauru:", "🇳🇷" }, + { ":nauseated_face:", "🤢" }, + { ":necktie:", "👔" }, + { ":negative_squared_cross_mark:", "❎" }, + { ":nepal:", "🇳🇵" }, + { ":nerd_face:", "🤓" }, + { ":netherlands:", "🇳🇱" }, + { ":neutral_face:", "😐" }, + { ":new:", "🆕" }, + { ":new_caledonia:", "🇳🇨" }, + { ":new_moon:", "🌑" }, + { ":new_moon_with_face:", "🌚" }, + { ":new_zealand:", "🇳🇿" }, + { ":newspaper:", "📰" }, + { ":newspaper_roll:", "🗞" }, + { ":next_track_button:", "⏭" }, + { ":ng:", "🆖" }, + { ":ng_man:", "🙅♂" }, + { ":ng_woman:", "🙅" }, + { ":nicaragua:", "🇳🇮" }, + { ":niger:", "🇳🇪" }, + { ":nigeria:", "🇳🇬" }, + { ":night_with_stars:", "🌃" }, + { ":nine:", "9⃣" }, + { ":niue:", "🇳🇺" }, + { ":no_bell:", "🔕" }, + { ":no_bicycles:", "🚳" }, + { ":no_entry:", "⛔" }, + { ":no_entry_sign:", "🚫" }, + { ":no_good:", "🙅" }, + { ":no_good_man:", "🙅♂" }, + { ":no_good_woman:", "🙅" }, + { ":no_mobile_phones:", "📵" }, + { ":no_mouth:", "😶" }, + { ":no_pedestrians:", "🚷" }, + { ":no_smoking:", "🚭" }, + { ":non-potable_water:", "🚱" }, + { ":norfolk_island:", "🇳🇫" }, + { ":north_korea:", "🇰🇵" }, + { ":northern_mariana_islands:", "🇲🇵" }, + { ":norway:", "🇳🇴" }, + { ":nose:", "👃" }, + { ":notebook:", "📓" }, + { ":notebook_with_decorative_cover:", "📔" }, + { ":notes:", "🎶" }, + { ":nut_and_bolt:", "🔩" }, + { ":o:", "⭕" }, + { ":o2:", "🅾" }, + { ":ocean:", "🌊" }, + { ":octopus:", "🐙" }, + { ":oden:", "🍢" }, + { ":office:", "🏢" }, + { ":oil_drum:", "🛢" }, + { ":ok:", "🆗" }, + { ":ok_hand:", "👌" }, + { ":ok_man:", "🙆♂" }, + { ":ok_woman:", "🙆" }, + { ":old_key:", "🗝" }, + { ":older_man:", "👴" }, + { ":older_woman:", "👵" }, + { ":om:", "🕉" }, + { ":oman:", "🇴🇲" }, + { ":on:", "🔛" }, + { ":oncoming_automobile:", "🚘" }, + { ":oncoming_bus:", "🚍" }, + { ":oncoming_police_car:", "🚔" }, + { ":oncoming_taxi:", "🚖" }, + { ":one:", "1⃣" }, + { ":open_book:", "📖" }, + { ":open_file_folder:", "📂" }, + { ":open_hands:", "👐" }, + { ":open_mouth:", "😮" }, + { ":open_umbrella:", "☂" }, + { ":ophiuchus:", "⛎" }, + { ":orange:", "🍊" }, + { ":orange_book:", "📙" }, + { ":orthodox_cross:", "☦" }, + { ":outbox_tray:", "📤" }, + { ":owl:", "🦉" }, + { ":ox:", "🐂" }, + { ":package:", "📦" }, + { ":page_facing_up:", "📄" }, + { ":page_with_curl:", "📃" }, + { ":pager:", "📟" }, + { ":paintbrush:", "🖌" }, + { ":pakistan:", "🇵🇰" }, + { ":palau:", "🇵🇼" }, + { ":palestinian_territories:", "🇵🇸" }, + { ":palm_tree:", "🌴" }, + { ":panama:", "🇵🇦" }, + { ":pancakes:", "🥞" }, + { ":panda_face:", "🐼" }, + { ":paperclip:", "📎" }, + { ":paperclips:", "🖇" }, + { ":papua_new_guinea:", "🇵🇬" }, + { ":paraguay:", "🇵🇾" }, + { ":parasol_on_ground:", "⛱" }, + { ":parking:", "🅿" }, + { ":part_alternation_mark:", "〽" }, + { ":partly_sunny:", "⛅" }, + { ":passenger_ship:", "🛳" }, + { ":passport_control:", "🛂" }, + { ":pause_button:", "⏸" }, + { ":paw_prints:", "🐾" }, + { ":peace_symbol:", "☮" }, + { ":peach:", "🍑" }, + { ":peanuts:", "🥜" }, + { ":pear:", "🍐" }, + { ":pen:", "🖊" }, + { ":pencil:", "📝" }, + { ":pencil2:", "✏" }, + { ":penguin:", "🐧" }, + { ":pensive:", "😔" }, + { ":performing_arts:", "🎭" }, + { ":persevere:", "😣" }, + { ":person_fencing:", "🤺" }, + { ":person_frowning:", "🙍" }, + { ":person_with_blond_hair:", "👱" }, + { ":person_with_pouting_face:", "🙎" }, + { ":peru:", "🇵🇪" }, + { ":philippines:", "🇵🇭" }, + { ":phone:", "☎" }, + { ":pick:", "⛏" }, + { ":pig:", "🐷" }, + { ":pig2:", "🐖" }, + { ":pig_nose:", "🐽" }, + { ":pill:", "💊" }, + { ":pineapple:", "🍍" }, + { ":ping_pong:", "🏓" }, + { ":pisces:", "♓" }, + { ":pitcairn_islands:", "🇵🇳" }, + { ":pizza:", "🍕" }, + { ":place_of_worship:", "🛐" }, + { ":plate_with_cutlery:", "🍽" }, + { ":play_or_pause_button:", "⏯" }, + { ":point_down:", "👇" }, + { ":point_left:", "👈" }, + { ":point_right:", "👉" }, + { ":point_up:", "☝" }, + { ":point_up_2:", "👆" }, + { ":poland:", "🇵🇱" }, + { ":police_car:", "🚓" }, + { ":policeman:", "👮" }, + { ":policewoman:", "👮♀" }, + { ":poodle:", "🐩" }, + { ":poop:", "💩" }, + { ":popcorn:", "🍿" }, + { ":portugal:", "🇵🇹" }, + { ":post_office:", "🏣" }, + { ":postal_horn:", "📯" }, + { ":postbox:", "📮" }, + { ":potable_water:", "🚰" }, + { ":potato:", "🥔" }, + { ":pouch:", "👝" }, + { ":poultry_leg:", "🍗" }, + { ":pound:", "💷" }, + { ":pout:", "😡" }, + { ":pouting_cat:", "😾" }, + { ":pouting_man:", "🙎♂" }, + { ":pouting_woman:", "🙎" }, + { ":pray:", "🙏" }, + { ":prayer_beads:", "📿" }, + { ":pregnant_woman:", "🤰" }, + { ":previous_track_button:", "⏮" }, + { ":prince:", "🤴" }, + { ":princess:", "👸" }, + { ":printer:", "🖨" }, + { ":puerto_rico:", "🇵🇷" }, + { ":punch:", "👊" }, + { ":purple_heart:", "💜" }, + { ":purse:", "👛" }, + { ":pushpin:", "📌" }, + { ":put_litter_in_its_place:", "🚮" }, + { ":qatar:", "🇶🇦" }, + { ":question:", "❓" }, + { ":rabbit:", "🐰" }, + { ":rabbit2:", "🐇" }, + { ":racehorse:", "🐎" }, + { ":racing_car:", "🏎" }, + { ":radio:", "📻" }, + { ":radio_button:", "🔘" }, + { ":radioactive:", "☢" }, + { ":rage:", "😡" }, + { ":railway_car:", "🚃" }, + { ":railway_track:", "🛤" }, + { ":rainbow:", "🌈" }, + { ":rainbow_flag:", "🏳🌈" }, + { ":raised_back_of_hand:", "🤚" }, + { ":raised_hand:", "✋" }, + { ":raised_hand_with_fingers_splayed:", "🖐" }, + { ":raised_hands:", "🙌" }, + { ":raising_hand:", "🙋" }, + { ":raising_hand_man:", "🙋♂" }, + { ":raising_hand_woman:", "🙋" }, + { ":ram:", "🐏" }, + { ":ramen:", "🍜" }, + { ":rat:", "🐀" }, + { ":record_button:", "⏺" }, + { ":recycle:", "♻" }, + { ":red_car:", "🚗" }, + { ":red_circle:", "🔴" }, + { ":registered:", "®" }, + { ":relaxed:", "☺" }, + { ":relieved:", "😌" }, + { ":reminder_ribbon:", "🎗" }, + { ":repeat:", "🔁" }, + { ":repeat_one:", "🔂" }, + { ":rescue_worker_helmet:", "⛑" }, + { ":restroom:", "🚻" }, + { ":reunion:", "🇷🇪" }, + { ":revolving_hearts:", "💞" }, + { ":rewind:", "⏪" }, + { ":rhinoceros:", "🦏" }, + { ":ribbon:", "🎀" }, + { ":rice:", "🍚" }, + { ":rice_ball:", "🍙" }, + { ":rice_cracker:", "🍘" }, + { ":rice_scene:", "🎑" }, + { ":right_anger_bubble:", "🗯" }, + { ":ring:", "💍" }, + { ":robot:", "🤖" }, + { ":rocket:", "🚀" }, + { ":rofl:", "🤣" }, + { ":roll_eyes:", "🙄" }, + { ":roller_coaster:", "🎢" }, + { ":romania:", "🇷🇴" }, + { ":rooster:", "🐓" }, + { ":rose:", "🌹" }, + { ":rosette:", "🏵" }, + { ":rotating_light:", "🚨" }, + { ":round_pushpin:", "📍" }, + { ":rowboat:", "🚣" }, + { ":rowing_man:", "🚣" }, + { ":rowing_woman:", "🚣♀" }, + { ":ru:", "🇷🇺" }, + { ":rugby_football:", "🏉" }, + { ":runner:", "🏃" }, + { ":running:", "🏃" }, + { ":running_man:", "🏃" }, + { ":running_shirt_with_sash:", "🎽" }, + { ":running_woman:", "🏃♀" }, + { ":rwanda:", "🇷🇼" }, + { ":sa:", "🈂" }, + { ":sagittarius:", "♐" }, + { ":sailboat:", "⛵" }, + { ":sake:", "🍶" }, + { ":samoa:", "🇼🇸" }, + { ":san_marino:", "🇸🇲" }, + { ":sandal:", "👡" }, + { ":santa:", "🎅" }, + { ":sao_tome_principe:", "🇸🇹" }, + { ":satellite:", "📡" }, + { ":satisfied:", "😆" }, + { ":saudi_arabia:", "🇸🇦" }, + { ":saxophone:", "🎷" }, + { ":school:", "🏫" }, + { ":school_satchel:", "🎒" }, + { ":scissors:", "✂" }, + { ":scorpion:", "🦂" }, + { ":scorpius:", "♏" }, + { ":scream:", "😱" }, + { ":scream_cat:", "🙀" }, + { ":scroll:", "📜" }, + { ":seat:", "💺" }, + { ":secret:", "㊙" }, + { ":see_no_evil:", "🙈" }, + { ":seedling:", "🌱" }, + { ":selfie:", "🤳" }, + { ":senegal:", "🇸🇳" }, + { ":serbia:", "🇷🇸" }, + { ":seven:", "7⃣" }, + { ":seychelles:", "🇸🇨" }, + { ":shallow_pan_of_food:", "🥘" }, + { ":shamrock:", "☘" }, + { ":shark:", "🦈" }, + { ":shaved_ice:", "🍧" }, + { ":sheep:", "🐑" }, + { ":shell:", "🐚" }, + { ":shield:", "🛡" }, + { ":shinto_shrine:", "⛩" }, + { ":ship:", "🚢" }, + { ":shirt:", "👕" }, + { ":shit:", "💩" }, + { ":shoe:", "👞" }, + { ":shopping:", "🛍" }, + { ":shopping_cart:", "🛒" }, + { ":shower:", "🚿" }, + { ":shrimp:", "🦐" }, + { ":sierra_leone:", "🇸🇱" }, + { ":signal_strength:", "📶" }, + { ":singapore:", "🇸🇬" }, + { ":sint_maarten:", "🇸🇽" }, + { ":six:", "6⃣" }, + { ":six_pointed_star:", "🔯" }, + { ":ski:", "🎿" }, + { ":skier:", "⛷" }, + { ":skull:", "💀" }, + { ":skull_and_crossbones:", "☠" }, + { ":sleeping:", "😴" }, + { ":sleeping_bed:", "🛌" }, + { ":sleepy:", "😪" }, + { ":slightly_frowning_face:", "🙁" }, + { ":slightly_smiling_face:", "🙂" }, + { ":slot_machine:", "🎰" }, + { ":slovakia:", "🇸🇰" }, + { ":slovenia:", "🇸🇮" }, + { ":small_airplane:", "🛩" }, + { ":small_blue_diamond:", "🔹" }, + { ":small_orange_diamond:", "🔸" }, + { ":small_red_triangle:", "🔺" }, + { ":small_red_triangle_down:", "🔻" }, + { ":smile:", "😄" }, + { ":smile_cat:", "😸" }, + { ":smiley:", "😃" }, + { ":smiley_cat:", "😺" }, + { ":smiling_imp:", "😈" }, + { ":smirk:", "😏" }, + { ":smirk_cat:", "😼" }, + { ":smoking:", "🚬" }, + { ":snail:", "🐌" }, + { ":snake:", "🐍" }, + { ":sneezing_face:", "🤧" }, + { ":snowboarder:", "🏂" }, + { ":snowflake:", "❄" }, + { ":snowman:", "⛄" }, + { ":snowman_with_snow:", "☃" }, + { ":sob:", "😭" }, + { ":soccer:", "⚽" }, + { ":solomon_islands:", "🇸🇧" }, + { ":somalia:", "🇸🇴" }, + { ":soon:", "🔜" }, + { ":sos:", "🆘" }, + { ":sound:", "🔉" }, + { ":south_africa:", "🇿🇦" }, + { ":south_georgia_south_sandwich_islands:", "🇬🇸" }, + { ":south_sudan:", "🇸🇸" }, + { ":space_invader:", "👾" }, + { ":spades:", "♠" }, + { ":spaghetti:", "🍝" }, + { ":sparkle:", "❇" }, + { ":sparkler:", "🎇" }, + { ":sparkles:", "✨" }, + { ":sparkling_heart:", "💖" }, + { ":speak_no_evil:", "🙊" }, + { ":speaker:", "🔈" }, + { ":speaking_head:", "🗣" }, + { ":speech_balloon:", "💬" }, + { ":speedboat:", "🚤" }, + { ":spider:", "🕷" }, + { ":spider_web:", "🕸" }, + { ":spiral_calendar:", "🗓" }, + { ":spiral_notepad:", "🗒" }, + { ":spoon:", "🥄" }, + { ":squid:", "🦑" }, + { ":sri_lanka:", "🇱🇰" }, + { ":st_barthelemy:", "🇧🇱" }, + { ":st_helena:", "🇸🇭" }, + { ":st_kitts_nevis:", "🇰🇳" }, + { ":st_lucia:", "🇱🇨" }, + { ":st_pierre_miquelon:", "🇵🇲" }, + { ":st_vincent_grenadines:", "🇻🇨" }, + { ":stadium:", "🏟" }, + { ":star:", "⭐" }, + { ":star2:", "🌟" }, + { ":star_and_crescent:", "☪" }, + { ":star_of_david:", "✡" }, + { ":stars:", "🌠" }, + { ":station:", "🚉" }, + { ":statue_of_liberty:", "🗽" }, + { ":steam_locomotive:", "🚂" }, + { ":stew:", "🍲" }, + { ":stop_button:", "⏹" }, + { ":stop_sign:", "🛑" }, + { ":stopwatch:", "⏱" }, + { ":straight_ruler:", "📏" }, + { ":strawberry:", "🍓" }, + { ":stuck_out_tongue:", "😛" }, + { ":stuck_out_tongue_closed_eyes:", "😝" }, + { ":stuck_out_tongue_winking_eye:", "😜" }, + { ":studio_microphone:", "🎙" }, + { ":stuffed_flatbread:", "🥙" }, + { ":sudan:", "🇸🇩" }, + { ":sun_behind_large_cloud:", "🌥" }, + { ":sun_behind_rain_cloud:", "🌦" }, + { ":sun_behind_small_cloud:", "🌤" }, + { ":sun_with_face:", "🌞" }, + { ":sunflower:", "🌻" }, + { ":sunglasses:", "😎" }, + { ":sunny:", "☀" }, + { ":sunrise:", "🌅" }, + { ":sunrise_over_mountains:", "🌄" }, + { ":surfer:", "🏄" }, + { ":surfing_man:", "🏄" }, + { ":surfing_woman:", "🏄♀" }, + { ":suriname:", "🇸🇷" }, + { ":sushi:", "🍣" }, + { ":suspension_railway:", "🚟" }, + { ":swaziland:", "🇸🇿" }, + { ":sweat:", "😓" }, + { ":sweat_drops:", "💦" }, + { ":sweat_smile:", "😅" }, + { ":sweden:", "🇸🇪" }, + { ":sweet_potato:", "🍠" }, + { ":swimmer:", "🏊" }, + { ":swimming_man:", "🏊" }, + { ":swimming_woman:", "🏊♀" }, + { ":switzerland:", "🇨🇭" }, + { ":symbols:", "🔣" }, + { ":synagogue:", "🕍" }, + { ":syria:", "🇸🇾" }, + { ":syringe:", "💉" }, + { ":taco:", "🌮" }, + { ":tada:", "🎉" }, + { ":taiwan:", "🇹🇼" }, + { ":tajikistan:", "🇹🇯" }, + { ":tanabata_tree:", "🎋" }, + { ":tangerine:", "🍊" }, + { ":tanzania:", "🇹🇿" }, + { ":taurus:", "♉" }, + { ":taxi:", "🚕" }, + { ":tea:", "🍵" }, + { ":telephone:", "☎" }, + { ":telephone_receiver:", "📞" }, + { ":telescope:", "🔭" }, + { ":tennis:", "🎾" }, + { ":tent:", "⛺" }, + { ":thailand:", "🇹🇭" }, + { ":thermometer:", "🌡" }, + { ":thinking:", "🤔" }, + { ":thought_balloon:", "💭" }, + { ":three:", "3⃣" }, + { ":thumbsdown:", "👎" }, + { ":thumbsup:", "👍" }, + { ":ticket:", "🎫" }, + { ":tickets:", "🎟" }, + { ":tiger:", "🐯" }, + { ":tiger2:", "🐅" }, + { ":timer_clock:", "⏲" }, + { ":timor_leste:", "🇹🇱" }, + { ":tipping_hand_man:", "💁♂" }, + { ":tipping_hand_woman:", "💁" }, + { ":tired_face:", "😫" }, + { ":tm:", "™" }, + { ":togo:", "🇹🇬" }, + { ":toilet:", "🚽" }, + { ":tokelau:", "🇹🇰" }, + { ":tokyo_tower:", "🗼" }, + { ":tomato:", "🍅" }, + { ":tonga:", "🇹🇴" }, + { ":tongue:", "👅" }, + { ":top:", "🔝" }, + { ":tophat:", "🎩" }, + { ":tornado:", "🌪" }, + { ":tr:", "🇹🇷" }, + { ":trackball:", "🖲" }, + { ":tractor:", "🚜" }, + { ":traffic_light:", "🚥" }, + { ":train:", "🚋" }, + { ":train2:", "🚆" }, + { ":tram:", "🚊" }, + { ":triangular_flag_on_post:", "🚩" }, + { ":triangular_ruler:", "📐" }, + { ":trident:", "🔱" }, + { ":trinidad_tobago:", "🇹🇹" }, + { ":triumph:", "😤" }, + { ":trolleybus:", "🚎" }, + { ":trophy:", "🏆" }, + { ":tropical_drink:", "🍹" }, + { ":tropical_fish:", "🐠" }, + { ":truck:", "🚚" }, + { ":trumpet:", "🎺" }, + { ":tshirt:", "👕" }, + { ":tulip:", "🌷" }, + { ":tumbler_glass:", "🥃" }, + { ":tunisia:", "🇹🇳" }, + { ":turkey:", "🦃" }, + { ":turkmenistan:", "🇹🇲" }, + { ":turks_caicos_islands:", "🇹🇨" }, + { ":turtle:", "🐢" }, + { ":tuvalu:", "🇹🇻" }, + { ":tv:", "📺" }, + { ":twisted_rightwards_arrows:", "🔀" }, + { ":two:", "2⃣" }, + { ":two_hearts:", "💕" }, + { ":two_men_holding_hands:", "👬" }, + { ":two_women_holding_hands:", "👭" }, + { ":u5272:", "🈹" }, + { ":u5408:", "🈴" }, + { ":u55b6:", "🈺" }, + { ":u6307:", "🈯" }, + { ":u6708:", "🈷" }, + { ":u6709:", "🈶" }, + { ":u6e80:", "🈵" }, + { ":u7121:", "🈚" }, + { ":u7533:", "🈸" }, + { ":u7981:", "🈲" }, + { ":u7a7a:", "🈳" }, + { ":uganda:", "🇺🇬" }, + { ":uk:", "🇬🇧" }, + { ":ukraine:", "🇺🇦" }, + { ":umbrella:", "☔" }, + { ":unamused:", "😒" }, + { ":underage:", "🔞" }, + { ":unicorn:", "🦄" }, + { ":united_arab_emirates:", "🇦🇪" }, + { ":unlock:", "🔓" }, + { ":up:", "🆙" }, + { ":upside_down_face:", "🙃" }, + { ":uruguay:", "🇺🇾" }, + { ":us:", "🇺🇸" }, + { ":us_virgin_islands:", "🇻🇮" }, + { ":uzbekistan:", "🇺🇿" }, + { ":v:", "✌" }, + { ":vanuatu:", "🇻🇺" }, + { ":vatican_city:", "🇻🇦" }, + { ":venezuela:", "🇻🇪" }, + { ":vertical_traffic_light:", "🚦" }, + { ":vhs:", "📼" }, + { ":vibration_mode:", "📳" }, + { ":video_camera:", "📹" }, + { ":video_game:", "🎮" }, + { ":vietnam:", "🇻🇳" }, + { ":violin:", "🎻" }, + { ":virgo:", "♍" }, + { ":volcano:", "🌋" }, + { ":volleyball:", "🏐" }, + { ":vs:", "🆚" }, + { ":vulcan_salute:", "🖖" }, + { ":walking:", "🚶" }, + { ":walking_man:", "🚶" }, + { ":walking_woman:", "🚶♀" }, + { ":wallis_futuna:", "🇼🇫" }, + { ":waning_crescent_moon:", "🌘" }, + { ":waning_gibbous_moon:", "🌖" }, + { ":warning:", "⚠" }, + { ":wastebasket:", "🗑" }, + { ":watch:", "⌚" }, + { ":water_buffalo:", "🐃" }, + { ":watermelon:", "🍉" }, + { ":wave:", "👋" }, + { ":wavy_dash:", "〰" }, + { ":waxing_crescent_moon:", "🌒" }, + { ":waxing_gibbous_moon:", "🌔" }, + { ":wc:", "🚾" }, + { ":weary:", "😩" }, + { ":wedding:", "💒" }, + { ":weight_lifting_man:", "🏋" }, + { ":weight_lifting_woman:", "🏋♀" }, + { ":western_sahara:", "🇪🇭" }, + { ":whale:", "🐳" }, + { ":whale2:", "🐋" }, + { ":wheel_of_dharma:", "☸" }, + { ":wheelchair:", "♿" }, + { ":white_check_mark:", "✅" }, + { ":white_circle:", "⚪" }, + { ":white_flag:", "🏳" }, + { ":white_flower:", "💮" }, + { ":white_large_square:", "⬜" }, + { ":white_medium_small_square:", "◽" }, + { ":white_medium_square:", "◻" }, + { ":white_small_square:", "▫" }, + { ":white_square_button:", "🔳" }, + { ":wilted_flower:", "🥀" }, + { ":wind_chime:", "🎐" }, + { ":wind_face:", "🌬" }, + { ":wine_glass:", "🍷" }, + { ":wink:", "😉" }, + { ":wolf:", "🐺" }, + { ":woman:", "👩" }, + { ":woman_artist:", "👩🎨" }, + { ":woman_astronaut:", "👩🚀" }, + { ":woman_cartwheeling:", "🤸♀" }, + { ":woman_cook:", "👩🍳" }, + { ":woman_facepalming:", "🤦♀" }, + { ":woman_factory_worker:", "👩🏭" }, + { ":woman_farmer:", "👩🌾" }, + { ":woman_firefighter:", "👩🚒" }, + { ":woman_health_worker:", "👩⚕" }, + { ":woman_judge:", "👩⚖" }, + { ":woman_juggling:", "🤹♀" }, + { ":woman_mechanic:", "👩🔧" }, + { ":woman_office_worker:", "👩💼" }, + { ":woman_pilot:", "👩✈" }, + { ":woman_playing_handball:", "🤾♀" }, + { ":woman_playing_water_polo:", "🤽♀" }, + { ":woman_scientist:", "👩🔬" }, + { ":woman_shrugging:", "🤷♀" }, + { ":woman_singer:", "👩🎤" }, + { ":woman_student:", "👩🎓" }, + { ":woman_teacher:", "👩🏫" }, + { ":woman_technologist:", "👩💻" }, + { ":woman_with_turban:", "👳♀" }, + { ":womans_clothes:", "👚" }, + { ":womans_hat:", "👒" }, + { ":women_wrestling:", "🤼♀" }, + { ":womens:", "🚺" }, + { ":world_map:", "🗺" }, + { ":worried:", "😟" }, + { ":wrench:", "🔧" }, + { ":writing_hand:", "✍" }, + { ":x:", "❌" }, + { ":yellow_heart:", "💛" }, + { ":yemen:", "🇾🇪" }, + { ":yen:", "💴" }, + { ":yin_yang:", "☯" }, + { ":yum:", "😋" }, + { ":zambia:", "🇿🇲" }, + { ":zap:", "⚡" }, + { ":zero:", "0⃣" }, + { ":zimbabwe:", "🇿🇼" }, + { ":zipper_mouth_face:", "🤐" }, + { ":zzz:", "💤" } +}; + +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 9d15ec8..b3693cd 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -73,11 +73,14 @@ Entry::Entry(const Entry &e) spec = e.spec; initLines = e.initLines; stat = e.stat; + localToc = e.localToc; explicitExternal = e.explicitExternal; proto = e.proto; subGrouping = e.subGrouping; callGraph = e.callGraph; callerGraph = e.callerGraph; + referencedByRelation = e.referencedByRelation; + referencesRelation = e.referencesRelation; virt = e.virt; args = e.args; bitfields = e.bitfields; @@ -167,7 +170,7 @@ Entry::Entry(const Entry &e) SectionInfo *s; for (;(s=sli2.current());++sli2) { - anchors->append(new SectionInfo(*s)); + anchors->append(s); // shallow copy, object are owned by Doxygen::sectionDict } // deep copy type constraint list @@ -218,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); @@ -249,6 +254,8 @@ void Entry::reset() mGrpId = -1; callGraph = entryCallGraph; callerGraph = entryCallerGraph; + referencedByRelation = entryReferencedByRelation; + referencesRelation = entryReferencesRelation; section = EMPTY_SEC; mtype = Method; virt = Normal; @@ -263,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 f1b81ef..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, @@ -91,14 +91,14 @@ class Entry ENUMDOC_SEC = 0x01000000, ENUM_SEC = 0x02000000, - EMPTY_SEC = 0x03000000, - PAGEDOC_SEC = 0x04000000, + EMPTY_SEC = 0x03000000, + PAGEDOC_SEC = 0x04000000, VARIABLE_SEC = 0x05000000, FUNCTION_SEC = 0x06000000, TYPEDEF_SEC = 0x07000000, - MEMBERDOC_SEC = 0x08000000, + MEMBERDOC_SEC = 0x08000000, OVERLOADDOC_SEC = 0x09000000, - EXAMPLE_SEC = 0x0a000000, + EXAMPLE_SEC = 0x0a000000, VARIABLEDOC_SEC = 0x0b000000, FILEDOC_SEC = 0x0c000000, DEFINEDOC_SEC = 0x0d000000, @@ -112,9 +112,10 @@ class Entry PACKAGE_SEC = 0x15000000, PACKAGEDOC_SEC = 0x16000000, OBJCIMPL_SEC = 0x17000000, - DIRDOC_SEC = 0x18000000 - ,EXPORTED_INTERFACE_SEC = 0x19000000 - ,INCLUDED_SERVICE_SEC = 0x1A000000 + DIRDOC_SEC = 0x18000000, + EXPORTED_INTERFACE_SEC = 0x19000000, + INCLUDED_SERVICE_SEC = 0x1A000000, + EXAMPLE_LINENO_SEC = 0x1B000000, }; // class specifiers (add new items to the end) @@ -133,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 @@ -204,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; } @@ -212,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(); @@ -233,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 @@ -241,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 @@ -276,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 @@ -288,6 +292,8 @@ class Entry bool artificial; //!< Artificially introduced item GroupDocType groupDocType; QCString id; //!< libclang id + LocalToc localToc; + QCString metaData; //!< Slice metadata static int num; //!< counts the total number of entries @@ -295,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"; @@ -305,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; @@ -318,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. @@ -355,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/example.h b/src/example.h index cf30827..321982b 100644 --- a/src/example.h +++ b/src/example.h @@ -36,7 +36,7 @@ struct Example class ExampleSDict : public SDict<Example> { public: - ExampleSDict(int size=17) : SDict<Example>(size) {} + ExampleSDict(int size=17) : SDict<Example>(size) { setAutoDelete(TRUE); } ~ExampleSDict() {} private: int compareValues(const Example *item1,const Example *item2) const diff --git a/src/filedef.cpp b/src/filedef.cpp index 2cfe37a..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); } } @@ -1420,13 +1526,11 @@ bool FileDef::generateSourceFile() const { static bool sourceBrowser = Config_getBool(SOURCE_BROWSER); static bool verbatimHeaders = Config_getBool(VERBATIM_HEADERS); - QCString extension = name().right(4); return !isReference() && (sourceBrowser || (verbatimHeaders && guessSection(name())==Entry::HEADER_SEC) ) && - extension!=".doc" && extension!=".txt" && extension!=".dox" && - extension!=".md" && name().right(9)!=".markdown"; + !isDocumentationFile(); } 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/formula.cpp b/src/formula.cpp index 6fe617d..c252e07 100644 --- a/src/formula.cpp +++ b/src/formula.cpp @@ -69,8 +69,10 @@ void FormulaList::generateBitmaps(const char *path) FTextStream t(&f); if (Config_getBool(LATEX_BATCHMODE)) t << "\\batchmode" << endl; t << "\\documentclass{article}" << endl; + t << "\\usepackage{ifthen}" << endl; t << "\\usepackage{epsfig}" << endl; // for those who want to include images writeExtraLatexPackages(t); + writeLatexSpecialFormulaChars(t); t << "\\pagestyle{empty}" << endl; t << "\\begin{document}" << endl; int page=0; @@ -96,8 +98,7 @@ void FormulaList::generateBitmaps(const char *path) { //printf("Running latex...\n"); //system("latex _formulas.tex </dev/null >/dev/null"); - QCString latexCmd = Config_getString(LATEX_CMD_NAME); - if (latexCmd.isEmpty()) latexCmd="latex"; + QCString latexCmd = "latex"; portable_sysTimerStart(); if (portable_system(latexCmd,"_formulas.tex")!=0) { diff --git a/src/fortrancode.l b/src/fortrancode.l index 501b492..0e610fd 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -37,7 +37,7 @@ #include <ctype.h> #include <qregexp.h> #include <qdir.h> -#include <qstringlist.h> +#include <qcstringlist.h> #include "entry.h" #include "doxygen.h" #include "message.h" @@ -86,7 +86,7 @@ class UseEntry { public: QCString module; // just for debug - QStringList onlyNames; /* entries of the ONLY-part */ + QCStringList onlyNames; /* entries of the ONLY-part */ }; /** @@ -105,10 +105,11 @@ class UseSDict : public SDict<UseEntry> class Scope { public: - QStringList useNames; //!< contains names of used modules + 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,7 +123,8 @@ 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 QStringList *currentUseNames= new QStringList; //! contains names of used modules of current program unit +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 static CodeOutputInterface * g_code; @@ -159,6 +161,9 @@ static char stringStartSymbol; // single or double quote // declared from referenced names static int bracketCount = 0; +// signal when in type / class /procedure declaration +static int inTypeDecl = 0; + static bool g_endComment; static void endFontClass() @@ -431,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; } @@ -475,7 +480,7 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam if (ue) { // check if only-list exists and if current entry exists is this list - QStringList &only= ue->onlyNames; + QCStringList &only= ue->onlyNames; if (only.isEmpty()) { //cout << " found in module " << moduleName << " entry " << memberName << endl; @@ -483,10 +488,10 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam } else { - for ( QStringList::Iterator it = only.begin(); it != only.end(); ++it) + for ( QCStringList::Iterator it = only.begin(); it != only.end(); ++it) { //cout << " search in only: " << moduleName << ":: " << memberName << "==" << (*it)<< endl; - if (memberName == (*it).utf8()) + if (memberName == *it) { return TRUE; // found in ONLY-part of use list } @@ -629,9 +634,9 @@ static void endScope() Scope *scope = scopeStack.getLast(); scopeStack.removeLast(); - for ( QStringList::Iterator it = scope->useNames.begin(); it != scope->useNames.end(); ++it) + for ( QCStringList::Iterator it = scope->useNames.begin(); it != scope->useNames.end(); ++it) { - useMembers->remove((*it).utf8()); + useMembers->remove(*it); } delete scope; } @@ -645,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); + } } //---------------------------------------------------------------------------- @@ -684,17 +692,18 @@ NUM_TYPE (complex|integer|logical|real) LOG_OPER (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.) KIND {ARGS} CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS})) -TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE|CLASS|PROCEDURE) +TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE|CLASS|PROCEDURE|ENUMERATOR) INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")" -ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|IMPURE|ELEMENTAL|VALUE|NOPASS|DEFERRED|CONTIGUOUS|VOLATILE) +ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|(NON_)?RECURSIVE|PURE|IMPURE|ELEMENTAL|VALUE|NOPASS|DEFERRED|CONTIGUOUS|VOLATILE) ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC) /* Assume that attribute statements are almost the same as attributes. */ ATTR_STMT {ATTR_SPEC}|DIMENSION FLOW (DO|SELECT|CASE|SELECT{BS}(CASE|TYPE)|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT|GO{BS}TO) COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|PRESENT|DEALLOCATE|NULLIFY|SIZE|INQUIRE|OPEN|CLOSE|FLUSH|DATA|COMMON) IGNORE (CALL) -PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|IMPURE|PURE|ELEMENTAL)? +PREFIX ((NON_)?RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,4}((NON_)?RECURSIVE|IMPURE|PURE|ELEMENTAL)?0 +LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")" /* | */ @@ -775,12 +784,12 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I BEGIN(Use); } <Use>"ONLY" { // TODO: rename - startFontClass("keywordtype"); - codifyLines(yytext); - endFontClass(); + startFontClass("keywordtype"); + codifyLines(yytext); + endFontClass(); yy_push_state(YY_START); - BEGIN(UseOnly); - } + BEGIN(UseOnly); + } <Use>{ID} { QCString tmp = yytext; tmp = tmp.lower(); @@ -813,7 +822,8 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I unput(*yytext); yy_pop_state();YY_FTN_RESET } -<Start>"import"{BS_} { +<*>"import"{BS}/"\n" | +<*>"import"{BS_} { startFontClass("keywordtype"); codifyLines(yytext); endFontClass(); @@ -825,6 +835,11 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I generateLink(*g_code, yytext); g_insideBody=FALSE; } +<Import>("ONLY"|"NONE"|"ALL") { + startFontClass("keywordtype"); + codifyLines(yytext); + endFontClass(); + } /*-------- fortran module -----------------------------------------*/ <Start>("block"{BS}"data"|"program"|"module"|"interface")/{BS_}|({COMMA}{ACCESS_SPEC})|\n { // startScope(); @@ -835,15 +850,29 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I BEGIN(ClassName); if (!qstricmp(yytext,"module")) currentModule="module"; } +<Start>("enum")/{BS_}|{BS}{COMMA}{BS}{LANGUAGE_BIND_SPEC}|\n { // + startScope(); + startFontClass("keyword"); + codifyLines(yytext); + endFontClass(); + yy_push_state(YY_START); + BEGIN(ClassName); + currentClass="class"; + } +<*>{LANGUAGE_BIND_SPEC} { // + startFontClass("keyword"); + codifyLines(yytext); + endFontClass(); + } <Start>("type")/{BS_}|({COMMA}({ACCESS_SPEC}|ABSTRACT|EXTENDS))|\n { // - startScope(); - startFontClass("keyword"); - codifyLines(yytext); - endFontClass(); + startScope(); + startFontClass("keyword"); + codifyLines(yytext); + endFontClass(); yy_push_state(YY_START); - BEGIN(ClassName); - currentClass="class"; - } + BEGIN(ClassName); + currentClass="class"; + } <ClassName>{ID} { if (currentModule == "module") { @@ -853,22 +882,26 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I generateLink(*g_code,yytext); yy_pop_state(); } -<ClassName>({ACCESS_SPEC}|ABSTRACT|EXTENDS)/[,:( ] { //| variable deklaration +<ClassName>({ACCESS_SPEC}|ABSTRACT|EXTENDS)/[,:( ] { //| variable declaration startFontClass("keyword"); g_code->codify(yytext); endFontClass(); } <ClassName>\n { // interface may be without name yy_pop_state(); - YY_FTN_REJECT; - } + YY_FTN_REJECT; + } +<Start>^{BS}"end"({BS_}"enum").* { // just reset currentClass, rest is done in following rule + currentClass=0; + YY_FTN_REJECT; + } <Start>^{BS}"end"({BS_}"type").* { // just reset currentClass, rest is done in following rule currentClass=0; - YY_FTN_REJECT; + YY_FTN_REJECT; } <Start>^{BS}"end"({BS_}"module").* { // just reset currentModule, rest is done in following rule currentModule=0; - YY_FTN_REJECT; + YY_FTN_REJECT; } /*-------- subprog definition -------------------------------------*/ <Start>({PREFIX}{BS_})?{TYPE_SPEC}{BS_}({PREFIX}{BS_})?{BS}/{SUBPROG}{BS_} { // TYPE_SPEC is for old function style function result @@ -876,7 +909,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I codifyLines(yytext); endFontClass(); } -<Start>({PREFIX}{BS_})?{SUBPROG}{BS_} { // Fortran subroutine or function found +<Start>({PREFIX}{BS_})?{SUBPROG}{BS_} { // Fortran subroutine or function found startFontClass("keyword"); codifyLines(yytext); endFontClass(); @@ -901,7 +934,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I yy_pop_state(); YY_FTN_RESET } -<Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"type"|"interface")?{BS} { // Fortran subroutine or function ends +<Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface")?{BS} { // Fortran subroutine or function ends //cout << "===> end function " << yytext << endl; endScope(); startFontClass("keyword"); @@ -914,7 +947,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I generateLink(*g_code,yytext); yy_pop_state(); } -<Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"type"|"interface"){BS}/(\n|!) { // Fortran subroutine or function ends +<Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface"){BS}/(\n|!) { // Fortran subroutine or function ends //cout << "===> end function " << yytext << endl; endScope(); startFontClass("keyword"); @@ -922,7 +955,18 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I endFontClass(); } /*-------- variable declaration ----------------------------------*/ +<Start>^{BS}"real"/[,:( ] { // real is a bit tricky as it is a data type but also a function. + yy_push_state(YY_START); + BEGIN(Declaration); + startFontClass("keywordtype"); + g_code->codify(yytext); + endFontClass(); + } <Start>{TYPE_SPEC}/[,:( ] { + QCString typ = yytext; + typ = removeRedundantWhiteSpace(typ.lower()); + if (QString(typ).startsWith("real")) YY_FTN_REJECT; + if (typ == "type" || typ == "class" || typ == "procedure") inTypeDecl = 1; yy_push_state(YY_START); BEGIN(Declaration); startFontClass("keywordtype"); @@ -930,11 +974,18 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I 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 deklaration +<Declaration>({TYPE_SPEC}|{ATTR_SPEC})/[,:( ] { //| variable declaration + if (QCString(yytext) == "external") g_isExternal = true; startFontClass("keywordtype"); g_code->codify(yytext); endFontClass(); @@ -946,8 +997,11 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I g_code->codify(yytext); endFontClass(); } - else if (g_currentMemberDef && ((g_currentMemberDef->isFunction() && (g_currentMemberDef->typeString() != QCString("subroutine"))) || - g_currentMemberDef->isVariable())) + else if (g_currentMemberDef && + ((g_currentMemberDef->isFunction() && (g_currentMemberDef->typeString()!=QCString("subroutine") || inTypeDecl)) || + g_currentMemberDef->isVariable() || g_currentMemberDef->isEnumValue() + ) + ) { generateLink(*g_code, yytext); } @@ -956,22 +1010,23 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I g_code->codify(yytext); addLocalVar(yytext); } - } -<Declaration>{BS}("=>"|"="){BS} { // Procedure binding - BEGIN(DeclarationBinding); - g_code->codify(yytext); - } -<DeclarationBinding>{ID} { // Type bound procedure link + } +<Declaration>{BS}("=>"|"="){BS} { // Procedure binding + BEGIN(DeclarationBinding); + g_code->codify(yytext); + } +<DeclarationBinding>{ID} { // Type bound procedure link generateLink(*g_code, yytext); yy_pop_state(); - } -<Declaration>[(] { // start of array specification + } +<Declaration>[(] { // start of array or type / class specification bracketCount++; g_code->codify(yytext); } <Declaration>[)] { // end array specification bracketCount--; + if (!bracketCount) inTypeDecl = 0; g_code->codify(yytext); } @@ -1003,6 +1058,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I g_contLineNr++; if (!(g_hasContLine && g_hasContLine[g_contLineNr - 1])) { + g_isExternal = false; yy_pop_state(); } YY_FTN_RESET @@ -1029,11 +1085,20 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I // fixed form continuation line YY_FTN_REJECT; } + else if (QCString(yytext).stripWhiteSpace().lower() == "type") + { + yy_push_state(YY_START); + BEGIN(Declaration); + startFontClass("keywordtype"); + g_code->codify(QCString(yytext).stripWhiteSpace()); + endFontClass(); + g_code->codify(yytext + 4); + } else { - g_insideBody=TRUE; + g_insideBody=TRUE; generateLink(*g_code, yytext); - g_insideBody=FALSE; + g_insideBody=FALSE; } } @@ -1142,9 +1207,6 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I g_insideBody=FALSE; } /*------ strings --------------------------------------------------*/ -<*>"\\\\" { str+=yytext; /* ignore \\ */} -<*>"\\\""|\\\' { str+=yytext; /* ignore \" */} - <String>\n { // string with \n inside g_contLineNr++; str+=yytext; @@ -1175,14 +1237,16 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I /*-----------------------------------------------------------------------------*/ <*>\n { - if (g_endComment) - { - g_endComment=FALSE; - } - else - { - codifyLines(yytext); - } + if (g_endComment) + { + g_endComment=FALSE; + } + else + { + codifyLines(yytext); + // comment cannot extend over the end of a line so should always be terminatd at the end of the line. + if (g_currentFontClass && !strcmp(g_currentFontClass,"comment")) endFontClass(); + } g_contLineNr++; YY_FTN_RESET } diff --git a/src/fortranscanner.l b/src/fortranscanner.l index 85b6de9..5f10669 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -164,6 +164,7 @@ static Entry* global_root = 0 ; static Entry* file_root = 0 ; static Entry* current = 0 ; static Entry* last_entry = 0 ; +static Entry* last_enum = 0 ; static ScanVar v_type = V_IGNORE; // type of parsed variable static QList<Entry> moduleProcedures; // list of all interfaces which contain unresolved // module procedures @@ -198,6 +199,8 @@ static SymbolModifiers currentModifiers; //! Holds program scope->symbol name->symbol modifiers. static QMap<Entry*,QMap<QCString,SymbolModifiers> > modifiers; +static Entry *global_scope = NULL; +static int anonCount = 0 ; //----------------------------------------------------------------------------- static int yyread(char *buf,int max_size); @@ -226,6 +229,9 @@ static QCString extractFromParens(const QCString name); static CommentInPrepass* locatePrepassComment(int from, int to); static void updateVariablePrepassComment(int from, int to); static void newLine(); +static void initEntry(); + +static const char *stateToString(int state); //----------------------------------------------------------------------------- #undef YY_INPUT @@ -248,6 +254,7 @@ SUBPROG (subroutine|function) B [ \t] BS [ \t]* BS_ [ \t]+ +BT_ ([ \t]+|[ \t]*"(") COMMA {BS},{BS} ARGS_L0 ("("[^)]*")") ARGS_L1a [^()]*"("[^)]*")"[^)]* @@ -260,7 +267,7 @@ NUM_TYPE (complex|integer|logical|real) LOG_OPER (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.) KIND {ARGS} CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS})) -TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?) +TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|ENUMERATOR|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?) INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")" ATTR_SPEC (EXTERNAL|ALLOCATABLE|DIMENSION{ARGS}|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE|CONTIGUOUS|VOLATILE|VALUE) @@ -271,7 +278,7 @@ ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC} EXTERNAL_STMT (EXTERNAL) CONTAINS CONTAINS -PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|IMPURE|PURE|ELEMENTAL)? +PREFIX ((NON_)?RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,4}((NON_)?RECURSIVE|IMPURE|PURE|ELEMENTAL)? SCOPENAME ({ID}{BS}"::"{BS})* %option noyywrap @@ -297,6 +304,7 @@ SCOPENAME ({ID}{BS}"::"{BS})* %x Variable %x Initialization %x ArrayInitializer +%x Enum %x Typedef %x TypedefBody %x TypedefBodyContains @@ -377,14 +385,6 @@ SCOPENAME ({ID}{BS}"::"{BS})* /*------ ignore strings that are not initialization strings */ -<*>"\\\\" { if (yy_top_state() == Initialization - || yy_top_state() == ArrayInitializer) - initializer+=yytext; - } -<*>"\\\""|\\\' { if (yy_top_state() == Initialization - || yy_top_state() == ArrayInitializer) - initializer+=yytext; - } <String>\"|\' { // string ends with next quote without previous backspace if (yytext[0]!=stringStartSymbol) { yyColNr -= (int)yyleng; REJECT; } // single vs double quote if (yy_top_state() == Initialization @@ -558,7 +558,18 @@ SCOPENAME ({ID}{BS}"::"{BS})* if (!endScope(current_root)) yyterminate(); defaultProtection = Public; - yy_pop_state(); + if (global_scope) + { + if (global_scope != (Entry *) -1) + yy_push_state(Start); + else + yy_pop_state(); // cannot pop artrificial entry + } + else + { + yy_push_state(Start); + global_scope = (Entry *)-1; // signal that the global_scope has already been used. + } } <Module>{ID} { addModule(yytext, TRUE); @@ -602,7 +613,7 @@ abstract { current->spec |= Entry::AbstractClass; } extends{ARGS} { - QCString basename = extractFromParens(yytext); + QCString basename = extractFromParens(yytext).lower(); current->extends->append(new BaseInfo(basename, Public, Normal)); } public { @@ -667,7 +678,8 @@ private { addCurrentEntry(1); } {BS}"=>"[^(\n|\!)]* { /* Specific bindings come after the ID. */ - last_entry->args = yytext; + QCString args = yytext; + last_entry->args = args.lower(); } "\n" { currentModifiers = SymbolModifiers(); @@ -711,8 +723,17 @@ private { {ID} { } } -<Start,ModuleBody,TypedefBody,SubprogBody>{ +<Start,ModuleBody,TypedefBody,SubprogBody,Enum>{ ^{BS}{TYPE_SPEC}/{SEPARATE} { + last_enum = 0; + if (YY_START == Enum) + { + argType = "@"; // enum marker + } + else + { + argType = QCString(yytext).simplifyWhiteSpace().lower(); + } current->bodyLine = yyLineNr + 1; current->endBodyLine = yyLineNr + lineCountPrepass; /* variable declaration starts */ @@ -721,7 +742,6 @@ private { addModule(NULL); yy_push_state(ModuleBody); //anon program } - argType = QCString(yytext).simplifyWhiteSpace().lower(); yy_push_state(AttributeList); } /* Dimitri: macro expansion should already be done during preprocessing not here! @@ -773,8 +793,10 @@ private { } {ID} { } -^{BS}"type"{BS_}"is"/{BS_} { } +^{BS}"type"{BS_}"is"/{BT_} { } ^{BS}"type"{BS}"=" { } +^{BS}"class"{BS_}"is"/{BT_} { } +^{BS}"class"{BS_}"default" { } } <AttributeList>{ {COMMA} {} @@ -817,17 +839,30 @@ private { modifiers[current_root][name.lower()] |= currentModifiers; argName= name; - v_type= V_IGNORE; - if (!argType.isEmpty() && current_root->section!=Entry::FUNCTION_SEC) - { // new variable entry - v_type = V_VARIABLE; + v_type= V_IGNORE; + if (!argType.isEmpty() && current_root->section!=Entry::FUNCTION_SEC) + { // new variable entry + v_type = V_VARIABLE; current->section = Entry::VARIABLE_SEC; - current->name = argName; - current->type = argType; - current->fileName = yyFileName; - current->bodyLine = yyLineNr; // used for source reference + current->name = argName; + current->type = argType; + current->fileName = yyFileName; + current->bodyLine = yyLineNr; // used for source reference current->startLine = yyLineNr; - addCurrentEntry(1); + if (argType == "@") + { + current_root->addSubEntry(current); + current = new Entry(*current); + // add to the scope surrounding the enum (copy!) + current_root->parent()->addSubEntry(current); + last_enum = current; + current = new Entry ; + initEntry(); + } + else + { + addCurrentEntry(1); + } } else if (!argType.isEmpty()) { // declaration of parameter list: add type for corr. parameter @@ -963,19 +998,72 @@ private { { updateVariablePrepassComment(yyColNr-(int)yyleng, yyColNr); yy_pop_state(); // end initialization - if (v_type == V_VARIABLE) last_entry->initializer= initializer; + if (last_enum) + { + last_enum->initializer= initializer; + } + else + { + if (v_type == V_VARIABLE) last_entry->initializer= initializer; + } } else initializer+=", "; } <Initialization>"\n"|"!" { //| yy_pop_state(); // end initialization - if (v_type == V_VARIABLE) last_entry->initializer= initializer; + if (last_enum) + { + last_enum->initializer= initializer; + } + else + { + if (v_type == V_VARIABLE) last_entry->initializer= initializer; + } yyColNr -= 1; unput(*yytext); } <Initialization>. { initializer+=yytext; } +<*>{BS}"enum"{BS}","{BS}"bind"{BS}"("{BS}"c"{BS}")"{BS} { + if(YY_START == Start) + { + addModule(NULL); + yy_push_state(ModuleBody); //anon program + } + + yy_push_state(Enum); + current->protection = defaultProtection; + typeProtection = defaultProtection; + typeMode = true; + + current->spec |= Entry::Struct; + current->name.resize(0); + current->args.resize(0); + current->name.sprintf("@%d",anonCount++); + + current->section = Entry::ENUM_SEC; + current->fileName = yyFileName; + current->startLine = yyLineNr; + current->bodyLine = yyLineNr; + if ((current_root) && + (current_root->section == Entry::CLASS_SEC + || current_root->section == Entry::NAMESPACE_SEC)) + { + current->name = current_root->name + "::" + current->name; + } + + addCurrentEntry(1); + startScope(last_entry); + BEGIN( Enum ) ; + } +<Enum>"end"{BS}"enum" { + last_entry->parent()->endBodyLine = yyLineNr; + if (!endScope(current_root)) + yyterminate(); + typeMode = false; + yy_pop_state(); + } /*------ fortran subroutine/function handling ------------------------------------------------------------*/ /* Start is initial condition */ @@ -1098,7 +1186,6 @@ private { yy_push_state(YY_START); BEGIN(StrIgnore); debugStr="*!"; - //fprintf(stderr,"start comment %d\n",yyLineNr); } } } @@ -1117,6 +1204,7 @@ private { { Entry *tmp_entry = current; current = last_entry; // temporarily switch to the previous entry + if (last_enum) current = last_enum; handleCommentBlock(docBlock,TRUE); current=tmp_entry; } @@ -1132,7 +1220,7 @@ private { docBlock.resize(0); } -<Start,SubprogBody,ModuleBody,TypedefBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains,TypedefBodyContains>"!>" { +<Start,SubprogBody,ModuleBody,TypedefBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains,TypedefBodyContains,Enum>"!>" { yy_push_state(YY_START); current->docLine = yyLineNr; docBlockJavaStyle = FALSE; @@ -1552,7 +1640,10 @@ const char* prepassFixedForm(const char* contents, int *hasContLine) } // fallthrough default: - if(column==6 && emptyLabel) { // continuation + 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 if (!commented) fullCommentLine=FALSE; if (c != '0') { // 0 not allowed as continuation character, see f95 standard paragraph 3.3.2.3 newContents[j]=' '; @@ -2017,14 +2108,23 @@ static void startScope(Entry *scope) */ static bool endScope(Entry *scope, bool isGlobalRoot) { + if (global_scope == scope) + { + global_scope = NULL; + return TRUE; + } + if (global_scope == (Entry *) -1) + { + return TRUE; + } //cout<<"end scope: "<<scope->name<<endl; if (current_root->parent() || isGlobalRoot) { current_root= current_root->parent(); /* end substructure */ } - else + else // if (current_root != scope) { - fprintf(stderr,"parse error in end <scopename>"); + fprintf(stderr,"parse error in end <scopename>\n"); scanner_abort(); return FALSE; } @@ -2558,6 +2658,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt, Fortra yyFileName = fileName; msg("Parsing file %s...\n",yyFileName.data()); + global_scope = rt; startScope(rt); // implies current_root = rt initParser(); groupEnterFile(yyFileName,yyLineNr); @@ -2579,7 +2680,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt, Fortra fortranscannerYYlex(); groupLeaveFile(yyFileName,yyLineNr); - endScope(current_root, TRUE); // TRUE - global root + if (global_scope && global_scope != (Entry *) -1) endScope(current_root, TRUE); // TRUE - global root //debugCompounds(rt); //debug @@ -2660,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()); @@ -2689,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 b04da62..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 @@ -257,7 +257,7 @@ void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,bool opened) while (p) { indent++; p=p->parent; } if (n->isDir) { - QCString dir = opened ? "▼" : "▶"; + QCString dir = opened ? "▼" : "►"; t << "<span style=\"width:" << (indent*16) << "px;display:inline-block;\"> </span>" << "<span id=\"arr_" << generateIndentLabel(n,0) << "\" class=\"arrow\" "; t << "onclick=\"toggleFolder('" << generateIndentLabel(n,0) << "')\""; @@ -302,6 +302,10 @@ void FTVHelp::generateLink(FTextStream &t,FTVNode *n) else t << "\" target=\"_self\">"; } + else + { + t << "\">"; + } t << convertToHtml(n->name); t << "</a>"; if (!n->ref.isEmpty()) @@ -328,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); @@ -356,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 { @@ -404,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 { @@ -787,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 d1fb06c..6386cb8 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -34,15 +34,46 @@ #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) { static char hex[] = "0123456789abcdef"; + static int cnt = 0; QCString result="a"; + QCString cntStr; + result += cntStr.setNum(cnt); + result += "_"; + cnt++; const char *str = word.data(); unsigned char c; if (str) @@ -108,6 +139,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,21 +158,81 @@ static bool mustBeOutsideParagraph(DocNode *n) return FALSE; } -static QString htmlAttribsToString(const HtmlAttribList &attribs) +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); HtmlAttrib *att; + bool alt_set = FALSE; + for (li.toFirst();(att=li.current());++li) { if (!att->value.isEmpty()) // ignore attribute without values as they - // are not XHTML compliant + // are not XHTML compliant, with the exception + // of the alt attribute with the img tag { result+=" "; result+=att->name; result+="=\""+convertToXML(att->value)+"\""; + if (att->name == "alt") alt_set = TRUE; } } + if (!alt_set && img_tag) + { + result+=" alt=\"\""; + } return result; } @@ -201,6 +293,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:'"; @@ -263,6 +369,12 @@ void HtmlDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Bold: if (s->enable()) m_t << "<b" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</b>"; break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "<strike" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</strike>"; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "<u" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</u>"; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "<em" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</em>"; break; @@ -349,7 +461,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; @@ -389,10 +500,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: @@ -550,8 +663,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; @@ -624,6 +741,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op) // op->type(),op->isFirst(),op->isLast(),op->text().data()); if (op->isFirst()) { + forceEndParagraph(op); if (!m_hide) m_t << PREFRAG_START; pushEnabled(); m_hide=TRUE; @@ -658,6 +776,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op) { popEnabled(); if (!m_hide) m_t << PREFRAG_END; + forceStartParagraph(op); } else { @@ -776,12 +895,13 @@ void HtmlDocVisitor::visitPre(DocAutoList *l) // A. // 1. (repeat)... // - m_t << "<ol type=\"" << types[l->depth() % NUM_HTML_LIST_TYPES] << "\">"; + m_t << "<ol type=\"" << types[l->depth() % NUM_HTML_LIST_TYPES] << "\""; } else { - m_t << "<ul>"; + m_t << "<ul"; } + m_t << getDirHtmlClassOfNode(getTextDirByConfig(l)) << ">"; if (!l->isPreformatted()) m_t << "\n"; } @@ -876,24 +996,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) @@ -901,18 +1021,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; @@ -920,47 +1059,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 @@ -968,12 +1111,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; @@ -1021,11 +1166,11 @@ void HtmlDocVisitor::visitPre(DocPara *p) // if the first element of a paragraph is something that should be outside of // the paragraph (<ul>,<dl>,<table>,..) then that will already started the // paragraph and we don't need to do it here + bool paragraphAlreadyStarted = false; 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++; } @@ -1034,24 +1179,16 @@ void HtmlDocVisitor::visitPre(DocPara *p) DocNode *n = p->children().at(nodeIndex); if (mustBeOutsideParagraph(n)) { + paragraphAlreadyStarted = true; needsTag = FALSE; } } } - // 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 - " class=\"startli\"", // 1 - " class=\"startdd\"", // 2 - " class=\"endli\"", // 3 - " class=\"enddd\"", // 4 - " class=\"starttd\"", // 5 - " class=\"endtd\"" // 6 - }; bool isFirst; bool isLast; t = getParagraphContext(p,isFirst,isLast); @@ -1060,7 +1197,10 @@ void HtmlDocVisitor::visitPre(DocPara *p) //printf(" needsTag=%d\n",needsTag); // write the paragraph tag (if needed) - if (needsTag) m_t << "<p" << contexts[t] << ">"; + if (needsTag) + m_t << "<p" << getDirHtmlClassOfNode(getTextDirByConfig(p), contexts[t]) << ">"; + else if(!paragraphAlreadyStarted) + m_t << getHtmlDirEmbedingChar(getTextDirByConfig(p)); } void HtmlDocVisitor::visitPost(DocPara *p) @@ -1098,7 +1238,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--; } @@ -1136,7 +1276,10 @@ void HtmlDocVisitor::visitPre(DocSimpleSect *s) { if (m_hide) return; forceEndParagraph(s); - m_t << "<dl class=\"section " << s->typeString() << "\"><dt>"; + if (s->type() != DocSimpleSect::Return) + m_t << "<dl" << getDirHtmlClassOfNode(getTextDirByConfig(s), "section " + s->typeString()) << "><dt>"; + else + m_t << "<dl class=\"section " << s->typeString() << "\"><dt>"; switch(s->type()) { case DocSimpleSect::See: @@ -1232,7 +1375,7 @@ void HtmlDocVisitor::visitPre(DocSection *s) { if (m_hide) return; forceEndParagraph(s); - m_t << "<h" << s->level() << ">"; + m_t << "<h" << s->level() << getDirHtmlClassOfNode(getTextDirByConfig(s->title())) << ">"; m_t << "<a class=\"anchor\" id=\"" << s->anchor(); m_t << "\"></a>" << endl; filter(convertCharEntitiesToUTF8(s->title().data())); @@ -1250,12 +1393,13 @@ void HtmlDocVisitor::visitPre(DocHtmlList *s) forceEndParagraph(s); if (s->type()==DocHtmlList::Ordered) { - m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n"; + m_t << "<ol" << htmlAttribsToString(s->attribs()); } else { - m_t << "<ul" << htmlAttribsToString(s->attribs()) << ">\n"; + m_t << "<ul" << htmlAttribsToString(s->attribs()); } + m_t << getDirHtmlClassOfNode(getTextDirByConfig(s)) << ">\n"; } void HtmlDocVisitor::visitPost(DocHtmlList *s) @@ -1303,7 +1447,9 @@ void HtmlDocVisitor::visitPost(DocHtmlDescList *dl) void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt) { if (m_hide) return; - m_t << "<dt" << htmlAttribsToString(dt->attribs()) << ">"; + m_t << "<dt" << htmlAttribsToString(dt->attribs()) + << getDirHtmlClassOfNode(getTextDirByConfig(dt)) + << ">"; } void HtmlDocVisitor::visitPost(DocHtmlDescTitle *) @@ -1315,7 +1461,9 @@ void HtmlDocVisitor::visitPost(DocHtmlDescTitle *) void HtmlDocVisitor::visitPre(DocHtmlDescData *dd) { if (m_hide) return; - m_t << "<dd" << htmlAttribsToString(dd->attribs()) << ">"; + m_t << "<dd" << htmlAttribsToString(dd->attribs()) + << getDirHtmlClassOfNode(getTextDirByConfig(dd)) + << ">"; } void HtmlDocVisitor::visitPost(DocHtmlDescData *) @@ -1338,11 +1486,21 @@ void HtmlDocVisitor::visitPre(DocHtmlTable *t) QString attrs = htmlAttribsToString(t->attribs()); if (attrs.isEmpty()) { - m_t << "<table class=\"doxtable\">\n"; + m_t << "<table"; + if(t->hasCaption()) + m_t << getDirHtmlClassOfNode(getTextDirByConfig(t->caption()), "doxtable"); + else + m_t << getDirHtmlClassOfNode(getTextDirByConfig(t), "doxtable"); + m_t << ">\n"; } else { - m_t << "<table" << htmlAttribsToString(t->attribs()) << ">\n"; + m_t << "<table"; + if (t->hasCaption()) + m_t << getDirHtmlClassOfNode(getTextDirByConfig(t->caption())); + else + m_t << getDirHtmlClassOfNode(getTextDirByConfig(t)); + m_t << htmlAttribsToString(t->attribs()) << ">\n"; } } @@ -1435,7 +1593,9 @@ void HtmlDocVisitor::visitPre(DocHtmlHeader *header) if (m_hide) return; forceEndParagraph(header); m_t << "<h" << header->level() - << htmlAttribsToString(header->attribs()) << ">"; + << htmlAttribsToString(header->attribs()) + << getDirHtmlClassOfNode(getTextDirByConfig(header)) + << ">"; } void HtmlDocVisitor::visitPost(DocHtmlHeader *header) @@ -1449,7 +1609,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; @@ -1457,20 +1632,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 @@ -1480,26 +1654,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()) - << "/>" << endl; + << sizeAttribs << htmlAttribsToString(img->attribs(), TRUE) + << (inlineImage ? " class=\"inline\"" : "/>\n"); } } if (img->hasCaption()) { - m_t << "<div class=\"caption\">" << endl; + 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 @@ -1509,17 +1696,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 { @@ -1804,7 +1998,8 @@ void HtmlDocVisitor::visitPre(DocXRefItem *x) bool anonymousEnum = x->file()=="@"; if (!anonymousEnum) { - m_t << "<dl class=\"" << x->key() << "\"><dt><b><a class=\"el\" href=\"" + m_t << "<dl" << getDirHtmlClassOfNode(getTextDirByConfig(x), x->key()) + << "><dt><b><a class=\"el\" href=\"" << x->relPath() << x->file() << Doxygen::htmlFileExtension << "#" << x->anchor() << "\">"; } @@ -1862,11 +2057,13 @@ void HtmlDocVisitor::visitPre(DocHtmlBlockQuote *b) QString attrs = htmlAttribsToString(b->attribs()); if (attrs.isEmpty()) { - m_t << "<blockquote class=\"doxtable\">\n"; + m_t << "<blockquote" << getDirHtmlClassOfNode(getTextDirByConfig(b), "doxtable") + << ">\n"; } else { - m_t << "<blockquote" << htmlAttribsToString(b->attribs()) << ">\n"; + m_t << "<blockquote" << getDirHtmlClassOfNode(getTextDirByConfig(b)) + << htmlAttribsToString(b->attribs()) << ">\n"; } } @@ -2144,16 +2341,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--; @@ -2185,29 +2379,31 @@ 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 { return; // only whitespace at the end! } + bool needsTag = TRUE; bool isFirst; bool isLast; getParagraphContext(para,isFirst,isLast); - //printf("forceStart first=%d last=%d\n",isFirst,isLast); - if (isFirst && isLast) return; + if (isFirst && isLast) needsTag = FALSE; + //printf("forceStart first=%d last=%d needsTag=%d\n",isFirst,isLast,needsTag); - m_t << "<p>"; + if (needsTag) + m_t << "<p" << getDirHtmlClassOfNode(getTextDirByConfig(para, nodeIndex)) << ">"; + else + m_t << getHtmlDirEmbedingChar(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..543f86b 100644 --- a/src/htmlentity.cpp +++ b/src/htmlentity.cpp @@ -314,7 +314,9 @@ static struct htmlEntityInfo { SYM(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 }}, + { SYM(Equal), "=", "=", "=", "=", "=", "=", "=", { "=", 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 e576059..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" @@ -375,13 +376,13 @@ static QCString substituteHtmlKeywords(const QCString &s, mathJaxJs += "\n"; } mathJaxJs += "</script>"; - mathJaxJs += "<script type=\"text/javascript\" async src=\"" + path + "MathJax.js\"></script>\n"; + mathJaxJs += "<script type=\"text/javascript\" async=\"async\" src=\"" + path + "MathJax.js\"></script>\n"; } // first substitute generic keywords QCString result = substituteKeywords(s,title, - convertToHtml(Config_getString(PROJECT_NAME)), - convertToHtml(Config_getString(PROJECT_NUMBER)), + convertToHtml(Config_getString(PROJECT_NAME)), + convertToHtml(Config_getString(PROJECT_NUMBER)), convertToHtml(Config_getString(PROJECT_BRIEF))); // additional HTML only keywords @@ -485,6 +486,8 @@ void HtmlCodeGenerator::codify(const char *str) void HtmlCodeGenerator::docify(const char *str) { + m_t << getHtmlDirEmbedingChar(getTextDirByConfig(str)); + if (str && m_streamSet) { const char *p=str; @@ -604,7 +607,7 @@ void HtmlCodeGenerator::writeTooltip(const char *id, const DocLinkInfo &docInfo, if (desc) { m_t << "<div class=\"ttdoc\">"; - docify(desc); // desc is already HTML escaped; but there are still < and > signs + docify(desc); m_t << "</div>"; } if (!defInfo.file.isEmpty()) @@ -688,6 +691,7 @@ HtmlGenerator::HtmlGenerator() : OutputGenerator() { dir=Config_getString(HTML_OUTPUT); m_emptySection=FALSE; + m_sectionCount=0; } HtmlGenerator::~HtmlGenerator() @@ -1115,7 +1119,8 @@ void HtmlGenerator::startIndexItem(const char *ref,const char *f) } t << "href=\""; t << externalRef(relPath,ref,TRUE); - if (f) t << f << Doxygen::htmlFileExtension << "\">"; + if (f) t << f << Doxygen::htmlFileExtension; + t << "\">"; } else { @@ -1379,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++; } @@ -1426,13 +1445,7 @@ void HtmlGenerator::startMemberItem(const char *anchor,int annoType,const char * t << " inherit " << inheritId; } t << "\">"; - switch(annoType) - { - case 0: t << "<td class=\"memItemLeft\" align=\"right\" valign=\"top\">"; break; - case 1: t << "<td class=\"memItemLeft\" >"; break; - case 2: t << "<td class=\"memItemLeft\" valign=\"top\">"; break; - default: t << "<td class=\"memTemplParams\" colspan=\"2\">"; break; - } + insertMemberAlignLeft(annoType, true); } void HtmlGenerator::endMemberItem() @@ -1464,7 +1477,19 @@ void HtmlGenerator::insertMemberAlign(bool templ) t << " </td><td class=\"" << className << "\" valign=\"bottom\">"; } -void HtmlGenerator::startMemberDescription(const char *anchor,const char *inheritId) +void HtmlGenerator::insertMemberAlignLeft(int annoType, bool initTag) +{ + if (!initTag) t << " </td>"; + switch(annoType) + { + case 0: t << "<td class=\"memItemLeft\" align=\"right\" valign=\"top\">"; break; + case 1: t << "<td class=\"memItemLeft\" >"; break; + case 2: t << "<td class=\"memItemLeft\" valign=\"top\">"; break; + default: t << "<td class=\"memTemplParams\" colspan=\"2\">"; break; + } +} + +void HtmlGenerator::startMemberDescription(const char *anchor,const char *inheritId, bool typ) { DBG_HTML(t << "<!-- startMemberDescription -->" << endl) if (m_emptySection) @@ -1477,7 +1502,10 @@ void HtmlGenerator::startMemberDescription(const char *anchor,const char *inheri { t << " inherit " << inheritId; } - t << "\"><td class=\"mdescLeft\"> </td><td class=\"mdescRight\">"; + t << "\">"; + t << "<td class=\"mdescLeft\"> </td>"; + if (typ) t << "<td class=\"mdescLeft\"> </td>"; + t << "<td class=\"mdescRight\">";; } void HtmlGenerator::endMemberDescription() @@ -1503,7 +1531,7 @@ void HtmlGenerator::endMemberSections() } } -void HtmlGenerator::startMemberHeader(const char *anchor) +void HtmlGenerator::startMemberHeader(const char *anchor, int typ) { DBG_HTML(t << "<!-- startMemberHeader -->" << endl) if (!m_emptySection) @@ -1516,7 +1544,7 @@ void HtmlGenerator::startMemberHeader(const char *anchor) t << "<table class=\"memberdecls\">" << endl; m_emptySection=FALSE; } - t << "<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\">"; + t << "<tr class=\"heading\"><td colspan=\"" << typ << "\"><h2 class=\"groupheader\">"; if (anchor) { t << "<a name=\"" << anchor << "\"></a>" << endl; @@ -1931,25 +1959,16 @@ void HtmlGenerator::endDescTableData() t << "</td>"; } -void HtmlGenerator::startSimpleSect(SectionTypes, - const char *filename,const char *anchor, - const char *title) +void HtmlGenerator::startExamples() { - t << "<dl><dt><b>"; - if (filename) - { - writeObjectLink(0,filename,anchor,title); - } - else - { - docify(title); - } - t << "</b></dt>"; + t << "<dl class=\"section examples\"><dt>"; + docify(theTranslator->trExamples()); + t << "</dt>"; } -void HtmlGenerator::endSimpleSect() +void HtmlGenerator::endExamples() { - t << "</dl>"; + t << "</dl>" << endl; } void HtmlGenerator::startParamList(ParamListTypes, @@ -2034,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; } @@ -2177,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; @@ -2189,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; @@ -2323,6 +2369,16 @@ void HtmlGenerator::endContents() t << "</div><!-- contents -->" << endl; } +void HtmlGenerator::startPageDoc(const char *pageTitle) +{ + t << "<div" << getDirHtmlClassOfPage(pageTitle) << ">"; +} + +void HtmlGenerator::endPageDoc() +{ + t << "</div><!-- PageDoc -->" << endl; +} + void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli,const char *file) { writeDefaultQuickLinks(t,compact,hli,file,relPath); @@ -2342,7 +2398,7 @@ void HtmlGenerator::writeSearchPage() if (cf.open(IO_WriteOnly)) { FTextStream t(&cf); - t << "<script language=\"php\">\n\n"; + t << "<?php\n\n"; t << "$config = array(\n"; t << " 'PROJECT_NAME' => \"" << convertToHtml(projectName) << "\",\n"; t << " 'GENERATE_TREEVIEW' => " << (generateTreeView?"true":"false") << ",\n"; @@ -2360,7 +2416,7 @@ void HtmlGenerator::writeSearchPage() t << " 'split_bar' => \"" << substitute(substitute(writeSplitBarAsString("search",""), "\"","\\\""), "\n","\\n") << "\",\n"; t << " 'logo' => \"" << substitute(substitute(writeLogoAsString(""), "\"","\\\""), "\n","\\n") << "\",\n"; t << ");\n\n"; - t << "</script>\n"; + t << "?>\n"; } ResourceMgr::instance().copyResource("search_functions.php",htmlOutput); @@ -2391,10 +2447,10 @@ void HtmlGenerator::writeSearchPage() t << "</div>" << endl; } - t << "<script language=\"php\">\n"; + t << "<?php\n"; t << "require_once \"search_functions.php\";\n"; t << "main();\n"; - t << "</script>\n"; + t << "?>\n"; // Write empty navigation path, to make footer connect properly if (generateTreeView) @@ -2696,13 +2752,16 @@ void HtmlGenerator::writeInheritedSectionTitle( DBG_HTML(t << "<!-- writeInheritedSectionTitle -->" << endl;) QCString a = anchor; if (!a.isEmpty()) a.prepend("#"); - QCString classLink = QCString("<a class=\"el\" href=\""); + QCString classLink = QCString("<a class=\"el\" "); if (ref) { - classLink+= externalLinkTarget() + externalRef(relPath,ref,TRUE); + classLink+= externalLinkTarget(); + classLink += " href=\""; + classLink+= externalRef(relPath,ref,TRUE); } else { + classLink += "href=\""; classLink+=relPath; } classLink+=file+Doxygen::htmlFileExtension+a; diff --git a/src/htmlgen.h b/src/htmlgen.h index 70e4b5f..221269f 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -175,7 +175,7 @@ class HtmlGenerator : public OutputGenerator void endMemberSections(); void startHeaderSection(); void endHeaderSection(); - void startMemberHeader(const char *); + void startMemberHeader(const char *, int); void endMemberHeader(); void startMemberSubtitle(); void endMemberSubtitle(); @@ -200,7 +200,8 @@ class HtmlGenerator : public OutputGenerator void endMemberGroup(bool); void insertMemberAlign(bool); - void startMemberDescription(const char *anchor,const char *inheritId); + void insertMemberAlignLeft(int,bool); + void startMemberDescription(const char *anchor,const char *inheritId, bool typ); void endMemberDescription(); void startMemberDeclaration() {} void endMemberDeclaration(const char *anchor,const char *inheritId); @@ -245,13 +246,10 @@ class HtmlGenerator : public OutputGenerator void endCenter() { t << "</center>" << endl; } void startSmall() { t << "<small>" << endl; } void endSmall() { t << "</small>" << endl; } - //void startDescList(SectionTypes) { t << "<dl compact><dt><b>" << endl; } - //void endDescList() { t << "</dl>"; } - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *); void endParamList(); - //void writeDescItem() { t << "<dd>" << endl; } void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *); @@ -271,6 +269,8 @@ class HtmlGenerator : public OutputGenerator void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first); void startContents(); void endContents(); + void startPageDoc(const char *pageTitle); + void endPageDoc(); void writeNonBreakableSpace(int); void startDescTable(const char *title); diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp index ad56de8..3ed3d64 100644 --- a/src/htmlhelp.cpp +++ b/src/htmlhelp.cpp @@ -115,7 +115,7 @@ void HtmlHelpIndex::addItem(const char *level1,const char *level2, { return; } - if (dict->find(key)==0) // new key + if (dict->find(key+anchor)==0) // new key { //printf(">>>>>>>>> HtmlHelpIndex::addItem(%s,%s,%s,%s)\n", // level1,level2,url,anchor); @@ -125,7 +125,7 @@ void HtmlHelpIndex::addItem(const char *level1,const char *level2, f->anchor = anchor; f->link = hasLink; f->reversed = reversed; - dict->append(key,f); + dict->append(key+anchor,f); } } @@ -187,7 +187,7 @@ void HtmlHelpIndex::writeFields(FTextStream &t) level1 = f->name.copy(); } - if (level1!=lastLevel1) + //if (level1!=lastLevel1) { // finish old list at level 2 if (level2Started) t << " </UL>" << endl; level2Started=FALSE; diff --git a/src/index.cpp b/src/index.cpp index 3a17c29..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); - ol.startIndexList(); ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; @@ -1593,11 +1878,22 @@ static void writeAnnotatedClassList(OutputList &ol) { continue; } + if (first) + { + ol.startIndexList(); + 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) @@ -1635,13 +1931,18 @@ static void writeAnnotatedClassList(OutputList &ol) } ol.popGeneratorState(); } - ol.endIndexList(); + if (!first) ol.endIndexList(); +} + +inline bool isId1(int c) +{ + return (c<127 && c>31); // printable ASCII character } static QCString letterToLabel(uint startLetter) { char s[11]; // max 0x12345678 + '\0' - if (isId(startLetter)) // printable ASCII character + if (isId1(startLetter)) // printable ASCII character { s[0]=(char)startLetter; s[1]=0; @@ -1758,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; @@ -1770,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 @@ -1805,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", @@ -1822,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; @@ -1977,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 @@ -2027,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(); @@ -2054,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); @@ -2073,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(); @@ -2091,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); @@ -2206,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); @@ -2378,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); @@ -2435,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); @@ -2477,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; @@ -2503,8 +3149,8 @@ static const CmhlInfo *getCmhlInfo(int hl) { CmhlInfo("functions", theTranslator->trAll()), CmhlInfo("functions_func", - fortranOpt ? theTranslator->trSubprograms() : - vhdlOpt ? VhdlDocGen::trFunctionAndProc() : + fortranOpt ? theTranslator->trSubprograms() : + vhdlOpt ? theTranslator->trFunctionAndProc() : theTranslator->trFunctions()), CmhlInfo("functions_vars",theTranslator->trVariables()), CmhlInfo("functions_type",theTranslator->trTypedefs()), @@ -2678,15 +3324,18 @@ 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()), FmhlInfo("globals_func", - fortranOpt ? theTranslator->trSubprograms() : - vhdlOpt ? VhdlDocGen::trFunctionAndProc() : + 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()) @@ -2822,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); @@ -2846,15 +3497,18 @@ 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()), NmhlInfo("namespacemembers_func", - fortranOpt ? theTranslator->trSubprograms() : - vhdlOpt ? VhdlDocGen::trFunctionAndProc() : + 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()) }; @@ -2994,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) @@ -3012,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(); @@ -3611,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(); @@ -3829,6 +4487,18 @@ static void writeIndex(OutputList &ol) ol.writeSplitBar(indexName); ol.writeSearchInfo(); bool headerWritten=FALSE; + if (Doxygen::mainPage) + { + if (!Doxygen::mainPage->title().isEmpty()) + { + if (Doxygen::mainPage->title().lower() != "notitle") + ol.startPageDoc(Doxygen::mainPage->title()); + else + ol.startPageDoc(""); + } + else + ol.startPageDoc(projectName); + } if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty()) { if (Doxygen::mainPage->title().lower()!="notitle") @@ -3866,9 +4536,9 @@ static void writeIndex(OutputList &ol) if (Doxygen::mainPage) { Doxygen::insideMainPage=TRUE; - if (Doxygen::mainPage->showToc() && Doxygen::mainPage->hasSections()) + if (Doxygen::mainPage->localToc().isHtmlEnabled() && Doxygen::mainPage->hasSections()) { - Doxygen::mainPage->writeToc(ol); + Doxygen::mainPage->writeToc(ol,Doxygen::mainPage->localToc()); } ol.startTextBlock(); @@ -3876,6 +4546,7 @@ static void writeIndex(OutputList &ol) Doxygen::mainPage->documentation(),TRUE,FALSE /*,Doxygen::mainPage->sectionDict*/); ol.endTextBlock(); + ol.endPageDoc(); Doxygen::insideMainPage=FALSE; } @@ -3887,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); @@ -3895,6 +4567,7 @@ static void writeIndex(OutputList &ol) { ol.disable(OutputGenerator::Latex); } + ol.disable(OutputGenerator::Docbook); if (projPrefix.isEmpty()) { @@ -3916,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) @@ -3955,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); @@ -3979,6 +4655,7 @@ static void writeIndex(OutputList &ol) } } + ol.disable(OutputGenerator::Docbook); if (!Config_getBool(LATEX_HIDE_INDICES)) { //if (indexedPages>0) @@ -3999,26 +4676,56 @@ 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); ol.parseText(/*projPrefix+*/ (fortranOpt ? theTranslator->trCompoundIndexFortran() : - vhdlOpt ? VhdlDocGen::trDesignUnitIndex() : + vhdlOpt ? theTranslator->trHierarchicalIndex() : theTranslator->trHierarchicalIndex() )); 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); ol.parseText(/*projPrefix+*/ (fortranOpt ? theTranslator->trCompoundIndexFortran() : - vhdlOpt ? VhdlDocGen::trDesignUnitIndex() : + vhdlOpt ? theTranslator->trDesignUnitIndex() : theTranslator->trCompoundIndex() )); 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); @@ -4026,6 +4733,8 @@ static void writeIndex(OutputList &ol) ol.endIndexSection(isFileIndex); } } + ol.enable(OutputGenerator::Docbook); + if (documentedGroups>0) { ol.startIndexSection(isModuleDocumentation); @@ -4038,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); @@ -4082,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) @@ -4179,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: { @@ -4262,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 { @@ -4291,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; } @@ -4333,7 +5171,7 @@ void renderMemberIndicesAsJs(FTextStream &t, firstMember=FALSE; } t << endl << "{text:\"" << convertToJSString(getInfo(i)->title) << "\",url:\"" - << convertToJSString(getInfo(i)->fname+Doxygen::htmlFileExtension) << "\""; + << convertToJSString(getInfo(i)->fname+Doxygen::htmlFileExtension, false) << "\""; // Check if we have many members, then add sub entries per letter... // quick alphabetical index @@ -4363,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) << "\"}"; + << convertToJSString(anchor+convertToId(is), false) << "\"}"; firstLetter=FALSE; } t << "]"; @@ -4399,7 +5237,7 @@ static bool renderQuickLinksAsJs(FTextStream &t,LayoutNavEntry *root,bool first) firstChild=FALSE; QCString url = entry->url(); t << "{text:\"" << convertToJSString(entry->title()) << "\",url:\"" - << convertToJSString(url) << "\""; + << convertToJSString(url, false) << "\""; bool hasChildren=FALSE; if (entry->kind()==LayoutNavEntry::NamespaceMembers) { 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/languages.py b/src/languages.py index 2b02b3e..5bb65cf 100755 --- a/src/languages.py +++ b/src/languages.py @@ -1,5 +1,5 @@ # -# This file is an aid to generated the Languages rules file. +# This file is an aid to generate the Languages rules file. # usage: # python languages.py > ..\winbuild\Languages.rules # diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 4ed61a4..5be3fc9 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -18,6 +18,7 @@ #include "htmlattrib.h" #include <qfileinfo.h> #include "latexdocvisitor.h" +#include "latexgen.h" #include "docparser.h" #include "language.h" #include "doxygen.h" @@ -32,6 +33,7 @@ #include "filedef.h" #include "config.h" #include "htmlentity.h" +#include "emoji.h" #include "plantuml.h" const int maxLevels=5; @@ -47,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"; @@ -79,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 { @@ -90,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"; + } } } @@ -209,6 +240,23 @@ 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{"; + filter(emojiName); + m_t << "}{" << imageName << "}"; + } + else + { + m_t << s->name(); + } +} + void LatexDocVisitor::visit(DocURL *u) { if (m_hide) return; @@ -216,11 +264,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 << "{\\tt "; + m_t << "{\\texttt{ "; filter(u->url()); - m_t << "}"; + m_t << "}}"; } void LatexDocVisitor::visit(DocLineBreak *) @@ -241,7 +289,13 @@ void LatexDocVisitor::visit(DocStyleChange *s) switch (s->style()) { case DocStyleChange::Bold: - if (s->enable()) m_t << "{\\bfseries "; else m_t << "}"; + if (s->enable()) m_t << "{\\bfseries{"; else m_t << "}}"; + break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "\\sout{"; else m_t << "}"; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "\\uline{"; else m_t << "}"; break; case DocStyleChange::Italic: if (s->enable()) m_t << "{\\itshape "; else m_t << "}"; @@ -291,10 +345,12 @@ void LatexDocVisitor::visit(DocVerbatim *s) { case DocVerbatim::Code: { - m_t << "\n\\begin{DoxyCode}\n"; + m_t << "\n\\begin{DoxyCode}{" << usedTableLevels() << "}\n"; + LatexCodeGenerator::setDoxyCodeOpen(TRUE); Doxygen::parserManager->getParser(lang) ->parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); + LatexCodeGenerator::setDoxyCodeOpen(FALSE); m_t << "\\end{DoxyCode}\n"; } break; @@ -399,7 +455,8 @@ void LatexDocVisitor::visit(DocInclude *inc) { case DocInclude::IncWithLines: { - m_t << "\n\\begin{DoxyCodeInclude}\n"; + m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; + LatexCodeGenerator::setDoxyCodeOpen(TRUE); QFileInfo cfi( inc->file() ); FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() ); Doxygen::parserManager->getParser(inc->extension()) @@ -415,11 +472,13 @@ void LatexDocVisitor::visit(DocInclude *inc) 0, // memberDef TRUE // show line numbers ); + LatexCodeGenerator::setDoxyCodeOpen(FALSE); m_t << "\\end{DoxyCodeInclude}" << endl; } break; case DocInclude::Include: - m_t << "\n\\begin{DoxyCodeInclude}\n"; + m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; + LatexCodeGenerator::setDoxyCodeOpen(TRUE); Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(),langExt,inc->isExample(), @@ -431,6 +490,7 @@ void LatexDocVisitor::visit(DocInclude *inc) 0, // memberDef FALSE ); + LatexCodeGenerator::setDoxyCodeOpen(FALSE); m_t << "\\end{DoxyCodeInclude}\n"; break; case DocInclude::DontInclude: @@ -447,7 +507,8 @@ void LatexDocVisitor::visit(DocInclude *inc) break; case DocInclude::Snippet: { - m_t << "\n\\begin{DoxyCodeInclude}\n"; + m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; + LatexCodeGenerator::setDoxyCodeOpen(TRUE); Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci, inc->context(), @@ -456,6 +517,7 @@ void LatexDocVisitor::visit(DocInclude *inc) inc->isExample(), inc->exampleFile() ); + LatexCodeGenerator::setDoxyCodeOpen(FALSE); m_t << "\\end{DoxyCodeInclude}" << endl; } break; @@ -463,7 +525,8 @@ void LatexDocVisitor::visit(DocInclude *inc) { QFileInfo cfi( inc->file() ); FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() ); - m_t << "\n\\begin{DoxyCodeInclude}\n"; + m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; + LatexCodeGenerator::setDoxyCodeOpen(TRUE); Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci, inc->context(), @@ -478,6 +541,7 @@ void LatexDocVisitor::visit(DocInclude *inc) 0, // memberDef TRUE // show line number ); + LatexCodeGenerator::setDoxyCodeOpen(FALSE); m_t << "\\end{DoxyCodeInclude}" << endl; } break; @@ -495,7 +559,8 @@ void LatexDocVisitor::visit(DocIncOperator *op) // op->type(),op->isFirst(),op->isLast(),op->text().data()); if (op->isFirst()) { - if (!m_hide) m_t << "\n\\begin{DoxyCodeInclude}\n"; + if (!m_hide) m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n"; + LatexCodeGenerator::setDoxyCodeOpen(TRUE); pushEnabled(); m_hide = TRUE; } @@ -515,6 +580,7 @@ void LatexDocVisitor::visit(DocIncOperator *op) if (op->isLast()) { popEnabled(); + LatexCodeGenerator::setDoxyCodeOpen(FALSE); if (!m_hide) m_t << "\n\\end{DoxyCodeInclude}\n"; } else @@ -526,16 +592,28 @@ void LatexDocVisitor::visit(DocIncOperator *op) void LatexDocVisitor::visit(DocFormula *f) { if (m_hide) return; - m_t << f->text(); + const char *p=f->text(); + char c; + if (p) + { + while ((c=*p++)) + { + switch (c) + { + case '\'': m_t << "\\text{'}"; break; + default: m_t << c; break; + } + } + } } 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 << "}}"; } @@ -923,11 +1001,11 @@ static void writeStartTableCommand(FTextStream &t,const DocNode *n,int cols) { if (tableIsNested(n)) { - t << "\\begin{tabularx}{\\linewidth}{|*{" << cols << "}{>{\\raggedright\\arraybackslash}X|}}"; + t << "{\\begin{tabularx}{\\linewidth}{|*{" << cols << "}{>{\\raggedright\\arraybackslash}X|}}"; } else { - t << "\\tabulinesep=1mm\n\\begin{longtabu} spread 0pt [c]{*{" << cols << "}{|X[-1]}|}\n"; + t << "\\tabulinesep=1mm\n\\begin{longtabu}spread 0pt [c]{*{" << cols << "}{|X[-1]}|}\n"; } //return isNested ? "TabularNC" : "TabularC"; } @@ -936,7 +1014,7 @@ static void writeEndTableCommand(FTextStream &t,const DocNode *n) { if (tableIsNested(n)) { - t << "\\end{tabularx}\n"; + t << "\\end{tabularx}}\n"; } else { @@ -983,7 +1061,8 @@ void LatexDocVisitor::visitPre(DocHtmlTable *t) if (firstRow && firstRow->isHeading()) { setFirstRow(TRUE); - firstRow->accept(this); + DocNode *n = t->parent(); + if (!tableIsNested(n)) firstRow->accept(this); setFirstRow(FALSE); } } @@ -1009,13 +1088,14 @@ void LatexDocVisitor::visitPost(DocHtmlCaption *c) void LatexDocVisitor::visitPre(DocHtmlRow *r) { setCurrentColumn(0); - if (r->isHeading()) m_t << "\\rowcolor{\\tableheadbgcolor}"; } void LatexDocVisitor::visitPost(DocHtmlRow *row) { if (m_hide) return; + DocNode *n = row->parent() ->parent(); + int c=currentColumn(); while (c<=numCols()) // end of row while inside a row span? { @@ -1033,10 +1113,7 @@ void LatexDocVisitor::visitPost(DocHtmlRow *row) if (span->colSpan>1) // row span is also part of a column span { m_t << "\\multicolumn{" << span->colSpan << "}{"; - m_t << "p{(\\linewidth-\\tabcolsep*" - << numCols() << "-\\arrayrulewidth*" - << row->visibleCells() << ")*" - << span->colSpan <<"/"<< numCols() << "}|}{}"; + m_t << "}|}{}"; } else // solitary row span { @@ -1077,7 +1154,8 @@ void LatexDocVisitor::visitPost(DocHtmlRow *row) m_t << "\n"; - if (row->isHeading() && row->rowIndex()==1) + + if (row->isHeading() && row->rowIndex()==1 && !tableIsNested(n)) { if (firstRow()) { @@ -1119,10 +1197,7 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c) { m_t << "|"; } - m_t << "p{(\\linewidth-\\tabcolsep*" - << numCols() << "-\\arrayrulewidth*" - << row->visibleCells() << ")*" - << span->colSpan <<"/"<< numCols() << "}|}{}"; + m_t << "l|}{" << (c->isHeading()? "\\columncolor{\\tableheadbgcolor}" : "") << "}"; // alignment not relevant, empty column setCurrentColumn(currentColumn()+span->colSpan); } else @@ -1134,6 +1209,7 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c) } int cs = c->colSpan(); + int a = c->alignment(); if (cs>1 && row) { setInColSpan(TRUE); @@ -1142,11 +1218,18 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c) { m_t << "|"; } - m_t << "p{(\\linewidth-\\tabcolsep*" - << numCols() << "-\\arrayrulewidth*" - << row->visibleCells() << ")*" - << cs <<"/"<< numCols() << "}|}{"; - if (c->isHeading()) m_t << "\\cellcolor{\\tableheadbgcolor}"; + switch (a) + { + case DocHtmlCell::Right: + m_t << "r|}{"; + break; + case DocHtmlCell::Center: + m_t << "c|}{"; + break; + default: + m_t << "l|}{"; + break; + } } int rs = c->rowSpan(); if (rs>0) @@ -1156,9 +1239,8 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c) // c->rowIndex(),c->columnIndex(),c->rowSpan(),c->colSpan(), // currentColumn()); addRowSpan(new ActiveRowSpan(c,rs,cs,currentColumn())); - m_t << "\\multirow{" << rs << "}{\\linewidth}{"; + m_t << "\\multirow{" << rs << "}{*}{"; } - int a = c->alignment(); if (a==DocHtmlCell::Center) { m_t << "\\PBS\\centering "; @@ -1169,7 +1251,7 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c) } if (c->isHeading()) { - m_t << "\\textbf{ "; + m_t << "\\cellcolor{\\tableheadbgcolor}\\textbf{ "; } if (cs>1) { @@ -1217,16 +1299,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 << "{\\tt "; + m_t << "{\\texttt{ "; } void LatexDocVisitor::visitPost(DocHRef *) { if (m_hide) return; - m_t << "}"; + m_t << "}}"; } void LatexDocVisitor::visitPre(DocHtmlHeader *header) @@ -1251,7 +1333,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 { @@ -1265,7 +1347,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 { @@ -1391,6 +1473,7 @@ void LatexDocVisitor::visitPre(DocParamSect *s) if (m_hide) return; bool hasInOutSpecs = s->hasInOutSpecifier(); bool hasTypeSpecs = s->hasTypeSpecifier(); + incUsedTableLevels(); switch(s->type()) { case DocParamSect::Param: @@ -1409,11 +1492,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); @@ -1424,6 +1504,7 @@ void LatexDocVisitor::visitPre(DocParamSect *s) void LatexDocVisitor::visitPost(DocParamSect *s) { if (m_hide) return; + decUsedTableLevels(); switch(s->type()) { case DocParamSect::Param: @@ -1465,7 +1546,7 @@ void LatexDocVisitor::visitPre(DocParamList *pl) { if (pl->direction()!=DocParamSect::Unspecified) { - m_t << "\\mbox{\\tt "; + m_t << "\\mbox{\\texttt{ "; if (pl->direction()==DocParamSect::In) { m_t << "in"; @@ -1478,7 +1559,7 @@ void LatexDocVisitor::visitPre(DocParamList *pl) { m_t << "in,out"; } - m_t << "} "; + m_t << "}} "; } if (useTable) m_t << " & "; } diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h index 24f74ce..7ea8ae1 100644 --- a/src/latexdocvisitor.h +++ b/src/latexdocvisitor.h @@ -23,7 +23,6 @@ #include <qstack.h> #include <qcstring.h> #include <qlist.h> -//#include <qmap.h> class FTextStream; class CodeOutputInterface; @@ -43,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 c036d34..b860195 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -38,6 +38,8 @@ #include "filename.h" #include "resourcemgr.h" +static bool DoxyCodeOpen = FALSE; +static bool DoxyCodeLineOpen = FALSE; //------------------------------- LatexCodeGenerator::LatexCodeGenerator(FTextStream &t,const QCString &relPath,const QCString &sourceFileName) @@ -77,8 +79,8 @@ void LatexCodeGenerator::codify(const char *str) //char cs[5]; int spacesToNextTabStop; static int tabSize = Config_getInt(TAB_SIZE); - const int maxLineLen = 108; - QCString result(4*maxLineLen+1); // worst case for 1 line of 4-byte chars + static char *result = NULL; + static int lresult = 0; int i; while ((c=*p)) { @@ -86,13 +88,21 @@ void LatexCodeGenerator::codify(const char *str) { case 0x0c: p++; // remove ^L break; + case ' ': m_t <<" "; + m_col++; + p++; + break; + case '^': m_t <<"\\string^"; + m_col++; + p++; + break; case '\t': spacesToNextTabStop = tabSize - (m_col%tabSize); - m_t << Doxygen::spaces.left(spacesToNextTabStop); + for (i = 0; i < spacesToNextTabStop; i++) m_t <<" "; m_col+=spacesToNextTabStop; p++; break; - case '\n': m_t << '\n'; m_col=0; p++; + case '\n': (usedTableLevels()>0 && !DoxyCodeOpen) ? m_t << "\\newline\n" : m_t << '\n'; m_col=0; p++; break; default: i=0; @@ -100,6 +110,11 @@ void LatexCodeGenerator::codify(const char *str) #undef COPYCHAR // helper macro to copy a single utf8 character, dealing with multibyte chars. #define COPYCHAR() do { \ + if (lresult < (i + 5)) \ + { \ + lresult += 512; \ + result = (char *)realloc(result, lresult); \ + } \ result[i++]=c; p++; \ if (c<0) /* multibyte utf-8 character */ \ { \ @@ -116,30 +131,16 @@ void LatexCodeGenerator::codify(const char *str) result[i++]=*p++; \ } \ } \ - m_col++; \ + m_col++; \ } while(0) - // gather characters until we find whitespace or are at - // the end of a line + // gather characters until we find whitespace or another special character COPYCHAR(); - if (m_col>=maxLineLen) // force line break + while ((c=*p) && + c!=0x0c && c!='\t' && c!='\n' && c!=' ' && c!='^' + ) { - m_t << "\n "; - m_col=0; - } - else // copy more characters - { - while (m_col<maxLineLen && (c=*p) && - c!=0x0c && c!='\t' && c!='\n' && c!=' ' - ) - { - COPYCHAR(); - } - if (m_col>=maxLineLen) // force line break - { - m_t << "\n "; - m_col=0; - } + COPYCHAR(); } result[i]=0; // add terminator //if (m_prettyCode) @@ -164,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{"; @@ -181,7 +177,7 @@ void LatexCodeGenerator::writeCodeLink(const char *ref,const char *f, } else { - m_t << name; + codify(name); } m_col+=l; } @@ -190,6 +186,11 @@ void LatexCodeGenerator::writeLineNumber(const char *ref,const char *fileName,co { static bool usePDFLatex = Config_getBool(USE_PDFLATEX); static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS); + if (!DoxyCodeLineOpen) + { + m_t << "\\DoxyCodeLine{"; + DoxyCodeLineOpen = TRUE; + } if (m_prettyCode) { QCString lineNumber; @@ -223,10 +224,20 @@ void LatexCodeGenerator::writeLineNumber(const char *ref,const char *fileName,co void LatexCodeGenerator::startCodeLine(bool) { m_col=0; + if (!DoxyCodeLineOpen) + { + m_t << "\\DoxyCodeLine{"; + DoxyCodeLineOpen = TRUE; + } } void LatexCodeGenerator::endCodeLine() { + if (DoxyCodeLineOpen) + { + m_t << "}"; + DoxyCodeLineOpen = FALSE; + } codify("\n"); } @@ -240,6 +251,10 @@ void LatexCodeGenerator::endFontClass() m_t << "}"; } +void LatexCodeGenerator::setDoxyCodeOpen(bool val) +{ + DoxyCodeOpen = val; +} //------------------------------- @@ -271,13 +286,15 @@ static void writeLatexMakefile() exit(1); } // inserted by KONNO Akihisa <konno@researchers.jp> 2002-03-05 - QCString latex_command = Config_getString(LATEX_CMD_NAME); + QCString latex_command = theTranslator->latexCommandName(); QCString mkidx_command = Config_getString(MAKEINDEX_CMD_NAME); // end insertion by KONNO Akihisa <konno@researchers.jp> 2002-03-05 FTextStream t(&file); if (!Config_getBool(USE_PDFLATEX)) // use plain old latex { - t << "all: refman.dvi" << endl + t << "LATEX_CMD=" << latex_command << endl + << endl + << "all: refman.dvi" << endl << endl << "ps: refman.ps" << endl << endl @@ -294,7 +311,7 @@ static void writeLatexMakefile() t << "\tps2pdf refman.ps refman.pdf" << endl << endl; t << "refman.dvi: clean refman.tex doxygen.sty" << endl << "\techo \"Running latex...\"" << endl - << "\t" << latex_command << " refman.tex" << endl + << "\t$(LATEX_CMD) refman.tex" << endl << "\techo \"Running makeindex...\"" << endl << "\t" << mkidx_command << " refman.idx" << endl; if (generateBib) @@ -302,19 +319,19 @@ static void writeLatexMakefile() t << "\techo \"Running bibtex...\"" << endl; t << "\tbibtex refman" << endl; t << "\techo \"Rerunning latex....\"" << endl; - t << "\t" << latex_command << " refman.tex" << endl; + t << "\t$(LATEX_CMD) refman.tex" << endl; } t << "\techo \"Rerunning latex....\"" << endl - << "\t" << latex_command << " refman.tex" << endl + << "\t$(LATEX_CMD) refman.tex" << endl << "\tlatex_count=8 ; \\" << endl << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl << "\t do \\" << endl << "\t echo \"Rerunning latex....\" ;\\" << endl - << "\t " << latex_command << " refman.tex ;\\" << endl + << "\t $(LATEX_CMD) refman.tex ; \\" << endl << "\t latex_count=`expr $$latex_count - 1` ;\\" << endl << "\t done" << endl << "\t" << mkidx_command << " refman.idx" << endl - << "\t" << latex_command << " refman.tex" << endl << endl + << "\t$(LATEX_CMD) refman.tex" << endl << endl << "refman_2on1.ps: refman.ps" << endl << "\tpsnup -2 refman.ps >refman_2on1.ps" << endl << endl @@ -323,26 +340,28 @@ static void writeLatexMakefile() } else // use pdflatex for higher quality output { + t << "LATEX_CMD=" << latex_command << endl + << endl; t << "all: refman.pdf" << endl << endl << "pdf: refman.pdf" << endl << endl; t << "refman.pdf: clean refman.tex" << endl; - t << "\tpdflatex refman" << endl; + t << "\t$(LATEX_CMD) refman" << endl; t << "\t" << mkidx_command << " refman.idx" << endl; if (generateBib) { t << "\tbibtex refman" << endl; - t << "\tpdflatex refman" << endl; + t << "\t$(LATEX_CMD) refman" << endl; } - t << "\tpdflatex refman" << endl + t << "\t$(LATEX_CMD) refman" << endl << "\tlatex_count=8 ; \\" << endl << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl << "\t do \\" << endl << "\t echo \"Rerunning latex....\" ;\\" << endl - << "\t pdflatex refman ;\\" << endl + << "\t $(LATEX_CMD) refman ;\\" << endl << "\t latex_count=`expr $$latex_count - 1` ;\\" << endl << "\t done" << endl << "\t" << mkidx_command << " refman.idx" << endl - << "\tpdflatex refman" << endl << endl; + << "\t$(LATEX_CMD) refman" << endl << endl; } t << endl @@ -356,7 +375,7 @@ static void writeMakeBat() #if defined(_MSC_VER) QCString dir=Config_getString(LATEX_OUTPUT); QCString fileName=dir+"/make.bat"; - QCString latex_command = Config_getString(LATEX_CMD_NAME); + QCString latex_command = theTranslator->latexCommandName(); QCString mkidx_command = Config_getString(MAKEINDEX_CMD_NAME); QFile file(fileName); bool generateBib = !Doxygen::citeDict->isEmpty(); @@ -371,14 +390,15 @@ static void writeMakeBat() t << "del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf\n\n"; if (!Config_getBool(USE_PDFLATEX)) // use plain old latex { - t << latex_command << " refman.tex\n"; + t << "set LATEX_CMD=" << latex_command << "\n"; + t << "%LATEX_CMD% refman.tex\n"; t << "echo ----\n"; t << mkidx_command << " refman.idx\n"; if (generateBib) { t << "bibtex refman\n"; t << "echo ----\n"; - t << latex_command << " refman.tex\n"; + t << "\t%LATEX_CMD% refman.tex\n"; } t << "setlocal enabledelayedexpansion\n"; t << "set count=8\n"; @@ -390,28 +410,29 @@ static void writeMakeBat() t << "set /a count-=1\n"; t << "if !count! EQU 0 goto :skip\n\n"; t << "echo ----\n"; - t << latex_command << " refman.tex\n"; + t << "%LATEX_CMD% refman.tex\n"; t << "goto :repeat\n"; t << ":skip\n"; t << "endlocal\n"; t << mkidx_command << " refman.idx\n"; - t << latex_command << " refman.tex\n"; + t << "%LATEX_CMD% refman.tex\n"; t << "dvips -o refman.ps refman.dvi\n"; t << "gswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite " "-sOutputFile=refman.pdf -c save pop -f refman.ps\n"; } else // use pdflatex { - t << "pdflatex refman\n"; + t << "set LATEX_CMD=" << latex_command << "\n"; + t << "%LATEX_CMD% refman\n"; t << "echo ----\n"; t << mkidx_command << " refman.idx\n"; if (generateBib) { t << "bibtex refman" << endl; - t << "pdflatex refman" << endl; + t << "%LATEX_CMD% refman" << endl; } t << "echo ----\n"; - t << "pdflatex refman\n\n"; + t << "%LATEX_CMD% refman\n\n"; t << "setlocal enabledelayedexpansion\n"; t << "set count=8\n"; t << ":repeat\n"; @@ -422,12 +443,12 @@ static void writeMakeBat() t << "set /a count-=1\n"; t << "if !count! EQU 0 goto :skip\n\n"; t << "echo ----\n"; - t << "pdflatex refman\n"; + t << "%LATEX_CMD% refman\n"; t << "goto :repeat\n"; t << ":skip\n"; t << "endlocal\n"; t << mkidx_command << " refman.idx\n"; - t << "pdflatex refman\n"; + t << "%LATEX_CMD% refman\n"; t << "cd /D %Dir_Old%\n"; t << "set Dir_Old=\n"; } @@ -459,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)) @@ -472,8 +497,7 @@ static void writeDefaultHeaderPart1(FTextStream &t) t << "% Packages required by doxygen\n" "\\usepackage{fixltx2e}\n" // for \textsubscript "\\usepackage{calc}\n" - "\\usepackage{doxygen}\n" - "\\usepackage[export]{adjustbox} % also loads graphicx\n"; + "\\usepackage{doxygen}\n"; QStrList extraLatexStyle = Config_getList(LATEX_EXTRA_STYLESHEET); for (uint i=0; i<extraLatexStyle.count(); ++i) { @@ -504,6 +528,7 @@ static void writeDefaultHeaderPart1(FTextStream &t) "\\usepackage{textcomp}\n" "\\usepackage[nointegrals]{wasysym}\n" "\\usepackage[table]{xcolor}\n" + "\\usepackage{ifpdf,ifxetex}\n" "\n"; // Language support @@ -516,9 +541,13 @@ static void writeDefaultHeaderPart1(FTextStream &t) } // Define default fonts - t << "% Font selection\n" - "\\usepackage[T1]{fontenc}\n" - "\\usepackage[scaled=.90]{helvet}\n" + t << "% Font selection\n"; + QCString fontenc = theTranslator->latexFontenc(); + if (!fontenc.isEmpty()) + { + t << "\\usepackage[" << fontenc << "]{fontenc}\n"; + } + t << "\\usepackage[scaled=.90]{helvet}\n" "\\usepackage{courier}\n" "\\usepackage{amssymb}\n" "\\usepackage{sectsty}\n" @@ -534,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) @@ -553,7 +593,9 @@ static void writeDefaultHeaderPart1(FTextStream &t) "\\hbadness=750\n" "\\setlength{\\emergencystretch}{15pt}\n" "\\setlength{\\parindent}{0cm}\n" - "\\setlength{\\parskip}{3ex plus 2ex minus 2ex}\n"; + "\\newcommand{\\doxynormalparskip}{\\setlength{\\parskip}{3ex plus 2ex minus 2ex}}\n" + "\\newcommand{\\doxytocparskip}{\\setlength{\\parskip}{1ex plus 0ex minus 0ex}}\n" + "\\doxynormalparskip\n"; // Redefine paragraph/subparagraph environments, using sectsty fonts t << "\\makeatletter\n" "\\renewcommand{\\paragraph}{%\n" @@ -615,23 +657,40 @@ static void writeDefaultHeaderPart1(FTextStream &t) "\\usepackage{natbib}\n" "\\usepackage[titles]{tocloft}\n" "\\setcounter{tocdepth}{3}\n" - "\\setcounter{secnumdepth}{5}\n" - "\\makeindex\n" - "\n"; + "\\setcounter{secnumdepth}{5}\n"; + + QCString latex_mkidx_command = Config_getString(LATEX_MAKEINDEX_CMD); + if (!latex_mkidx_command.isEmpty()) + { + if (latex_mkidx_command[0] == '\\') + t << latex_mkidx_command << "\n"; + else + t << '\\' << latex_mkidx_command << "\n"; + } + else + { + t << "\\makeindex\n"; + } + t << "\n"; writeExtraLatexPackages(t); + writeLatexSpecialFormulaChars(t); // Hyperlinks bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS); if (pdfHyperlinks) { t << "% Hyperlinks (required, but should be loaded last)\n" - "\\usepackage{ifpdf}\n" "\\ifpdf\n" " \\usepackage[pdftex,pagebackref=true]{hyperref}\n" "\\else\n" - " \\usepackage[ps2pdf,pagebackref=true]{hyperref}\n" + " \\ifxetex\n" + " \\usepackage[pagebackref=true]{hyperref}\n" + " \\else\n" + " \\usepackage[ps2pdf,pagebackref=true]{hyperref}\n" + " \\fi\n" "\\fi\n" + "\n" "\\hypersetup{%\n" " colorlinks=true,%\n" " linkcolor=blue,%\n" @@ -652,12 +711,23 @@ static void writeDefaultHeaderPart1(FTextStream &t) t << "\\usepackage{caption}\n" << "\\captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}\n\n"; + + // in page table of contents + t << "\\usepackage{etoc}\n" + "\\etocsettocstyle{\\doxytocparskip}{\\doxynormalparskip}\n"; + + // prevent numbers overlap the titles in toc + t << "\\renewcommand{\\numberline}[1]{#1~}\n"; + // End of preamble, now comes the document contents t << "%===== C O N T E N T S =====\n" "\n" "\\begin{document}\n"; - if (theTranslator->idLanguage()=="greek") - t << "\\selectlanguage{greek}\n"; + QCString documentPre = theTranslator->latexDocumentPre(); + if (!documentPre.isEmpty()) + { + t << documentPre; + } t << "\n"; // Front matter @@ -748,10 +818,15 @@ static void writeDefaultFooter(FTextStream &t) t << "\\newpage\n" "\\phantomsection\n" "\\clearemptydoublepage\n" - "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trRTFGeneralIndex() << "}\n" + "\\addcontentsline{toc}{" << unit << "}{\\indexname}\n" "\\printindex\n" - "\n" - "\\end{document}\n"; + "\n"; + QCString documentPost = theTranslator->latexDocumentPost(); + if (!documentPost.isEmpty()) + { + t << documentPost; + } + t << "\\end{document}\n"; } void LatexGenerator::writeHeaderFile(QFile &f) @@ -1304,12 +1379,12 @@ void LatexGenerator::startHtmlLink(const char *url) t << url; t << "}"; } - t << "{\\tt "; + t << "{\\texttt{ "; } void LatexGenerator::endHtmlLink() { - t << "}"; + t << "}}"; } //void LatexGenerator::writeMailLink(const char *url) @@ -1320,7 +1395,7 @@ void LatexGenerator::endHtmlLink() // t << url; // t << "}"; // } -// t << "{\\tt "; +// t << "\\texttt{ "; // docify(url); // t << "}"; //} @@ -1328,7 +1403,7 @@ void LatexGenerator::endHtmlLink() void LatexGenerator::writeStartAnnoItem(const char *,const char *, const char *path,const char *name) { - t << "\\item\\contentsline{section}{\\bf "; + t << "\\item\\contentsline{section}\\textbf{ "; if (path) docify(path); docify(name); t << "} "; @@ -1363,7 +1438,7 @@ void LatexGenerator::endIndexValue(const char *name,bool /*hasBrief*/) //void LatexGenerator::writeClassLink(const char *,const char *, // const char *,const char *name) //{ -// t << "{\\bf "; +// t << "\\textbf{ "; // docify(name); // t << "}"; //} @@ -1454,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; } } @@ -1505,7 +1580,7 @@ void LatexGenerator::endGroupHeader(int) t << "}" << endl; } -void LatexGenerator::startMemberHeader(const char *) +void LatexGenerator::startMemberHeader(const char *,int) { if (Config_getBool(COMPACT_LATEX)) { @@ -1537,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; @@ -1575,7 +1650,7 @@ void LatexGenerator::startMemberDoc(const char *clname, { t << "\\texorpdfstring{"; } - t << latexEscapeIndexChars(title,insideTabbing); + t << latexEscapeIndexChars(title); if (pdfHyperlinks) { t << "}{" << latexEscapePDFString(title) << "}"; @@ -1650,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 << "}"; @@ -1793,7 +1868,7 @@ void LatexGenerator::endMemberItem() t << endl; } -void LatexGenerator::startMemberDescription(const char *,const char *) +void LatexGenerator::startMemberDescription(const char *,const char *,bool) { if (!insideTabbing) { @@ -1849,11 +1924,13 @@ void LatexGenerator::writeNonBreakableSpace(int) void LatexGenerator::startDescTable(const char *title) { + incUsedTableLevels(); t << "\\begin{DoxyEnumFields}{" << title << "}" << endl; } void LatexGenerator::endDescTable() { + decUsedTableLevels(); t << "\\end{DoxyEnumFields}" << endl; } @@ -2028,22 +2105,14 @@ void LatexGenerator::endDescItem() } } -void LatexGenerator::startSimpleSect(SectionTypes,const char *file, - const char *anchor,const char *title) +void LatexGenerator::startExamples() { t << "\\begin{Desc}\n\\item["; - if (file) - { - writeObjectLink(0,file,anchor,title); - } - else - { - docify(title); - } + docify(theTranslator->trExamples()); t << "]"; } -void LatexGenerator::endSimpleSect() +void LatexGenerator::endExamples() { t << "\\end{Desc}" << endl; } @@ -2074,7 +2143,7 @@ void LatexGenerator::endParameterList() void LatexGenerator::startParameterType(bool first,const char *key) { t << "\\item[{"; - if (!first && key) t << key; + if (!first && key) docify(key); } void LatexGenerator::endParameterType() @@ -2100,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 << " "; @@ -2157,12 +2226,17 @@ void LatexGenerator::endConstraintList() void LatexGenerator::startCodeFragment() { - t << "\n\\begin{DoxyCode}\n"; + t << "\n\\begin{DoxyCode}{" << usedTableLevels() << "}\n"; + DoxyCodeOpen = TRUE; } void LatexGenerator::endCodeFragment() { + //endCodeLine checks is there is still an open code line, if so closes it. + endCodeLine(); + t << "\\end{DoxyCode}\n"; + DoxyCodeOpen = FALSE; } void LatexGenerator::startInlineHeader() @@ -2196,6 +2270,7 @@ void LatexGenerator::lineBreak(const char *) void LatexGenerator::startMemberDocSimple(bool isEnum) { + incUsedTableLevels(); if (isEnum) { t << "\\begin{DoxyEnumFields}{"; @@ -2211,6 +2286,7 @@ void LatexGenerator::startMemberDocSimple(bool isEnum) void LatexGenerator::endMemberDocSimple(bool isEnum) { + decUsedTableLevels(); if (isEnum) { t << "\\end{DoxyEnumFields}" << endl; diff --git a/src/latexgen.h b/src/latexgen.h index 430d250..1460000 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -51,6 +51,7 @@ class LatexCodeGenerator : public CodeOutputInterface void writeCodeAnchor(const char *) {} void setCurrentDoc(Definition *,const char *,bool) {} void addWord(const char *,bool) {} + static void setDoxyCodeOpen(bool val); private: void _writeCodeLink(const char *className, @@ -169,7 +170,7 @@ class LatexGenerator : public OutputGenerator void endMemberSections() {} void startHeaderSection() {} void endHeaderSection() {} - void startMemberHeader(const char *); + void startMemberHeader(const char *,int); void endMemberHeader(); void startMemberSubtitle() {} void endMemberSubtitle() {} @@ -194,6 +195,7 @@ class LatexGenerator : public OutputGenerator void endMemberGroup(bool); void insertMemberAlign(bool) {} + void insertMemberAlignLeft(int,bool){} void writeRuler() { t << endl << endl; } void writeAnchor(const char *fileName,const char *name); @@ -225,7 +227,7 @@ class LatexGenerator : public OutputGenerator void endCenter() { t << "\\end{center}" << endl; } void startSmall() { t << "\\footnotesize "; } void endSmall() { t << "\\normalsize "; } - void startMemberDescription(const char *,const char *); + void startMemberDescription(const char *,const char *,bool); void endMemberDescription(); void startMemberDeclaration() {} void endMemberDeclaration(const char *,const char *) {} @@ -233,8 +235,8 @@ class LatexGenerator : public OutputGenerator const char *,const char *,const char *) {} void startDescList(SectionTypes) { t << "\\begin{Desc}\n\\item["; } void endDescList() { t << "\\end{Desc}" << endl; } - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *title); void endParamList(); void startDescForItem() { t << "\\par" << endl; } diff --git a/src/layout.cpp b/src/layout.cpp index fdc9f4c..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", @@ -310,7 +314,7 @@ class LayoutParser : public QXmlDefaultHandler new StartElementHandlerSection(this,LayoutDocEntry::ClassNestedClasses,&LayoutParser::startSectionEntry, COMPILE_FOR_2_OPTIONS( theTranslator->trCompounds(), - SrcLangExt_VHDL,VhdlDocGen::trVhdlType(VhdlDocGen::ENTITY,FALSE), + SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE), SrcLangExt_Fortran,theTranslator->trDataTypes() ))); m_sHandler.insert("class/memberdecl/services", @@ -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,28 +491,45 @@ 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( theTranslator->trCompounds(), - SrcLangExt_VHDL,VhdlDocGen::trVhdlType(VhdlDocGen::ENTITY,FALSE), + 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())); @@ -508,11 +539,12 @@ class LayoutParser : public QXmlDefaultHandler COMPILE_FOR_2_OPTIONS( theTranslator->trFunctions(), SrcLangExt_Fortran,theTranslator->trSubprograms(), - SrcLangExt_VHDL,VhdlDocGen::trFunctionAndProc() + SrcLangExt_VHDL,theTranslator->trFunctionAndProc() ))); 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,20 +607,30 @@ 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( theTranslator->trCompounds(), - SrcLangExt_VHDL,VhdlDocGen::trVhdlType(VhdlDocGen::ENTITY,FALSE), + 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())); @@ -599,11 +656,12 @@ class LayoutParser : public QXmlDefaultHandler COMPILE_FOR_2_OPTIONS( theTranslator->trFunctions(), SrcLangExt_Fortran,theTranslator->trSubprograms(), - SrcLangExt_VHDL,VhdlDocGen::trFunctionAndProc() + SrcLangExt_VHDL,theTranslator->trFunctionAndProc() ))); 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, @@ -660,7 +725,7 @@ class LayoutParser : public QXmlDefaultHandler new StartElementHandlerSection(this,LayoutDocEntry::GroupClasses,&LayoutParser::startSectionEntry, COMPILE_FOR_2_OPTIONS( theTranslator->trCompounds(), - SrcLangExt_VHDL,VhdlDocGen::trVhdlType(VhdlDocGen::ENTITY,FALSE), + SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE), SrcLangExt_Fortran,theTranslator->trDataTypes() ))); m_sHandler.insert("group/memberdecl/namespaces", @@ -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())); @@ -701,7 +772,7 @@ class LayoutParser : public QXmlDefaultHandler COMPILE_FOR_2_OPTIONS( theTranslator->trFunctions(), SrcLangExt_Fortran,theTranslator->trSubprograms(), - SrcLangExt_VHDL,VhdlDocGen::trFunctionAndProc() + SrcLangExt_VHDL,theTranslator->trFunctionAndProc() ))); m_sHandler.insert("group/memberdecl/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, @@ -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,60 +1012,137 @@ 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", LayoutNavEntry::ClassIndex, - fortranOpt ? theTranslator->trDataTypes() : vhdlOpt ? VhdlDocGen::trDesignUnits() : theTranslator->trCompoundIndex(), + fortranOpt ? theTranslator->trDataTypes() : vhdlOpt ? theTranslator->trDesignUnits() : theTranslator->trCompoundIndex(), QCString(), QCString(), "classes" }, { "classes", LayoutNavEntry::Classes, - fortranOpt ? theTranslator->trCompoundListFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitList() : theTranslator->trClasses(), + fortranOpt ? theTranslator->trCompoundListFortran() : vhdlOpt ? theTranslator->trDesignUnitList() : theTranslator->trClasses(), theTranslator->trCompoundList(), - fortranOpt ? theTranslator->trCompoundListDescriptionFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitListDescription() : theTranslator->trCompoundListDescription(), + fortranOpt ? theTranslator->trCompoundListDescriptionFortran() : vhdlOpt ? theTranslator->trDesignUnitListDescription() : theTranslator->trCompoundListDescription(), "annotated" }, { "classlist", LayoutNavEntry::ClassList, - fortranOpt ? theTranslator->trCompoundListFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitList() : theTranslator->trCompoundList(), + fortranOpt ? theTranslator->trCompoundListFortran() : vhdlOpt ? theTranslator->trDesignUnitList() : theTranslator->trCompoundList(), QCString(), - fortranOpt ? theTranslator->trCompoundListDescriptionFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitListDescription() : theTranslator->trCompoundListDescription(), + fortranOpt ? theTranslator->trCompoundListDescriptionFortran() : vhdlOpt ? theTranslator->trDesignUnitListDescription() : theTranslator->trCompoundListDescription(), "annotated" }, { "hierarchy", LayoutNavEntry::ClassHierarchy, - vhdlOpt ? VhdlDocGen::trDesignUnitHierarchy() : theTranslator->trClassHierarchy(), + vhdlOpt ? theTranslator->trDesignUnitHierarchy() : theTranslator->trClassHierarchy(), QCString(), theTranslator->trClassHierarchyDescription(), hasGraphicalHierarchy ? "inherits" : "hierarchy" }, { "classmembers", LayoutNavEntry::ClassMembers, - fortranOpt ? theTranslator->trCompoundMembersFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitMembers() : theTranslator->trCompoundMembers(), + fortranOpt ? theTranslator->trCompoundMembersFortran() : vhdlOpt ? theTranslator->trDesignUnitMembers() : theTranslator->trCompoundMembers(), QCString(), 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 2233cc6..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; @@ -120,6 +136,13 @@ void ManDocVisitor::visit(DocStyleChange *s) if (s->enable()) m_t << "\\fB"; else m_t << "\\fP"; m_firstCol=FALSE; break; + case DocStyleChange::Strike: + /* not supported */ + break; + case DocStyleChange::Underline: //underline is shown as emphasis + if (s->enable()) m_t << "\\fI"; else m_t << "\\fP"; + m_firstCol=FALSE; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "\\fI"; else m_t << "\\fP"; m_firstCol=FALSE; @@ -899,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 17e6003..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 */ @@ -283,7 +283,7 @@ void ManGenerator::endGroupHeader(int) upperCase=FALSE; } -void ManGenerator::startMemberHeader(const char *) +void ManGenerator::startMemberHeader(const char *,int) { if (!firstCol) t << endl; t << ".SS \""; @@ -619,9 +619,9 @@ void ManGenerator::startSection(const char *,const char *,SectionInfo::SectionTy { case SectionInfo::Page: startGroupHeader(FALSE); break; case SectionInfo::Section: startGroupHeader(FALSE); break; - case SectionInfo::Subsection: startMemberHeader(0); break; - case SectionInfo::Subsubsection: startMemberHeader(0); break; - case SectionInfo::Paragraph: startMemberHeader(0); break; + case SectionInfo::Subsection: startMemberHeader(0, -1); break; + case SectionInfo::Subsubsection: startMemberHeader(0, -1); break; + case SectionInfo::Paragraph: startMemberHeader(0, -1); break; default: ASSERT(0); break; } } @@ -650,8 +650,25 @@ void ManGenerator::endSection(const char *,SectionInfo::SectionType type) } } -void ManGenerator::startSimpleSect(SectionTypes,const char *, - const char *,const char *title) +void ManGenerator::startExamples() +{ + if (!firstCol) + { t << endl << ".PP" << endl; + firstCol=TRUE; paragraph=TRUE; + col=0; + } + paragraph=FALSE; + startBold(); + docify(theTranslator->trExamples()); + endBold(); + paragraph=TRUE; +} + +void ManGenerator::endExamples() +{ +} + +void ManGenerator::startDescTable(const char *title) { if (!firstCol) { t << endl << ".PP" << endl; @@ -663,10 +680,12 @@ void ManGenerator::startSimpleSect(SectionTypes,const char *, docify(title); endBold(); paragraph=TRUE; + startDescForItem(); } -void ManGenerator::endSimpleSect() +void ManGenerator::endDescTable() { + endDescForItem(); } void ManGenerator::startParamList(ParamListTypes,const char *title) diff --git a/src/mangen.h b/src/mangen.h index b3b9f76..e109355 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -99,9 +99,10 @@ class ManGenerator : public OutputGenerator void endMemberSections() {} void startHeaderSection() {} void endHeaderSection(); - void startMemberHeader(const char *); + void startMemberHeader(const char *,int); void endMemberHeader(); void insertMemberAlign(bool) {} + void insertMemberAlignLeft(int,bool){} void startMemberSubtitle() {} void endMemberSubtitle() {} //void writeListItem(); @@ -160,7 +161,7 @@ class ManGenerator : public OutputGenerator void endCenter() {} void startSmall() {} void endSmall() {} - void startMemberDescription(const char *,const char *) { t << "\n.RI \""; firstCol=FALSE; } + void startMemberDescription(const char *,const char *,bool) { t << "\n.RI \""; firstCol=FALSE; } void endMemberDescription() { t << "\""; firstCol=FALSE; } void startMemberDeclaration() {} void endMemberDeclaration(const char *,const char *) {} @@ -168,8 +169,8 @@ class ManGenerator : public OutputGenerator const char *,const char *,const char *) {} void startDescList(SectionTypes); void endDescList() {} - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *title); void endParamList(); //void writeDescItem(); @@ -196,9 +197,8 @@ class ManGenerator : public OutputGenerator void endContents() {} void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; } - void startDescTable(const char *t) - { startSimpleSect(EnumValues,0,0,t); startDescForItem(); } - void endDescTable() { endDescForItem(); endSimpleSect(); } + void startDescTable(const char *t); + void endDescTable(); void startDescTableRow() {} void endDescTableRow() {} void startDescTableTitle() { startItemListItem(); startBold(); startEmphasis(); endItemListItem(); } diff --git a/src/markdown.cpp b/src/markdown.cpp index 1cd06e5..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]=='@') //---------- @@ -240,7 +240,7 @@ static QCString isBlockCommand(const char *data,int offset,int size) { return "f]"; } - else if (data[end]=='}') + else if (data[end]=='{') { return "f}"; } @@ -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) @@ -483,6 +485,8 @@ static int processNmdash(GrowBuf &out,const char *data,int off,int size) { count++; } + if (count==2 && off>=2 && qstrncmp(data-2,"<!",2)==0) return 0; // start HTML comment + if (count==2 && (data[2]=='>')) return 0; // end HTML comment if (count==2 && (off<8 || qstrncmp(data-8,"operator",8)!=0)) // -- => ndash { out.addStr("–"); @@ -614,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' || @@ -633,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) @@ -645,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; @@ -842,7 +867,15 @@ static int processLink(GrowBuf &out,const char *data,int,int size) } if (isToc) // special case for [TOC] { - if (g_current) g_current->stat=TRUE; + 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) { @@ -852,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 { @@ -1588,15 +1611,15 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size) int columns,start,end,cc; i = findTableColumns(data,size,start,end,columns); - + + int headerStart = start; + int headerEnd = end; + #ifdef USE_ORIGINAL_TABLES out.addStr("<table>"); // write table header, in range [start..end] out.addStr("<tr>"); - - int headerStart = start; - int headerEnd = end; #endif // read cell alignments @@ -1710,9 +1733,6 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size) QVector<QVector<TableCell> > tableContents; tableContents.setAutoDelete(TRUE); - int headerStart = start; - int headerEnd = end; - int m=headerStart; QVector<TableCell> *headerContents = new QVector<TableCell>(columns); headerContents->setAutoDelete(TRUE); @@ -1781,22 +1801,20 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size) QCString cellTag("th"), cellClass("class=\"markdownTableHead"); for (unsigned row = 0; row < tableContents.size(); row++) { - out.addStr(" <tr class=\"markdownTable"); if (row) { - out.addStr("Body\""); if (row % 2) { - out.addStr(" class=\"markdownTableRowOdd\">\n"); + out.addStr("<tr class=\"markdownTableRowOdd\">\n"); } else { - out.addStr(" class=\"markdownTableRowEven\">\n"); + out.addStr("<tr class=\"markdownTableRowEven\">\n"); } } else { - out.addStr("Head\">\n"); + out.addStr(" <tr class=\"markdownTableHead\">\n"); } for (int c = 0; c < columns; c++) { @@ -1882,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))) { @@ -1911,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 { @@ -1950,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"); } } } @@ -2061,7 +2058,7 @@ static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent) } // start searching for the end of the line start at offset \a i -// keeping track of possible blocks that need to to skipped. +// keeping track of possible blocks that need to be skipped. static void findEndOfLine(GrowBuf &out,const char *data,int size, int &pi,int&i,int &end) { @@ -2317,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; @@ -2516,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; @@ -2548,7 +2546,7 @@ QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,cons // finally process the inline markup (links, emphasis and code spans) processInline(out,s,s.length()); out.addChar(0); - Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n%s\n---- output -----\n%s\n---------\n",qPrint(input),qPrint(out.get())); + Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n%s\n---- output -----\n%s\n=========\n",qPrint(input),qPrint(out.get())); return out.get(); } diff --git a/src/marshal.cpp b/src/marshal.cpp index af14978..c68718a 100644 --- a/src/marshal.cpp +++ b/src/marshal.cpp @@ -10,6 +10,7 @@ #include "groupdef.h" #include "example.h" #include "arguments.h" +#include "doxygen.h" #define HEADER ('D'<<24)+('O'<<16)+('X'<<8)+'!' @@ -142,6 +143,7 @@ void marshalSectionInfoList(StorageIntf *s, QList<SectionInfo> *anchors) marshalInt(s,si->lineNr); marshalInt(s,si->level); } + anchors->clear(); } } @@ -344,6 +346,15 @@ void marshalMemberLists(StorageIntf *s,SDict<MemberList> *mls) } } +void marshalLocalToc(StorageIntf *s,const LocalToc <) +{ + marshalInt(s,lt.mask()); + marshalInt(s,lt.htmlLevel()); + marshalInt(s,lt.latexLevel()); + marshalInt(s,lt.xmlLevel()); + marshalInt(s,lt.docbookLevel()); +} + void marshalEntry(StorageIntf *s,Entry *e) { marshalUInt(s,HEADER); @@ -355,11 +366,14 @@ void marshalEntry(StorageIntf *s,Entry *e) marshalUInt64(s,e->spec); marshalInt(s,e->initLines); marshalBool(s,e->stat); + marshalLocalToc(s,e->localToc); marshalBool(s,e->explicitExternal); marshalBool(s,e->proto); 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); @@ -399,6 +413,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) @@ -537,11 +552,10 @@ QList<SectionInfo> *unmarshalSectionInfoList(StorageIntf *s) uint i; uint count = unmarshalUInt(s); if (count==NULL_LIST) return 0; // null list - QList<SectionInfo> *result = new QList<SectionInfo>; - result->setAutoDelete(TRUE); + QList<SectionInfo> *anchors = new QList<SectionInfo>; assert(count<1000000); for (i=0;i<count;i++) - { + { QCString label = unmarshalQCString(s); QCString title = unmarshalQCString(s); QCString ref = unmarshalQCString(s); @@ -549,9 +563,20 @@ QList<SectionInfo> *unmarshalSectionInfoList(StorageIntf *s) QCString fileName = unmarshalQCString(s); int lineNr = unmarshalInt(s); int level = unmarshalInt(s); - result->append(new SectionInfo(fileName,lineNr,label,title,type,level,ref)); + SectionInfo *si = Doxygen::sectionDict->find(label); + if (si==0) // This should actually never be true since all anchors should be in sectionDict. + // Could still optimize the marshaling routine by only storing label. + { + SectionInfo *si = new SectionInfo(fileName,lineNr,label,title,type,level,ref); + anchors->append(si); + Doxygen::sectionDict->append(label,si); // this dict owns the anchor objects + } + else + { + anchors->append(si); + } } - return result; + return anchors; } QList<ListItemInfo> *unmarshalItemInfoList(StorageIntf *s) @@ -724,6 +749,33 @@ SDict<MemberList> *unmarshalMemberLists(StorageIntf *s) return result; } +LocalToc unmarshalLocalToc(StorageIntf *s) +{ + LocalToc result; + int mask = unmarshalInt(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); + } + if ((mask & (1<<LocalToc::Latex))!=0) + { + result.enableLatex(latexLevel); + } + if ((mask & (1<<LocalToc::Xml))!=0) + { + result.enableXml(xmlLevel); + } + if ((mask & (1<<LocalToc::Docbook))!=0) + { + result.enableDocbook(docbookLevel); + } + return result; +} + Entry * unmarshalEntry(StorageIntf *s) { Entry *e = new Entry; @@ -737,11 +789,14 @@ Entry * unmarshalEntry(StorageIntf *s) e->spec = unmarshalUInt64(s); e->initLines = unmarshalInt(s); e->stat = unmarshalBool(s); + e->localToc = unmarshalLocalToc(s); e->explicitExternal = unmarshalBool(s); e->proto = unmarshalBool(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); @@ -785,6 +840,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 01f4d8d..a2fcf69 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -101,7 +101,7 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr // ol.endParameterName(last==FALSE) // ... // ol.startParameterType(first=FALSE) -// ol.endParamtereType +// ol.endParameterType // ol.startParameterName // ol.endParameterName(last==TRUE) // ... @@ -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 @@ -571,10 +582,12 @@ class MemberDefImpl bool stat; // is it a static function? bool proto; // is it a prototype; bool docEnumValues; // is an enum with documented enum values. - bool annScope; // member is part of an annoymous scope + bool annScope; // member is part of an anonymous scope 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"; @@ -1978,7 +1999,7 @@ void MemberDef::getLabels(QStrList &sl,Definition *container) const bool extractPrivate = Config_getBool(EXTRACT_PRIVATE); if (optVhdl) { - sl.append(VhdlDocGen::trTypeString(getMemberSpecifiers())); + sl.append(theTranslator->trVhdlType(getMemberSpecifiers(),TRUE)); } else { @@ -2309,11 +2330,11 @@ void MemberDef::_writeExamples(OutputList &ol) // write the list of examples that use this member if (hasExamples()) { - ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); + ol.startExamples(); ol.startDescForItem(); writeExample(ol,m_impl->exampleSDict); ol.endDescForItem(); - ol.endSimpleSect(); + ol.endExamples(); } } @@ -2346,8 +2367,6 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, { if (first) { - //ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": "); - //ol.startDescForItem(); ol.startDescTable(theTranslator->trEnumerationValues()); } @@ -2355,28 +2374,17 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, ol.addIndexItem(fmd->name(),ciname); ol.addIndexItem(ciname,fmd->name()); - //Doxygen::indexList->addIndexItem( - // ciname, // level1 - // fmd->name(), // level2 - // separateMemPages ? cfname : cfiname, // contRef - // cfname, // memRef - // fmd->anchor(), // anchor - // fmd); // memberdef Doxygen::indexList->addIndexItem(container,fmd); - //ol.writeListItem(); ol.startDescTableTitle(); ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString()); first=FALSE; - //ol.startEmphasis(); ol.docify(fmd->name()); - //ol.endEmphasis(); ol.disableAllBut(OutputGenerator::Man); ol.writeString(" "); ol.enableAll(); ol.endDoxyAnchor(cfname,fmd->anchor()); ol.endDescTableTitle(); - //ol.newParagraph(); ol.startDescTableData(); bool hasBrief = !fmd->briefDescription().isEmpty(); @@ -2407,11 +2415,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, } if (!first) { - //ol.endItemList(); ol.endDescTable(); - //ol.endDescForItem(); - //ol.endSimpleSect(); - //ol.writeChar('\n'); } } } @@ -2433,6 +2437,10 @@ QCString MemberDef::displayDefinition() const else { ldef.prepend("enum "); + if (isSliceLocal()) + { + ldef.prepend("local "); + } } } else if (isEnumValue()) @@ -2567,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) { @@ -2576,7 +2584,7 @@ void MemberDef::writeDocumentation(MemberList *ml, else if (getFileDef()) { scopeName=getFileDef()->displayName(); scopedContainer=getFileDef(); } ciname = ((GroupDef *)container)->groupTitle(); } - else if (container->definitionType()==TypeFile && getNamespaceDef()) + else if (container->definitionType()==TypeFile && getNamespaceDef() && lang != SrcLangExt_Python) { // member is in a namespace, but is written as part of the file documentation // as well, so we need to make sure its label is unique. memAnchor.prepend("file_"); @@ -2610,6 +2618,10 @@ void MemberDef::writeDocumentation(MemberList *ml, else { ldef.prepend("enum "); + if (isSliceLocal()) + { + ldef.prepend("local "); + } } } else if (isEnumValue()) @@ -2626,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(); @@ -2681,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)) @@ -2785,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), @@ -2991,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); @@ -3089,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); } @@ -3206,13 +3251,18 @@ 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"; } } void MemberDef::warnIfUndocumented() { - if (m_impl->memberGroup) return; + /* + * Removed bug_303020: + * if (m_impl->memberGroup) return; + */ ClassDef *cd = getClassDef(); NamespaceDef *nd = getNamespaceDef(); FileDef *fd = getFileDef(); @@ -3465,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)); @@ -3627,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) { @@ -3850,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("  "); typeDecl.popGeneratorState(); } @@ -3962,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 { @@ -4187,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; @@ -4524,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; @@ -4594,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; @@ -5106,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..abb8aff 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); @@ -729,7 +745,7 @@ void MemberList::writeDocumentation(OutputList &ol, } if (memberGroupList) { - printf("MemberList::writeDocumentation() -- member groups %d\n",memberGroupList->count()); + //printf("MemberList::writeDocumentation() -- member groups %d\n",memberGroupList->count()); MemberGroupListIterator mgli(*memberGroupList); MemberGroup *mg; for (;(mg=mgli.current());++mgli) @@ -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 c674760..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 = lde->kind()==LayoutDocEntry::NamespaceClasses ? "nested-classes" : "namespaces"; + 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 = "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) @@ -961,7 +1085,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title, bool found=FALSE; for (ni.toFirst();(nd=ni.current()) && !found;++ni) { - if (nd->isLinkable()) + if (nd->isLinkable() && nd->hasDocumentation()) { SrcLangExt lang = nd->getLanguage(); if (SrcLangExt_IDL==lang) @@ -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 7e28bac..a99cff3 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -145,7 +145,8 @@ class BaseOutputDocInterface : public CodeOutputInterface Since, Date, Bug, Note, Warning, Par, Deprecated, Pre, Post, Invar, Remark, Attention, - Todo, Test, RCS, */ EnumValues, + Todo, Test, RCS, */ + EnumValues, Examples }; @@ -279,9 +280,8 @@ class BaseOutputDocInterface : public CodeOutputInterface virtual void startSmall() = 0; virtual void endSmall() = 0; - virtual void startSimpleSect(SectionTypes t,const char *file, - const char *anchor,const char *title) = 0; - virtual void endSimpleSect() = 0; + virtual void startExamples() = 0; + virtual void endExamples() = 0; virtual void startParamList(ParamListTypes t,const char *title) = 0; virtual void endParamList() = 0; @@ -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(); @@ -380,7 +380,7 @@ class OutputGenerator : public BaseOutputDocInterface virtual void endMemberSections() = 0; virtual void startHeaderSection() = 0; virtual void endHeaderSection() = 0; - virtual void startMemberHeader(const char *anchor) = 0; + virtual void startMemberHeader(const char *anchor, int typ) = 0; virtual void endMemberHeader() = 0; virtual void startMemberSubtitle() = 0; virtual void endMemberSubtitle() = 0; @@ -403,6 +403,7 @@ class OutputGenerator : public BaseOutputDocInterface virtual void startMemberGroup() = 0; virtual void endMemberGroup(bool) = 0; virtual void insertMemberAlign(bool) = 0; + virtual void insertMemberAlignLeft(int,bool) = 0; virtual void startMemberDoc(const char *,const char *, const char *,const char *,int,int,bool) = 0; virtual void endMemberDoc(bool) = 0; @@ -414,7 +415,7 @@ class OutputGenerator : public BaseOutputDocInterface virtual void writeStartAnnoItem(const char *type,const char *file, const char *path,const char *name) = 0; virtual void writeEndAnnoItem(const char *name) = 0; - virtual void startMemberDescription(const char *anchor,const char *inheritId) = 0; + virtual void startMemberDescription(const char *anchor,const char *inheritId, bool typ) = 0; virtual void endMemberDescription() = 0; virtual void startMemberDeclaration() = 0; virtual void endMemberDeclaration(const char *anchor,const char *inheritId) = 0; @@ -446,6 +447,8 @@ class OutputGenerator : public BaseOutputDocInterface virtual void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first) = 0; virtual void startContents() = 0; virtual void endContents() = 0; + virtual void startPageDoc(const char *pageTitle) {}; + virtual void endPageDoc() {}; virtual void startTextBlock(bool) = 0; virtual void endTextBlock(bool) = 0; virtual void lastIndexPage() = 0; diff --git a/src/outputlist.h b/src/outputlist.h index 5cec439..5fd8017 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -191,8 +191,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startHeaderSection); } void endHeaderSection() { forall(&OutputGenerator::endHeaderSection); } - void startMemberHeader(const char *anchor) - { forall(&OutputGenerator::startMemberHeader,anchor); } + void startMemberHeader(const char *anchor, int typ = 2) + { forall(&OutputGenerator::startMemberHeader,anchor,typ); } void endMemberHeader() { forall(&OutputGenerator::endMemberHeader); } void startMemberSubtitle() @@ -237,6 +237,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::endMemberGroup,last); } void insertMemberAlign(bool templ=FALSE) { forall(&OutputGenerator::insertMemberAlign,templ); } + void insertMemberAlignLeft(int typ=0, bool templ=FALSE) + { forall(&OutputGenerator::insertMemberAlignLeft,typ,templ); } void writeRuler() { forall(&OutputGenerator::writeRuler); } void writeAnchor(const char *fileName,const char *name) @@ -306,8 +308,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startBold); } void endBold() { forall(&OutputGenerator::endBold); } - void startMemberDescription(const char *anchor,const char *inheritId=0) - { forall(&OutputGenerator::startMemberDescription,anchor,inheritId); } + void startMemberDescription(const char *anchor,const char *inheritId=0, bool typ = false) + { forall(&OutputGenerator::startMemberDescription,anchor,inheritId, typ); } void endMemberDescription() { forall(&OutputGenerator::endMemberDescription); } void startMemberDeclaration() @@ -319,11 +321,10 @@ class OutputList : public OutputDocInterface const char *title,const char *name) { forall(&OutputGenerator::writeInheritedSectionTitle,id,ref, file,anchor,title,name); } - void startSimpleSect(SectionTypes t,const char *file,const char *anchor, - const char *title) - { forall(&OutputGenerator::startSimpleSect,t,file,anchor,title); } - void endSimpleSect() - { forall(&OutputGenerator::endSimpleSect); } + void startExamples() + { forall(&OutputGenerator::startExamples); } + void endExamples() + { forall(&OutputGenerator::endExamples); } void startParamList(ParamListTypes t,const char *title) { forall(&OutputGenerator::startParamList,t,title); } void endParamList() @@ -366,6 +367,10 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startContents); } void endContents() { forall(&OutputGenerator::endContents); } + void startPageDoc(const char *pageTitle) + { forall(&OutputGenerator::startPageDoc, pageTitle); } + void endPageDoc() + { forall(&OutputGenerator::endPageDoc); } void writeNonBreakableSpace(int num) { forall(&OutputGenerator::writeNonBreakableSpace,num); } void startDescTable(const char *title) diff --git a/src/pagedef.cpp b/src/pagedef.cpp index 2517942..79a78d3 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -35,7 +35,7 @@ PageDef::PageDef(const char *f,int l,const char *n, m_pageScope = 0; m_nestingLevel = 0; m_fileName = ::convertNameToFile(n,FALSE,TRUE); - m_showToc = FALSE; + m_showLineNo = FALSE; } PageDef::~PageDef() @@ -187,10 +187,12 @@ 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) { + ol.startPageDoc(si->title); //ol.startSection(si->label,si->title,si->type); startTitle(ol,getOutputFileBase(),this); ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE); @@ -200,16 +202,19 @@ void PageDef::writeDocumentation(OutputList &ol) //ol.endSection(si->label,si->type); endTitle(ol,getOutputFileBase(),name()); } + else + ol.startPageDoc(""); ol.startContents(); ol.popGeneratorState(); //2.} - if (m_showToc && hasSections()) + if ((m_localToc.isHtmlEnabled() || m_localToc.isLatexEnabled() || m_localToc.isDocbookEnabled()) && hasSections()) { - writeToc(ol); + writeToc(ol, m_localToc); } writePageDocumentation(ol); + ol.endPageDoc(); if (generateTreeView && getOuterScope()!=Doxygen::globalScope && !Config_getBool(DISABLE_INDEX)) { @@ -265,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); @@ -322,8 +328,17 @@ void PageDef::setNestingLevel(int l) m_nestingLevel = l; } -void PageDef::setShowToc(bool b) +void PageDef::setLocalToc(const LocalToc <) +{ + m_localToc = lt; +} + +void PageDef::setShowLineNo(bool b) { - m_showToc |= b; + m_showLineNo = b; } +bool PageDef::showLineNo() const +{ + return m_showLineNo; +} diff --git a/src/pagedef.h b/src/pagedef.h index 41b84cb..a0c3acb 100644 --- a/src/pagedef.h +++ b/src/pagedef.h @@ -34,7 +34,8 @@ class PageDef : public Definition // setters void setFileName(const char *name); - void setShowToc(bool b); + void setLocalToc(const LocalToc &tl); + void setShowLineNo(bool); // getters DefType definitionType() const { return TypePage; } @@ -59,10 +60,11 @@ class PageDef : public Definition bool documentedPage() const; bool hasSubPages() const; bool hasParentPage() const; - bool showToc() const { return m_showToc; } + LocalToc localToc() const { return m_localToc; } void setPageScope(Definition *d){ m_pageScope = d; } Definition *getPageScope() const { return m_pageScope; } QCString displayName(bool=TRUE) const { return !m_title.isEmpty() ? m_title : Definition::name(); } + bool showLineNo() const; void writeDocumentation(OutputList &ol); void writeTagFile(FTextStream &); @@ -75,7 +77,8 @@ class PageDef : public Definition PageSDict *m_subPageDict; // list of pages in the group Definition *m_pageScope; int m_nestingLevel; - bool m_showToc; + LocalToc m_localToc; + bool m_showLineNo; }; class PageSDict : public SDict<PageDef> diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index ef5cbc2..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) { @@ -626,6 +641,8 @@ void PerlModDocVisitor::visit(DocStyleChange *s) switch (s->style()) { case DocStyleChange::Bold: style = "bold"; break; + case DocStyleChange::Strike: style = "strike"; break; + case DocStyleChange::Underline: style = "underline"; break; case DocStyleChange::Italic: style = "italic"; break; case DocStyleChange::Code: style = "code"; break; case DocStyleChange::Subscript: style = "subscript"; break; @@ -1254,6 +1271,7 @@ void PerlModDocVisitor::visitPre(DocParamSect *s) err("unknown parameter section found\n"); break; } + m_output.openHash(); openOther(); openSubBlock(type); } @@ -1262,6 +1280,7 @@ void PerlModDocVisitor::visitPost(DocParamSect *) { closeSubBlock(); closeOther(); + m_output.closeHash(); } void PerlModDocVisitor::visitPre(DocParamList *pl) @@ -1566,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() @@ -1605,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/plantuml.cpp b/src/plantuml.cpp index 609d5fd..ada035b 100644 --- a/src/plantuml.cpp +++ b/src/plantuml.cpp @@ -47,7 +47,7 @@ QCString writePlantUMLSource(const QCString &outDir,const QCString &fileName,con } QCString text = "@startuml\n"; text+=content; - text+="@enduml\n"; + text+="\n@enduml\n"; file.writeBlock( text, text.length() ); file.close(); return baseName; @@ -88,7 +88,9 @@ void generatePlantUMLOutput(const char *baseName,const char *outDir,PlantUMLOutp { pumlArgs += "-graphvizdot \""; pumlArgs += dotPath; - pumlArgs += "dot\" "; + pumlArgs += "dot"; + pumlArgs += portable_commandExtension(); + pumlArgs += "\" "; } pumlArgs+="-o \""; pumlArgs+=outDir; diff --git a/src/portable.cpp b/src/portable.cpp index 4ad88a4..3dccaed 100644 --- a/src/portable.cpp +++ b/src/portable.cpp @@ -22,10 +22,10 @@ extern char **environ; #endif #include "portable.h" +#include "util.h" #ifndef NODEBUG #include "debug.h" #endif -//#include "doxygen.h" static double g_sysElapsedTime; static QTime g_time; @@ -35,7 +35,12 @@ int portable_system(const char *command,const char *args,bool commandHasConsole) if (command==0) return 1; +#if defined(_WIN32) && !defined(__CYGWIN__) + QCString commandCorrectedPath = substitute(command,'/','\\'); + QCString fullCmd=commandCorrectedPath; +#else QCString fullCmd=command; +#endif fullCmd=fullCmd.stripWhiteSpace(); if (fullCmd.at(0)!='"' && fullCmd.find(' ')!=-1) { @@ -134,7 +139,7 @@ int portable_system(const char *command,const char *args,bool commandHasConsole) // For that case COM is initialized as follows CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); - QString commandw = QString::fromUtf8( command ); + QString commandw = QString::fromUtf8( commandCorrectedPath ); QString argsw = QString::fromUtf8( args ); // gswin32 is a GUI api which will pop up a window and run @@ -206,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; @@ -458,18 +463,7 @@ void portable_correct_path(void) { #if defined(_WIN32) && !defined(__CYGWIN__) const char *p = portable_getenv("PATH"); - char *q = (char *)malloc(strlen(p) + 1); - strcpy(q, p); - bool found = false; - for (int i = 0 ; i < strlen(q); i++) - { - if (q[i] == '/') - { - q[i] = '\\'; - found = true; - } - } - if (found) portable_setenv("PATH",q); - free(q); + QCString result = substitute(p,'/','\\'); + if (result!=p) portable_setenv("PATH",result.data()); #endif } @@ -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; @@ -1739,7 +1739,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) %x SkipString %x CopyLine %x CopyString +%x CopyStringCs %x CopyStringFtn +%x CopyStringFtnDouble %x Include %x IncludeID %x EndImport @@ -1849,9 +1851,21 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) <CopyLine>"'"."'" { outputArray(yytext,(int)yyleng); } +<CopyLine>@\" { + if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_CSharp) REJECT; + outputArray(yytext,(int)yyleng); + BEGIN( CopyStringCs ); + } <CopyLine>\" { outputChar(*yytext); - BEGIN( CopyString ); + if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_Fortran) + { + BEGIN( CopyString ); + } + else + { + BEGIN( CopyStringFtnDouble ); + } } <CopyLine>\' { if (getLanguageFromFileName(g_yyFileName)!=SrcLangExt_Fortran) REJECT; @@ -1859,17 +1873,30 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) BEGIN( CopyStringFtn ); } <CopyString>[^\"\\\r\n]+ { + outputArray(yytext,(int)yyleng); + } +<CopyStringCs>[^\"\r\n]+ { outputArray(yytext,(int)yyleng); } <CopyString>\\. { outputArray(yytext,(int)yyleng); } -<CopyString>\" { +<CopyString,CopyStringCs>\" { + outputChar(*yytext); + BEGIN( CopyLine ); + } +<CopyStringFtnDouble>[^\"\\\r\n]+ { + outputArray(yytext,(int)yyleng); + } +<CopyStringFtnDouble>\\. { + outputArray(yytext,(int)yyleng); + } +<CopyStringFtnDouble>\" { outputChar(*yytext); BEGIN( CopyLine ); } <CopyStringFtn>[^\'\\\r\n]+ { - outputArray(yytext,(int)yyleng); + outputArray(yytext,(int)yyleng); } <CopyStringFtn>\\. { outputArray(yytext,(int)yyleng); @@ -1934,6 +1961,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } } <CopyLine>"\\"\r?/\n { // strip line continuation characters + if (getLanguageFromFileName(g_yyFileName)==SrcLangExt_Fortran) outputChar(*yytext); } <CopyLine>. { outputChar(*yytext); @@ -3195,7 +3223,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) { CondCtx *ctx = g_condStack.pop(); QCString sectionInfo = " "; - if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label %s ",ctx->sectionId.data()); + if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label '%s' ",ctx->sectionId.stripWhiteSpace().data()); warn(fileName,ctx->lineNr,"Conditional section%sdoes not have " "a corresponding \\endcond command within this file.",sectionInfo.data()); delete ctx; diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index d1dbb74..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(); @@ -91,6 +105,12 @@ class PrintDocVisitor : public DocVisitor case DocStyleChange::Bold: if (s->enable()) printf("<bold>"); else printf("</bold>"); break; + case DocStyleChange::Strike: + if (s->enable()) printf("<strike>"); else printf("</strike>"); + break; + case DocStyleChange::Underline: + if (s->enable()) printf("<underline>"); else printf("</underline>"); + break; case DocStyleChange::Italic: if (s->enable()) printf("<italic>"); else printf("</italic>"); break; @@ -167,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; @@ -490,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 *) { @@ -634,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 fe1eef5..d9c9f01 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -884,7 +884,7 @@ SHORTSTRINGITEM ({SHORTSTRINGCHAR}|{ESCAPESEQ}) SHORTSTRINGCHAR [^\\\n"] STRINGLITERAL {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING}) STRINGPREFIX ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR") -KEYWORD ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False") +KEYWORD ("lambda"|"import"|"class"|"assert"|"with"|"as"|"from"|"global"|"def"|"True"|"False") FLOWKW ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally") QUOTES ("\""[^"]*"\"") SINGLEQUOTES ("'"[^']*"'") @@ -1091,8 +1091,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT char *s=g_curClassBases.first(); while (s) { - ClassDef *baseDefToAdd; - baseDefToAdd=g_codeClassSDict[s]; + ClassDef *baseDefToAdd=g_codeClassSDict[s]; // Try to find class in global // scope @@ -1311,7 +1310,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 +1333,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 @@ -1382,21 +1381,43 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT } */ -<*>{STRINGPREFIX}?{TRISINGLEQUOTE} | +<*>{STRINGPREFIX}?{TRISINGLEQUOTE} { + if (YY_START==SingleQuoteString) REJECT; + startFontClass("stringliteral"); + g_stringContext=YY_START; + g_doubleQuote=yytext[yyleng-1]=='"'; + codify(yytext); + BEGIN(TripleString); + } <*>{STRINGPREFIX}?{TRIDOUBLEQUOTE} { - startFontClass("stringliteral"); + if (YY_START==DoubleQuoteString) REJECT; + startFontClass("stringliteral"); g_stringContext=YY_START; g_doubleQuote=yytext[yyleng-1]=='"'; - codify(yytext); + codify(yytext); BEGIN(TripleString); } <*>{STRINGPREFIX}?"'" { // single quoted string + if (YY_START==SingleQuoteString || + YY_START==DoubleQuoteString || + YY_START==TripleString + ) + { + REJECT; + } startFontClass("stringliteral"); g_stringContext=YY_START; codify(yytext); BEGIN(SingleQuoteString); } <*>{STRINGPREFIX}?"\"" { // double quoted string + if (YY_START==SingleQuoteString || + YY_START==DoubleQuoteString || + YY_START==TripleString + ) + { + REJECT; + } startFontClass("stringliteral"); g_stringContext=YY_START; codify(yytext); @@ -1495,6 +1516,8 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT void resetPythonCodeParserState() { + g_codeClassSDict.setAutoDelete(TRUE); + g_codeClassSDict.clear(); g_currentDefinition = 0; g_currentMemberDef = 0; g_doubleStringIsDoc = FALSE; @@ -1545,6 +1568,7 @@ void parsePythonCode(CodeOutputInterface &od,const char * /*className*/, //-------------------------------------- if (s.isEmpty()) return; printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL); + g_codeClassSDict.setAutoDelete(TRUE); TooltipManager::instance()->clearTooltips(); g_code = &od; g_inputString = s; diff --git a/src/pyscanner.l b/src/pyscanner.l index 9c21d41..1596b9d 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -109,7 +109,7 @@ static QCString g_packageName; //static bool g_hideClassDocs; -static QCString g_defVal; +static QGString g_defVal; static int g_braceCount; static bool g_lexInit = FALSE; @@ -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; //----------------------------------------------------------------------------- @@ -487,7 +489,6 @@ SHORTSTRINGITEM ({SHORTSTRINGCHAR}|{ESCAPESEQ}) SHORTSTRINGCHAR [^\\\n"] STRINGLITERAL {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING}) STRINGPREFIX ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR") -KEYWORD ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False") FLOWKW ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally") POUNDCOMMENT "#"[^#\n][^\n]* SCRIPTCOMMENT "#!".* @@ -514,6 +515,8 @@ STARTDOCSYMS "##" %x FunctionDec %x FunctionParams %x FunctionBody +%x FunctionAnnotation +%x FunctionTypeAnnotation %x FunctionParamDefVal /* Class states */ @@ -933,7 +936,6 @@ STARTDOCSYMS "##" } <FunctionDec>{ - {IDENTIFIER} { //found function name if (current->type.isEmpty()) @@ -944,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. @@ -992,36 +1006,150 @@ STARTDOCSYMS "##" } -<FunctionParamDefVal>{ - "(" { // internal opening brace - g_braceCount++; +<FunctionTypeAnnotation>{ + "{" | + "[" | + "(" { + ++g_braceCount; + g_defVal+=*yytext; + } + "}" | + "]" | + ")" { + --g_braceCount; g_defVal+=*yytext; } - "," | - ")" { - if (g_braceCount==0) // end of default argument + ":" { + 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()->defval=g_defVal.stripWhiteSpace(); - } - if (*yytext == ')') - current->args = argListToString(current->argList); + current->argList->getLast()->type += g_defVal.data(); + if (*yytext != ',') + unput(*yytext); BEGIN(FunctionParams); } - else // continue + else { - if (*yytext == ')')g_braceCount--; - g_defVal+=*yytext; - } + 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; + g_defVal+=*yytext; } +} + +<FunctionParamDefVal>{ + "{" | + "[" | + "(" { // internal opening brace, assumption is that we have correct code so braces do match + ++g_braceCount; + g_defVal+=*yytext; + } + "}" | + "]" { + --g_braceCount; + g_defVal+=*yytext; + } + ")" | + "," { + if (g_braceCount == 0) + { + if (current->argList->getLast()) + current->argList->getLast()->defval=QCString(g_defVal.data()).stripWhiteSpace(); + if (*yytext == ')') + unput(*yytext); + BEGIN(FunctionParams); + } + else + { + if (*yytext == ')') + --g_braceCount; + g_defVal += *yytext; + } + } + + "'" { + g_defVal+=*yytext; + g_copyString=&g_defVal; + g_stringContext=FunctionParamDefVal; + BEGIN( SingleQuoteString ); + } + "\"" { + g_defVal+=*yytext; + g_copyString=&g_defVal; + g_stringContext=FunctionParamDefVal; + BEGIN( DoubleQuoteString ); + } \n { g_defVal+=*yytext; incLineNr(); } + . { + g_defVal+=*yytext; + } } @@ -1168,13 +1296,17 @@ STARTDOCSYMS "##" current->program+=yytext; BEGIN(TripleComment); } - {TRISINGLEQUOTE} { // start of a comment block initTriSingleQuoteBlock(); current->program+=yytext; BEGIN(TripleComment); } - + {STARTDOCSYMS}[#]* { // start of a special comment + initSpecialBlock(); + BEGIN(SpecialComment); + } + {POUNDCOMMENT} { // ignore comment with just one # + } ^{BB} { current->program+=yytext; //current->startLine = yyLineNr; @@ -1187,7 +1319,6 @@ STARTDOCSYMS "##" } ""/({NONEMPTY}|{EXPCHAR}) { - // Just pushback an empty class, and // resume parsing the body. newEntry(); @@ -1380,7 +1511,6 @@ STARTDOCSYMS "##" BEGIN(Search); } <<EOF>> { yyterminate(); - newEntry(); } } @@ -1409,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*/) || @@ -1492,7 +1622,7 @@ STARTDOCSYMS "##" \\. { // espaced char addToString(yytext); } - "\"\"\"" { // tripple double quotes + "\"\"\"" { // triple double quotes addToString(yytext); } "'" { // end of the string @@ -1515,7 +1645,7 @@ STARTDOCSYMS "##" \\. { // espaced char addToString(yytext); } - "'''" { // tripple single quotes + "'''" { // triple single quotes addToString(yytext); } "\"" { // end of the string diff --git a/src/qhp.cpp b/src/qhp.cpp index e7c8d10..6ce6b06 100644 --- a/src/qhp.cpp +++ b/src/qhp.cpp @@ -23,7 +23,7 @@ #include "doxygen.h" #include "filedef.h" -#include <qstringlist.h> +#include <qcstringlist.h> #include <string.h> #include <qfile.h> @@ -101,10 +101,10 @@ void Qhp::initialize() { "name", filterName, 0 }; m_doc.open("customFilter", tagAttributes); - QStringList customFilterAttributes = QStringList::split(QChar(' '), Config_getString(QHP_CUST_FILTER_ATTRS)); + QCStringList customFilterAttributes = QCStringList::split(' ', Config_getString(QHP_CUST_FILTER_ATTRS)); for (int i = 0; i < (int)customFilterAttributes.count(); i++) { - m_doc.openCloseContent("filterAttribute", customFilterAttributes[i].utf8()); + m_doc.openCloseContent("filterAttribute", customFilterAttributes[i]); } m_doc.close("customFilter"); } @@ -112,15 +112,15 @@ void Qhp::initialize() m_doc.open("filterSection"); // Add section attributes - QStringList sectionFilterAttributes = QStringList::split(QChar(' '), + QCStringList sectionFilterAttributes = QCStringList::split(' ', Config_getString(QHP_SECT_FILTER_ATTRS)); - if (!sectionFilterAttributes.contains(QString("doxygen"))) + if (!sectionFilterAttributes.contains("doxygen")) { sectionFilterAttributes << "doxygen"; } for (int i = 0; i < (int)sectionFilterAttributes.count(); i++) { - m_doc.openCloseContent("filterAttribute", sectionFilterAttributes[i].utf8()); + m_doc.openCloseContent("filterAttribute", sectionFilterAttributes[i]); } m_toc.open("toc"); diff --git a/src/reflist.cpp b/src/reflist.cpp index 5a80b19..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,21 +169,38 @@ void RefList::generatePage() doc += item->prefix; doc += " \\_internalref "; doc += item->name; - doc += " \""; - doc += item->title; - doc += "\" "; + // escape \'s in title, see issue #5901 + 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,":","∷"); + } + doc += " \""+escapedTitle+"\" "; // write declaration in case a function with arguments if (!item->args.isEmpty()) { - doc += item->args; + // escape @'s in argument list, needed for Java annotations (see issue #6208) + // 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 c85b638..f2edf8b 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; @@ -192,6 +235,12 @@ void RTFDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Bold: if (s->enable()) m_t << "{\\b "; else m_t << "} "; break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "{\\strike "; else m_t << "} "; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "{\\ul "; else m_t << "} "; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "{\\i "; else m_t << "} "; break; @@ -526,9 +575,21 @@ void RTFDocVisitor::visit(DocIncOperator *op) void RTFDocVisitor::visit(DocFormula *f) { if (m_hide) return; - // TODO: do something sensible here, like including a bitmap DBG_RTF("{\\comment RTFDocVisitor::visit(DocFormula)}\n"); - m_t << f->text(); + bool bDisplay = !f->isInline(); + if (bDisplay) + { + m_t << "\\par"; + m_t << "{"; + m_t << "\\pard\\plain"; + m_t << "\\pard"; + m_t << "\\qc"; + } + m_t << "{ \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << f->relPath() << f->name() << ".png\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}"; + if (bDisplay) + { + m_t << "\\par}"; + } m_lastIsPara=FALSE; } @@ -586,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 *) @@ -1054,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; @@ -1067,7 +1129,7 @@ void RTFDocVisitor::visitPost(DocHtmlHeader *) { if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlHeader)}\n"); - // close open table of contens entry + // close open table of contents entry m_t << "} \\par"; m_t << "}" << endl; // end section m_lastIsPara=TRUE; @@ -1076,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 { @@ -1108,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 @@ -1276,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); } @@ -1739,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; @@ -1757,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; @@ -1783,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 7fcfbb3..2e67c26 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -244,7 +244,22 @@ void RTFGenerator::beginRTFDocument() t <<"\\red128\\green0\\blue0;"; t <<"\\red128\\green128\\blue0;"; t <<"\\red128\\green128\\blue128;"; - t <<"\\red192\\green192\\blue192;}" << endl; + t <<"\\red192\\green192\\blue192;"; + + // code highlighting colors. Note order is important see also RTFGenerator::startFontClass + t <<"\\red0\\green128\\blue0;"; // keyword = index 17 + t <<"\\red96\\green64\\blue32;"; // keywordtype + t <<"\\rede0\\green128\\blue0;"; // keywordflow + t <<"\\red128\\green0\\blue0;"; // comment + t <<"\\red128\\green96\\blue32;"; // preprocessor + t <<"\\red0\\green32\\blue128;"; // stringliteral + t <<"\\red0\\green128\\blue128;"; // charliteral + t <<"\\red255\\green0\\blue255;"; // vhdldigit + t <<"\\red0\\green0\\blue0;"; // vhdlchar + t <<"\\red112\\green0\\blue112;"; // vhdlkeyword + t <<"\\red255\\green0\\blue0;"; // vhdllogic + + t <<"}\n"; DBG_RTF(t <<"{\\comment Beginning style list}\n") t <<"{\\stylesheet\n"; @@ -272,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()); @@ -575,7 +591,7 @@ void RTFGenerator::endIndexSection(IndexSections is) break; case isTitlePageAuthor: { - t << "Doxgyen. }\n"; + t << " doxygen.}\n"; t << "{\\creatim " << dateToRTFDateString() << "}\n}"; DBG_RTF(t << "{\\comment end of infoblock}\n"); // setup for this section @@ -602,7 +618,7 @@ void RTFGenerator::endIndexSection(IndexSections is) t << rtf_Style_Reset << rtf_Style["Title"]->reference << endl; // set to title style if (rtf_title) // User has overridden document title in extensions file - t << "{\\field\\fldedit {\\*\\fldinst " << rtf_title << " \\\\*MERGEFORMAT}{\\fldrslt " << rtf_title << "}}\\par" << endl; + t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt " << rtf_title << "}}\\par" << endl; else { DocText *root = validatingParseText(projectName); @@ -703,7 +719,7 @@ void RTFGenerator::endIndexSection(IndexSections is) } else if (vhdlOpt) { - t << "{\\tc \\v " << VhdlDocGen::trDesignUnitIndex() << "}"<< endl; + t << "{\\tc \\v " << theTranslator->trDesignUnitIndex() << "}"<< endl; } else { @@ -1626,7 +1642,7 @@ void RTFGenerator::endDescItem() newParagraph(); } -void RTFGenerator::startMemberDescription(const char *,const char *) +void RTFGenerator::startMemberDescription(const char *,const char *,bool) { DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl) t << "{" << endl; @@ -1639,11 +1655,11 @@ void RTFGenerator::endMemberDescription() { DBG_RTF(t << "{\\comment (endMemberDescription)}" << endl) endEmphasis(); - newParagraph(); + //newParagraph(); decrementIndentLevel(); - //t << "\\par"; + t << "\\par"; t << "}" << endl; - //m_omitParagraph = TRUE; + m_omitParagraph = TRUE; } void RTFGenerator::startDescList(SectionTypes) @@ -2165,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() @@ -2617,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); } /** @@ -2712,21 +2729,14 @@ void RTFGenerator::endMemberGroup(bool hasHeader) t << "}"; } -void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anchor,const char *title) +void RTFGenerator::startExamples() { - DBG_RTF(t << "{\\comment (startSimpleSect)}" << endl) + DBG_RTF(t << "{\\comment (startExamples)}" << endl) t << "{"; // ends at endDescList t << "{"; // ends at endDescTitle startBold(); newParagraph(); - if (file) - { - writeObjectLink(0,file,anchor,title); - } - else - { - docify(title); - } + docify(theTranslator->trExamples()); endBold(); t << "}"; newParagraph(); @@ -2734,9 +2744,9 @@ void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anc t << rtf_Style_Reset << rtf_DList_DepthStyle(); } -void RTFGenerator::endSimpleSect() +void RTFGenerator::endExamples() { - DBG_RTF(t << "{\\comment (endSimpleSect)}" << endl) + DBG_RTF(t << "{\\comment (endExamples)}" << endl) m_omitParagraph = FALSE; newParagraph(); decrementIndentLevel(); @@ -2787,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 << " "; @@ -3041,5 +3051,25 @@ void RTFGenerator::endLabels() { } +void RTFGenerator::startFontClass(const char *name) +{ + int cod = 2; + QCString qname(name); + if (qname == "keyword") cod = 17; + else if (qname == "keywordtype") cod = 18; + else if (qname == "keywordflow") cod = 19; + else if (qname == "comment") cod = 20; + else if (qname == "preprocessor") cod = 21; + else if (qname == "stringliteral") cod = 22; + else if (qname == "charliteral") cod = 23; + else if (qname == "vhdldigit") cod = 24; + else if (qname == "vhdlchar") cod = 25; + else if (qname == "vhdlkeyword") cod = 26; + else if (qname == "vhdllogic") cod = 27; + t << "{\\cf" << cod << " "; +} - +void RTFGenerator::endFontClass() +{ + t << "}"; +} diff --git a/src/rtfgen.h b/src/rtfgen.h index d8f6ca7..b6b32c7 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -103,7 +103,7 @@ class RTFGenerator : public OutputGenerator void endMemberSections() {} void startHeaderSection() {} void endHeaderSection() {} - void startMemberHeader(const char *) { startGroupHeader(FALSE); } + void startMemberHeader(const char *,int) { startGroupHeader(FALSE); } void endMemberHeader() { endGroupHeader(FALSE); } void startMemberSubtitle(); void endMemberSubtitle(); @@ -120,6 +120,7 @@ class RTFGenerator : public OutputGenerator void startMemberTemplateParams() {} void endMemberTemplateParams(const char *,const char *) {} void insertMemberAlign(bool) {} + void insertMemberAlignLeft(int,bool){} void writeRuler() { rtfwriteRuler_thin(); } @@ -156,15 +157,15 @@ class RTFGenerator : public OutputGenerator void startSmall() { t << "{\\sub "; } void endSmall() { t << "}"; } - void startMemberDescription(const char *,const char *); + void startMemberDescription(const char *,const char *,bool); void endMemberDescription(); void startMemberDeclaration() {} void endMemberDeclaration(const char *,const char *) {} void writeInheritedSectionTitle(const char *,const char *,const char *, const char *,const char *,const char *) {} void startDescList(SectionTypes); - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *); void endParamList(); //void writeDescItem(); @@ -257,8 +258,8 @@ class RTFGenerator : public OutputGenerator void writeLabel(const char *l,bool isLast); void endLabels(); - void startFontClass(const char *) {} - void endFontClass() {} + void startFontClass(const char *); + void endFontClass(); void writeCodeAnchor(const char *) {} void setCurrentDoc(Definition *,const char *,bool) {} 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 fd1568b..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; @@ -149,6 +152,7 @@ static QCString *pCopyRawString; static QGString *pCopyCurlyGString; static QGString *pCopyRoundGString; +static QGString *pCopySquareGString; static QGString *pCopyQuotedGString; static QGString *pCopyHereDocGString; static QGString *pCopyRawGString; @@ -218,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; @@ -375,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; @@ -596,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] @@ -734,6 +736,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) %x CopyRound %x CopyCurly %x GCopyRound +%x GCopySquare %x GCopyCurly %x SkipUnionSwitch %x Specialization @@ -755,11 +758,20 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) %x CopyHereDocEnd %x RawString %x RawGString +%x CSString %x IDLAttribute %x IDLProp %x IDLPropName + /** Slice states */ + +%x SliceMetadata +%x SliceSequence +%x SliceSequenceName +%x SliceDictionary +%x SliceDictionaryName + /** Prototype scanner states */ %x Prototype @@ -1217,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(); } @@ -1389,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(); @@ -1423,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; @@ -1526,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; @@ -1598,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; @@ -1621,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"; @@ -1641,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 @@ -1721,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 ) ; @@ -2381,10 +2438,6 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { current->protection = Protected; } - else if (javaLike && qstrcmp(yytext,"internal")==0) - { - current->protection = Package; - } else if (javaLike && qstrcmp(yytext,"private")==0) { current->protection = Private; @@ -2841,6 +2894,14 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->initializer+=*yytext; BEGIN(GCopyRound); } +<ReadInitializer>"[" { + if (!insidePHP) REJECT; + lastSquareContext=YY_START; + pCopySquareGString=¤t->initializer; + squareCount=0; + current->initializer+=*yytext; + BEGIN(GCopySquare); + } <ReadInitializer>"{" { lastCurlyContext=YY_START; pCopyCurlyGString=¤t->initializer; @@ -3072,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; } @@ -3183,6 +3248,56 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) *pCopyRoundGString+=*yytext; } + /* generic square bracket list copy rules for growable strings, we should only enter here in case of php, left the test part as in GCopyRound to keep it compatible with te round bracket version */ +<GCopySquare>\" { + *pCopySquareGString+=*yytext; + pCopyQuotedGString=pCopySquareGString; + lastStringContext=YY_START; + BEGIN(CopyGString); + } +<GCopySquare>"[" { + *pCopySquareGString+=*yytext; + squareCount++; + } +<GCopySquare>"]" { + *pCopySquareGString+=*yytext; + if (--squareCount<0) + BEGIN(lastSquareContext); + } +<GCopySquare>\n { + lineCount(); + *pCopySquareGString+=*yytext; + } +<GCopySquare>\' { + if (insidePHP) + { + current->initializer+=yytext; + pCopyQuotedGString = pCopySquareGString; + lastStringContext=YY_START; + BEGIN(CopyPHPGString); + } + else + { + *pCopySquareGString+=yytext; + } + } +<GCopySquare>{CHARLIT} { + if (insidePHP) + { + REJECT; + } + else + { + *pCopySquareGString+=yytext; + } + } +<GCopySquare>[^"\[\]\n/]+ { + *pCopySquareGString+=yytext; + } +<GCopySquare>. { + *pCopySquareGString+=*yytext; + } + /* generic curly bracket list copy rules */ <CopyCurly>\" { *pCopyCurlyString+=*yytext; @@ -3391,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" ) @@ -3431,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) @@ -3638,7 +3780,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->fileName = yyFileName; current->startLine = yyLineNr; current->startColumn = yyColNr; - current->type = "@"; // enum marker + if (!(current_root->spec&Entry::Enum)) + { + current->type = "@"; // enum marker + } current->args = current->args.simplifyWhiteSpace(); current->name = current->name.stripWhiteSpace(); current->section = Entry::VARIABLE_SEC; @@ -3780,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); @@ -3817,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(); @@ -4793,7 +4961,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <FuncQual>{ID} { // typically a K&R style C function if (insideCS && qstrcmp(yytext,"where")==0) { - // type contraint for a method + // type constraint for a method delete current->typeConstr; current->typeConstr = new ArgumentList; current->typeConstr->append(new Argument); @@ -5289,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) @@ -5527,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; @@ -5535,7 +5703,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) baseName.resize(0); BEGIN( BasesProt ) ; } - else if (insideCS && qstrcmp(yytext,"where")==0) // C# type contraint + else if (insideCS && qstrcmp(yytext,"where")==0) // C# type constraint { delete current->typeConstr; current->typeConstr = new ArgumentList; @@ -5815,7 +5983,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) QCString baseScope = yytext; if (insideCS && baseScope.stripWhiteSpace()=="where") { - // type contraint for a class + // type constraint for a class delete current->typeConstr; current->typeConstr = new ArgumentList; current->typeConstr->append(new Argument); @@ -5954,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; } @@ -6235,11 +6403,76 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <CSAccessorDecl>"add" { if (curlyCount==0) current->spec |= Entry::Addable; } <CSAccessorDecl>"remove" { if (curlyCount==0) current->spec |= Entry::Removable; } <CSAccessorDecl>"raise" { if (curlyCount==0) current->spec |= Entry::Raisable; } -<CSAccessorDecl>. {} +<CSAccessorDecl>"\"" { BEGIN(CSString);} +<CSAccessorDecl>"." {} <CSAccessorDecl>\n { lineCount(); } +<CSString>"\"" { BEGIN(CSAccessorDecl);} +<CSString>"//" {} // Otherwise the rule <*>"//" will kick in +<CSString>"/*" {} // Otherwise the rule <*>"/*" will kick in +<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 ***************************/ @@ -6611,6 +6844,22 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(SkipString); } } +<*>\? { + if (insideCS) + { + if (current->type.isEmpty()) + { + if (current->name.isEmpty()) + current->name="?"; + else + current->name+="?"; + } + else + { + current->type+="?"; + } + } + } <*>. <SkipComment>"//"|"/*" <*>"/*" { lastCContext = YY_START ; @@ -6819,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 6fb2432..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; @@ -1180,6 +1233,7 @@ void writeJavascriptSearchIndex() SearchIndexList *sl; for (it.toFirst();(sl=it.current());++it) // for each letter { + if ( sl->letter() == '"' ) t << QString( QChar( '\\' ) ).utf8(); t << QString( QChar( sl->letter() ) ).utf8(); } t << "\""; @@ -1230,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 dfa8511..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> @@ -27,7 +28,7 @@ #include <qfileinfo.h> #include <qlist.h> #include <qstring.h> -#include <qstringlist.h> +#include <qcstringlist.h> #include "entry.h" #include "classdef.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,17 +97,18 @@ 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; QList<QCString> *templateArguments; - QStringList classList; + QCStringList classList; Kind kind; bool isObjC; }; @@ -118,8 +121,8 @@ class TagNamespaceInfo QCString name; QCString filename; QCString clangId; - QStringList classList; - QStringList namespaceList; + QCStringList classList; + QCStringList namespaceList; TagAnchorInfoList docAnchors; QList<TagMemberInfo> members; }; @@ -133,7 +136,7 @@ class TagPackageInfo QCString filename; TagAnchorInfoList docAnchors; QList<TagMemberInfo> members; - QStringList classList; + QCStringList classList; }; /** Container for include info that can be read from a tagfile */ @@ -157,8 +160,8 @@ class TagFileInfo QCString filename; TagAnchorInfoList docAnchors; QList<TagMemberInfo> members; - QStringList classList; - QStringList namespaceList; + QCStringList classList; + QCStringList namespaceList; QList<TagIncludeInfo> includes; }; @@ -172,12 +175,12 @@ class TagGroupInfo QCString filename; TagAnchorInfoList docAnchors; QList<TagMemberInfo> members; - QStringList subgroupList; - QStringList classList; - QStringList namespaceList; - QStringList fileList; - QStringList pageList; - QStringList dirList; + QCStringList subgroupList; + QCStringList classList; + QCStringList namespaceList; + QCStringList fileList; + QCStringList pageList; + QCStringList dirList; }; /** Container for page specific info that can be read from a tagfile */ @@ -197,8 +200,8 @@ class TagDirInfo QCString name; QCString filename; QCString path; - QStringList subdirList; - QStringList fileList; + QCStringList subdirList; + QCStringList fileList; TagAnchorInfoList docAnchors; }; @@ -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; } @@ -1009,11 +1016,11 @@ void TagFileParser::dump() { msg("namespace `%s'\n",nd->name.data()); msg(" filename `%s'\n",nd->filename.data()); - QStringList::Iterator it; + QCStringList::Iterator it; for ( it = nd->classList.begin(); it != nd->classList.end(); ++it ) { - msg( " class: %s \n", (*it).latin1() ); + msg( " class: %s \n", (*it).data() ); } QListIterator<TagMemberInfo> mci(nd->members); @@ -1034,16 +1041,16 @@ void TagFileParser::dump() { msg("file `%s'\n",fd->name.data()); msg(" filename `%s'\n",fd->filename.data()); - QStringList::Iterator it; + QCStringList::Iterator it; for ( it = fd->namespaceList.begin(); it != fd->namespaceList.end(); ++it ) { - msg( " namespace: %s \n", (*it).latin1() ); + msg( " namespace: %s \n", (*it).data() ); } for ( it = fd->classList.begin(); it != fd->classList.end(); ++it ) { - msg( " class: %s \n", (*it).latin1() ); + msg( " class: %s \n", (*it).data() ); } QListIterator<TagMemberInfo> mci(fd->members); @@ -1072,31 +1079,31 @@ void TagFileParser::dump() { msg("group `%s'\n",gd->name.data()); msg(" filename `%s'\n",gd->filename.data()); - QStringList::Iterator it; + QCStringList::Iterator it; for ( it = gd->namespaceList.begin(); it != gd->namespaceList.end(); ++it ) { - msg( " namespace: %s \n", (*it).latin1() ); + msg( " namespace: %s \n", (*it).data() ); } for ( it = gd->classList.begin(); it != gd->classList.end(); ++it ) { - msg( " class: %s \n", (*it).latin1() ); + msg( " class: %s \n", (*it).data() ); } for ( it = gd->fileList.begin(); it != gd->fileList.end(); ++it ) { - msg( " file: %s \n", (*it).latin1() ); + msg( " file: %s \n", (*it).data() ); } for ( it = gd->subgroupList.begin(); it != gd->subgroupList.end(); ++it ) { - msg( " subgroup: %s \n", (*it).latin1() ); + msg( " subgroup: %s \n", (*it).data() ); } for ( it = gd->pageList.begin(); it != gd->pageList.end(); ++it ) { - msg( " page: %s \n", (*it).latin1() ); + msg( " page: %s \n", (*it).data() ); } QListIterator<TagMemberInfo> mci(gd->members); @@ -1126,16 +1133,16 @@ void TagFileParser::dump() { msg("dir `%s'\n",dd->name.data()); msg(" path `%s'\n",dd->path.data()); - QStringList::Iterator it; + QCStringList::Iterator it; for ( it = dd->fileList.begin(); it != dd->fileList.end(); ++it ) { - msg( " file: %s \n", (*it).latin1() ); + msg( " file: %s \n", (*it).data() ); } for ( it = dd->subdirList.begin(); it != dd->subdirList.end(); ++it ) { - msg( " subdir: %s \n", (*it).latin1() ); + msg( " subdir: %s \n", (*it).data() ); } } } @@ -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 791ecc4..ca5294b 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -25,7 +25,7 @@ #include <ctype.h> #include <qstring.h> -#include <qstringlist.h> +#include <qcstringlist.h> #include <qlist.h> #include <qmap.h> #include <qarray.h> @@ -369,7 +369,7 @@ int Tcl_SplitList( } // END of tclUtil.c -void tcl_split_list(QString &str, QStringList &list) +void tcl_split_list(QCString &str, QCStringList &list) { int argc; const char **argv; @@ -383,17 +383,20 @@ void tcl_split_list(QString &str, QStringList &list) { str=str.mid(1,str.length()-2); } - if (Tcl_SplitList(str.ascii(),&argc,&argv) != TCL_OK) + if (!str.isEmpty()) { - list.append(str); - } - else - { - for (int i = 0; i < argc; i++) + if (Tcl_SplitList(str,&argc,&argv) != TCL_OK) { - list.append(argv[i]); + list.append(str); + } + else + { + for (int i = 0; i < argc; i++) + { + list.append(argv[i]); + } + ckfree((char *) argv); } - ckfree((char *) argv); } } @@ -409,7 +412,7 @@ typedef struct Entry *entry_cl; // if set contain the current class Entry *entry_scan; // current scan entry Protection protection; // current protections state - QStringList after; // option/value list (options: NULL comment keyword script) + QCStringList after; // option/value list (options: NULL comment keyword script) } tcl_scan; //* Structure containing all internal global variables. @@ -446,7 +449,7 @@ static struct Entry* entry_file; // entry of current file Entry* entry_current; // currently used entry Entry* entry_inside; // contain entry of current scan context - QStringList list_commandwords; // list of command words + QCStringList list_commandwords; // list of command words QList<tcl_scan> scan; // stack of scan contexts QAsciiDict<Entry> ns; // all read namespace entries QAsciiDict<Entry> cl; // all read class entries @@ -602,7 +605,7 @@ Entry* tcl_entry_class(const QCString cl) // @return 1 if keyword and 0 otherwise static int tcl_keyword(QCString str) { - static QStringList myList; + static QCStringList myList; static int myInit=1; if (myInit) { @@ -639,7 +642,7 @@ static int tcl_keyword(QCString str) myList <<"tkerror"<<"tkwait"<<"tk_bisque"<<"tk_focusNext"<<"tk_focusPrev"<<"tk_focusFollowsMouse"<<"tk_popup"<<"tk_setPalette"<<"tk_textCut"<<"tk_TextCopy"<<"tk_textPaste"<<"chooseColor"<<"tk_chooseColor"<<"tk_chooseDirectory"<<"tk_dialog"<<"tk_getOpenFile"<<"tkDialog"<<"tk_getSaveFile"<<"tk_messageBox"; myList <<"winfo"<<"wm"; myList <<"button"<<"canvas"<<"checkbutton"<<"entry"<<"frame"<<"image"<<"label"<<"labelframe"<<"listbox"<<"menu"<<"menubutton"<<"message"<<"panedwindow"<<"radiobutton"<<"scale"<<"scrollbar"<<"spinbox"<<"toplevel"; - myList.sort(); + //myList.sort(); myInit=0; } str=str.stripWhiteSpace(); @@ -703,6 +706,7 @@ static void tcl_codify(const char *s,const char *str) } else { + if (*(p-2)==0x1A) *(p-2) = '\0'; // remove ^Z tcl.code->codify(sp); done=TRUE; } @@ -726,7 +730,7 @@ static void tcl_codify(const char *s,const char *str) static void tcl_codify(const char *s,const QString &str) { if (tcl.code==NULL) return; - tcl_codify(s,str.utf8()); + tcl_codify(s,str); } //! Codify 'str' with special font class 's'. @@ -739,7 +743,7 @@ static void tcl_codify(const char *s,const QCString &str) static void tcl_codify_cmd(const char *s,int i) { - tcl_codify(s,(*tcl.list_commandwords.at(i)).utf8()); + tcl_codify(s,(*tcl.list_commandwords.at(i))); } //! codify a string token // @@ -1192,7 +1196,7 @@ tcl_inf("line=%d\n",myScan->line1); myStart=i; break; } - tcl_codify(myScan->after[i].utf8(),myScan->after[i+1].utf8()); + tcl_codify(myScan->after[i],myScan->after[i+1]); } yy_delete_buffer(myScan->buffer_state); yy_pop_state(); @@ -1427,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); @@ -1607,12 +1610,12 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment); } //! Parse given \c arglist . -static void tcl_command_ARGLIST(QString &arglist) +static void tcl_command_ARGLIST(QCString &arglist) { D Argument *myArg; - QStringList myArgs; - QString myArglist=""; + QCStringList myArgs; + QCString myArglist=""; if (!tcl.entry_current->argList) { @@ -1621,14 +1624,14 @@ D tcl_split_list(arglist,myArgs); for (uint i=0;i<myArgs.count();i++) { - QStringList myArgs1; + QCStringList myArgs1; myArg=new Argument; tcl_split_list(*myArgs.at(i),myArgs1); if (myArgs1.count()==2) { - myArg->name= (*myArgs1.at(0)).utf8(); - myArg->defval= (*myArgs1.at(1)).utf8(); + myArg->name= (*myArgs1.at(0)); + myArg->defval= (*myArgs1.at(1)); if (myArg->defval.isEmpty()) { myArg->defval = " "; @@ -1637,13 +1640,13 @@ D } else { - myArg->name= (*myArgs.at(i)).utf8(); - myArglist += QString(myArg->name) + " "; + myArg->name= (*myArgs.at(i)); + myArglist += myArg->name + " "; } tcl.entry_current->argList->append(myArg); } arglist = myArglist; - tcl.entry_current->args = arglist.utf8(); + tcl.entry_current->args = arglist; } //! Create link. @@ -1762,7 +1765,7 @@ static void tcl_codify_link(QCString name) //! scan general argument for brackets // -// parses (*tcl.list_commandwords.at(i)).utf8() and checks for brackets. +// parses (*tcl.list_commandwords.at(i)) and checks for brackets. // Starts a new scan context if needed (*myScan==0 and brackets found). // Returns NULL or the created scan context. // @@ -1772,7 +1775,7 @@ static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOu bool insideQuotes=false; unsigned int insideBrackets=0; unsigned int insideBraces=0; - myName = (*tcl.list_commandwords.at(i)).utf8(); + myName = (*tcl.list_commandwords.at(i)); if (i%2 != 0) { // handle white space @@ -1860,7 +1863,7 @@ D // Example: eval [list set] [list NotInvoked] [Invoked NotInvoked] for (unsigned int i = 1; i < tcl.list_commandwords.count(); i++) { - myString += (*tcl.list_commandwords.at(i)).utf8(); + myString += (*tcl.list_commandwords.at(i)); } myScan = tcl_scan_start('?', myString, myScan->ns, myScan->entry_cl, myScan->entry_fn); @@ -1881,7 +1884,7 @@ D unsigned int lastOptionIndex = 0; for (i = 2; i<tcl.list_commandwords.count(); i += 2) { - token = (*tcl.list_commandwords.at(i)).utf8(); + token = (*tcl.list_commandwords.at(i)); if (token == "--") { lastOptionIndex = i; @@ -1912,7 +1915,7 @@ D int size; const char *elem; const char *next; - token = (*tcl.list_commandwords.at(lastOptionIndex + 4)).utf8(); + token = (*tcl.list_commandwords.at(lastOptionIndex + 4)); if (token[0] == '{') { inBraces = true; @@ -1965,15 +1968,15 @@ D //printf("detected: switch ?options? string pattern body ?pattern body ...?\n"); myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false); myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false); - //printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2)).utf8()); + //printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2))); for (i = lastOptionIndex + 3; i < tcl.list_commandwords.count(); i += 4) { myScan = tcl_command_ARG(myScan, i + 0, false); // whitespace myScan = tcl_command_ARG(myScan, i + 1, false); // pattern myScan = tcl_command_ARG(myScan, i + 2, false); // whitespace - myScan = tcl_codify_token(myScan, "script", (*tcl.list_commandwords.at(i+3)).utf8()); // script - //printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1)).utf8()); - //printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3)).utf8()); + myScan = tcl_codify_token(myScan, "script", (*tcl.list_commandwords.at(i+3))); // script + //printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1)))); + //printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3))); } } else @@ -2006,7 +2009,7 @@ D //! Handle internal tcl commands. // "if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?" -static void tcl_command_IF(QStringList type) +static void tcl_command_IF(QCStringList type) { D tcl_codify_cmd("keyword",0); @@ -2125,7 +2128,7 @@ D tcl_codify_cmd(NULL,3); tcl_codify_cmd(NULL,4); tcl_codify_cmd(NULL,5); - tcl_name_SnippetAware(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); + tcl_name_SnippetAware(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName); if (myNs.length()) { myEntryNs = tcl_entry_namespace(myNs); @@ -2164,7 +2167,7 @@ D tcl_codify_cmd(NULL,3); tcl_codify_cmd(NULL,4); tcl_codify_cmd(NULL,5); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName); if (myNs.length()) { myEntryCl = tcl_entry_class(myNs); @@ -2204,7 +2207,7 @@ D tcl_codify_cmd(NULL,1); tcl_codify_cmd(NULL,2); tcl_codify_cmd(NULL,3); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)),myNs,myName); if (myNs.length()) { myEntryCl = tcl_entry_class(myNs); @@ -2239,7 +2242,7 @@ D tcl_codify_cmd("keyword",0); tcl_codify_cmd(NULL,1); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)),myNs,myName); if (myNs.length()) { myEntryCl = tcl_entry_class(myNs); @@ -2277,7 +2280,7 @@ D tcl_codify_cmd(NULL,3); tcl_codify_cmd(NULL,4); tcl_codify_cmd(NULL,5); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)),myNs,myName); if (myNs.length()) { myName = myNs+"::"+myName; @@ -2290,12 +2293,12 @@ D tcl.entry_main->addSubEntry(tcl.entry_current); tcl.ns.insert(myName,tcl.entry_current); //myEntryNs = tcl.entry_current; - myStr = (*tcl.list_commandwords.at(6)).utf8(); + myStr = (*tcl.list_commandwords.at(6)); if (tcl.list_commandwords.count() > 7) { for (uint i=7;i<tcl.list_commandwords.count();i++) { - myStr.append((*tcl.list_commandwords.at(i)).utf8()); + myStr.append((*tcl.list_commandwords.at(i))); } tcl.word_is=' '; } @@ -2314,7 +2317,7 @@ D tcl_codify_cmd(NULL,1); tcl_codify_cmd("NULL",2); tcl_codify_cmd("NULL",3); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName); if (myNs.length()) { myName = myNs+"::"+myName; @@ -2346,7 +2349,7 @@ D tcl_codify_cmd("NULL",3); tcl_codify_cmd("NULL",4); tcl_codify_cmd("NULL",5); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)),myNs,myName); if (myNs.length()) { myName = myNs+"::"+myName; @@ -2376,13 +2379,13 @@ D tcl_codify_cmd(NULL,1); tcl_codify_cmd("NULL",2); tcl_codify_cmd("NULL",3); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName); if (myNs.length()) { myName = myNs+"::"+myName; } myEntryCl = tcl_entry_class(myName); - myStr = (*tcl.list_commandwords.at(4)).utf8(); + myStr = (*tcl.list_commandwords.at(4)); // // special cases first // oo::define classname method methodname args script @@ -2399,7 +2402,7 @@ D } Entry *myEntry; QCString myMethod; - tcl_name(myScan->ns,(*tcl.list_commandwords.at(n==11?6:4)).utf8(),myNs,myMethod); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(n==11?6:4)),myNs,myMethod); // code snippet taken from tcl_command_METHOD()/tcl_command_CONSTRUCTOR tcl.fn.remove(myMethod); tcl.entry_current->section = Entry::FUNCTION_SEC; @@ -2433,7 +2436,7 @@ D { for (uint i=5;i<tcl.list_commandwords.count();i++) { - myStr.append((*tcl.list_commandwords.at(i)).utf8()); + myStr.append((*tcl.list_commandwords.at(i))); } tcl.word_is=' '; } @@ -2454,7 +2457,7 @@ D { tcl_codify_cmd(NULL,i); } - tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); + tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName); if (myNs.length()) {// qualified variables go into namespace myEntry = tcl_entry_namespace(myNs); @@ -2534,7 +2537,7 @@ tcl_inf("->\n"); yy_pop_state(); // check command - QCString myStr = (*tcl.list_commandwords.at(0)).utf8(); + QCString myStr = (*tcl.list_commandwords.at(0)); tcl_scan *myScanBackup=tcl.scan.at(0); int myLevel = 0; Protection myProt = tcl.protection; @@ -2579,7 +2582,7 @@ tcl_inf("->\n"); myProt = tcl.protection; goto command_end; } - myStr = (*tcl.list_commandwords.at(0)).utf8(); + myStr = (*tcl.list_commandwords.at(0)); // remove leading "::" and apply TCL_SUBST if (myStr.left(2)=="::") myStr = myStr.mid(2); if (tcl.config_subst.contains(myStr)) @@ -2623,7 +2626,7 @@ tcl_inf("->\n"); } if (myStr=="namespace") { - if ((*tcl.list_commandwords.at(2)).utf8()=="eval") + if ((*tcl.list_commandwords.at(2))=="eval") { if (tcl.list_commandwords.count() < 7) {myLine=__LINE__;goto command_warn;} tcl_command_NAMESPACE(); @@ -2646,7 +2649,7 @@ tcl_inf("->\n"); } if (myStr=="oo::class") { - if ((*tcl.list_commandwords.at(2)).utf8()=="create") + if ((*tcl.list_commandwords.at(2))=="create") { if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;} tcl_command_OO_CLASS(); @@ -2686,7 +2689,7 @@ tcl_inf("->\n"); { for (unsigned int i = 2; i < tcl.list_commandwords.count(); i = i + 2) { - tcl.scan.at(0)->entry_cl->extends->append(new BaseInfo((*tcl.list_commandwords.at(i)).utf8(),Public,Normal)); + tcl.scan.at(0)->entry_cl->extends->append(new BaseInfo((*tcl.list_commandwords.at(i)),Public,Normal)); } } goto command_end; @@ -2730,12 +2733,12 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN? */ if (myStr=="if" && tcl.list_commandwords.count() > 4) { - QStringList myType; + QCStringList myType; myType << "keyword" << "NULL" << "expr" << "NULL"; char myState='x';// last word: e'x'pr 't'hen 'b'ody 'e'lse else'i'f.. for (unsigned int i = 4; i < tcl.list_commandwords.count(); i = i + 2) { - QCString myStr=(*tcl.list_commandwords.at(i)).utf8(); + QCString myStr=(*tcl.list_commandwords.at(i)); if (myState=='x') { if (myStr=="then") @@ -2796,7 +2799,7 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN? tcl_command_OTHER(); goto command_end; command_warn:// print warning message because of wrong used syntax - tcl_war("%d count=%d: %s\n",myLine,tcl.list_commandwords.count(),tcl.list_commandwords.join(" ").ascii()); + tcl_war("%d count=%d: %s\n",myLine,tcl.list_commandwords.count(),tcl.list_commandwords.join(" ").data()); tcl_command_OTHER(); command_end:// add remaining text to current context if (!myText.isEmpty()) @@ -3024,11 +3027,6 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, } tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inlineFragment); //tcl_inf("%s\n"input.data()); - if (isExampleBlock) - { - tcl_codify(NULL,input); - return; - } tcl_init(); tcl.collectXRefs = collectXRefs; tcl.memberdef = memberDef; @@ -3047,8 +3045,15 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli } tcl.file_name = ""; tcl.this_parser = NULL; - tcl.entry_main = tcl_entry_new(); - tcl_parse(myNs,myCls); + if (isExampleBlock) + { + tcl_codify(NULL,input); + } + else + { + tcl.entry_main = tcl_entry_new(); + tcl_parse(myNs,myCls); + } tcl.code->endCodeLine(); tcl.scan.clear(); tcl.ns.clear(); 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/template.h b/src/template.h index 98ae7ed..4602c53 100644 --- a/src/template.h +++ b/src/template.h @@ -368,7 +368,7 @@ class TemplateListIntf /** Increase object's reference count */ virtual int addRef() = 0; - /** Decreases object's referenc count, destroy object if 0 */ + /** Decreases object's reference count, destroy object if 0 */ virtual int release() = 0; }; @@ -417,7 +417,7 @@ class TemplateStructIntf /** Increase object's reference count */ virtual int addRef() = 0; - /** Decreases object's referenc count, destroy object if 0 */ + /** Decreases object's reference count, destroy object if 0 */ virtual int release() = 0; }; diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp index 8c8ecad..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) { @@ -50,11 +63,6 @@ void TextDocVisitor::filter(const char *str) switch(c) { case '\n': m_t << " "; break; - case '"': m_t << """; break; - case '\'': m_t << "'"; break; - case '<': m_t << "<"; break; - case '>': m_t << ">"; break; - case '&': m_t << "&"; break; default: m_t << c; } } 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 7092174..ac55911 100644 --- a/src/translator.h +++ b/src/translator.h @@ -19,6 +19,8 @@ #define TRANSLATOR_H #include "classdef.h" +#include "config.h" +#include "vhdldocgen.h" /** Abstract base class for all translatable text fragments. */ class Translator @@ -41,6 +43,36 @@ class Translator virtual QCString idLanguage() = 0; virtual QCString latexLanguageSupportCommand() = 0; + /*! + * 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 + * can be returned. + */ + virtual QCString latexFontenc() { return "T1"; } + /*! + * Sets the commands to be insered directly after the `\\begin{document}` + * in the LaTeX document. + */ + virtual QCString latexDocumentPre() { return ""; } + /*! + * Sets the commands to be insered directly before the `\\end{document}` + * in the LaTeX document. + */ + virtual QCString latexDocumentPost() { return ""; } + /*! + * Set the name to be used as latex command. + */ + virtual QCString latexCommandName() + { + QCString latex_command = Config_getString(LATEX_CMD_NAME); + if (latex_command.isEmpty()) latex_command = "latex"; + if (Config_getBool(USE_PDFLATEX)) + { + if (latex_command == "latex") latex_command = "pdflatex"; + } + return latex_command; + } // --- Language translation methods ------------------- @@ -570,6 +602,50 @@ class Translator virtual QCString trSingletonReference(const char *sName) = 0; virtual QCString trServiceGeneratedFromFiles(bool single) = 0; virtual QCString trSingletonGeneratedFromFiles(bool single) = 0; + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.15 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trDesignUnitHierarchy() = 0; + virtual QCString trDesignUnitList() = 0; + virtual QCString trDesignUnitMembers() = 0; + virtual QCString trDesignUnitListDescription() = 0; + virtual QCString trDesignUnitIndex() = 0; + virtual QCString trDesignUnits() = 0; + 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 254876a..b0c8a24 100644 --- a/src/translator_adapter.h +++ b/src/translator_adapter.h @@ -41,7 +41,128 @@ class TranslatorAdapterBase : public Translator }; -class TranslatorAdapter_1_8_4 : public TranslatorAdapterBase +class TranslatorAdapter_1_8_15 : public TranslatorAdapterBase +{ + public: + virtual QCString updateNeededMessage() + { return createUpdateNeededMessage(idLanguage(),"release 1.8.15"); } + + virtual QCString trDesignUnitHierarchy() + { return english.trDesignUnitHierarchy(); } + + virtual QCString trDesignUnitList() + { return english.trDesignUnitList(); } + + virtual QCString trDesignUnitMembers() + { return english.trDesignUnitMembers(); } + + virtual QCString trDesignUnitListDescription() + { return english.trDesignUnitListDescription(); } + + virtual QCString trDesignUnitIndex() + { return english.trDesignUnitIndex(); } + + virtual QCString trDesignUnits() + { return english.trDesignUnits(); } + + virtual QCString trFunctionAndProc() + { return english.trFunctionAndProc(); } + + 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 { public: virtual QCString updateNeededMessage() @@ -295,4 +416,3 @@ class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4 }; #endif - diff --git a/src/translator_am.h b/src/translator_am.h index 6f5e671..5b4c446 100644 --- a/src/translator_am.h +++ b/src/translator_am.h @@ -32,8 +32,8 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0 /* Used to get the command(s) for the language support. */
virtual QCString latexLanguageSupportCommand()
{
- return "<pre>\\usepackage[latin]{armtex}\n"
- "\\usepackage[armscii8]{inputenc}\n</pre>";
+ return "\\usepackage[latin]{armtex}\n"
+ "\\usepackage[armscii8]{inputenc}\n";
}
// --- Language translation methods -------------------
diff --git a/src/translator_br.h b/src/translator_br.h index a294ee0..c2d079a 100644 --- a/src/translator_br.h +++ b/src/translator_br.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (C) 1997-2017 by Dimitri van Heesch. + * 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 @@ -10,14 +10,16 @@ * Documents produced by Doxygen are derivative workns derived from the * input used in their production; they are not affected by this license. * - * Brazilian Portuguese translation version 20100531 + * Brazilian Portuguese translation * Maintainer: - * Fabio "FJTC" Jun Takada Chino <jun-chino at uol.com.br> + * 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: + * 20180612: + * - Updated to 1.8.15; * 20170123: * - Full translation revision; * - trLegendDocs() is now synchronized with the English version; @@ -45,7 +47,7 @@ #ifndef TRANSLATOR_BR_H #define TRANSLATOR_BR_H -class TranslatorBrazilian : public Translator +class TranslatorBrazilian : public TranslatorAdapter_1_8_15 { public: @@ -608,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 "; } @@ -834,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."; } @@ -2082,9 +2084,122 @@ class TranslatorBrazilian : public Translator return result; } - -////////////////////////////////////////////////////////////////////////// - + ////////////////////////////////////////////////////////////////////////// + // new since 1.8.15 + ////////////////////////////////////////////////////////////////////////// + + /** VHDL design unit hierarchy */ + virtual QCString trDesignUnitHierarchy() + { return "Hierarquia da Unidade de Design"; } + /** VHDL design unit list */ + virtual QCString trDesignUnitList() + { return "Lista de Unidades de Design"; } + /** VHDL design unit members */ + virtual QCString trDesignUnitMembers() + { return "Membros da Unidade de Design"; } + /** VHDL design unit list description */ + virtual QCString trDesignUnitListDescription() + { + return "Esta é uma lista de todos os membros de unidades de design " + "com ligações para as entidades às quais pertencem:"; + } + /** VHDL design unit index */ + virtual QCString trDesignUnitIndex() + { return "Índice de Unidades de Design"; } + /** VHDL design units */ + virtual QCString trDesignUnits() + { return "Unidades de Design"; } + /** VHDL functions/procedures/processes */ + virtual QCString trFunctionAndProc() + { return "Funções/Procedimentos/Processos"; } + /** VHDL type */ + virtual QCString trVhdlType(uint64 type,bool single) + { + switch(type) + { + case VhdlDocGen::LIBRARY: + if (single) return "Biblioteca"; + else return "Bibliotecas"; + case VhdlDocGen::PACKAGE: + if (single) return "Pacote"; + else return "Pacotes"; + case VhdlDocGen::SIGNAL: + if (single) return "Sinal"; + else return "Sinais"; + 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 "Entidade"; + 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 "Função"; + else return "Funções"; + case VhdlDocGen::RECORD: + if (single) return "Registro"; + else return "Registros"; + case VhdlDocGen::PROCEDURE: + if (single) return "Procedimento"; + else return "Procedimentos"; + case VhdlDocGen::ARCHITECTURE: + if (single) return "Arquitetura"; + else return "Arquiteturas"; + case VhdlDocGen::ATTRIBUTE: + if (single) return "Atributo"; + else return "Atributos"; + case VhdlDocGen::PROCESS: + if (single) return "Processo"; + else return "Processos"; + case VhdlDocGen::PORT: + if (single) return "Porta"; + else return "Portas"; + case VhdlDocGen::USE: + if (single) return "cláusula de uso"; + else return "cláusulas de uso"; + case VhdlDocGen::GENERIC: + if (single) return "Generico"; + else return "Genericos"; + case VhdlDocGen::PACKAGE_BODY: + return "Corpo do Pacote"; + case VhdlDocGen::UNITS: + return "Unidades"; + case VhdlDocGen::SHAREDVARIABLE: + if (single) return "Variável Compartilhada"; + else return "Variáveis Compartilhadas"; + case VhdlDocGen::VFILE: + if (single) return "Arquivo"; + else return "Arquivos"; + case VhdlDocGen::GROUP: + if (single) return "Grupo"; + else return "Grupos"; + case VhdlDocGen::INSTANTIATION: + if (single) return "Instância"; + else return "Instâncias"; + case VhdlDocGen::ALIAS: + if (single) return "Apelido"; + else return "Apelidos"; + case VhdlDocGen::CONFIG: + if (single) return "Configuração"; + else return "Configurações"; + case VhdlDocGen::MISCELLANEOUS: + return "Outros"; // Is this correct for VHDL? + case VhdlDocGen::UCF_CONST: + return "Restrições"; + default: + return "Classe"; + } + } + virtual QCString trCustomReference(const char *name) + { return "Referência de " + QCString(name); } }; #endif diff --git a/src/translator_cn.h b/src/translator_cn.h index d37da94..0e559c1 100644 --- a/src/translator_cn.h +++ b/src/translator_cn.h @@ -24,7 +24,7 @@ */ #define CN_SPC " " -class TranslatorChinese : public Translator +class TranslatorChinese : public TranslatorAdapter_1_8_15 { public: /*! Used for identification of the language. The identification @@ -53,8 +53,20 @@ class TranslatorChinese : public Translator */ virtual QCString latexLanguageSupportCommand() { + return "\\usepackage{CJKutf8}\n"; + } + virtual QCString latexFontenc() + { return ""; } + virtual QCString latexDocumentPre() + { + return "\\begin{CJK}{UTF8}{min}\n"; + } + virtual QCString latexDocumentPost() + { + return "\\end{CJK}\n"; + } /*! used in the compound documentation before a list of related functions. */ @@ -100,7 +112,7 @@ class TranslatorChinese : public Translator virtual QCString trMore() { return "更多..."; } - /*! put in the class documention */ + /*! put in the class documentation */ virtual QCString trListOfAllMembers() { return "所有成员列表"; } diff --git a/src/translator_cz.h b/src/translator_cz.h index 056d0e4..9d6c489 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -85,7 +85,7 @@ // something else. It is difficult to find the general translation // for all kinds in the Czech language. -class TranslatorCzech : public Translator +class TranslatorCzech : public TranslatorAdapter_1_8_15 { public: // --- Language control methods ------------------- @@ -96,7 +96,13 @@ class TranslatorCzech : public Translator virtual QCString latexLanguageSupportCommand() { return "\\usepackage[T2A]{fontenc}\n" - "\\usepackage[czech]{babel}\n"; + "\\usepackage[czech]{babel}\n" + "\\usepackage{regexpatch}\n" + "\\makeatletter\n" + "% Change the `-` delimiter to an active character\n" + "\\xpatchparametertext\\@@@cmidrule{-}{\\cA-}{}{}\n" + "\\xpatchparametertext\\@cline{-}{\\cA-}{}{}\n" + "\\makeatother\n"; } // --- Language translation methods ------------------- diff --git a/src/translator_de.h b/src/translator_de.h index d63bdcf..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: @@ -316,8 +316,17 @@ class TranslatorGerman : public Translator /*! This is an introduction to the class hierarchy. */ virtual QCString trClassHierarchyDescription() - { return "Die Liste der Ableitungen ist -mit Einschränkungen- " - "alphabetisch sortiert:"; + { + if (Config_getBool(OPTIMIZE_OUTPUT_VHDL)) + { + return "Hier folgt eine hierarchische Auflistung der " + "Entwurfseinheiten:"; + } + else + { + return "Die Liste der Ableitungen ist -mit Einschränkungen- " + "alphabetisch sortiert:"; + } } /*! This is an introduction to the list with all files. */ @@ -469,6 +478,10 @@ class TranslatorGerman : public Translator { return "Datenstruktur-Dokumentation"; } + else if (Config_getBool(OPTIMIZE_OUTPUT_VHDL)) + { + return "Entwurfseinheiten-Dokumentation"; + } else { return "Klassen-Dokumentation"; @@ -1982,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"; @@ -2125,6 +2138,123 @@ class TranslatorGerman : public Translator } ////////////////////////////////////////////////////////////////////////// +// new since 1.8.15 +////////////////////////////////////////////////////////////////////////// + + /** VHDL design unit hierarchy */ + virtual QCString trDesignUnitHierarchy() + { return "Entwurfseinheiten-Hierarchie"; } + /** VHDL design unit list */ + virtual QCString trDesignUnitList() + { return "Auflistung der Entwurfseinheiten"; } + /** VHDL design unit members */ + virtual QCString trDesignUnitMembers() + { return "Entwurfseinheiten-Elemente"; } + /** VHDL design unit list description */ + virtual QCString trDesignUnitListDescription() + { + return "Hier folgt die Aufzählung aller Entwurfseinheiten und deren " + "Elemente mit einer Kurzbeschreibung:"; + } + /** VHDL design unit index */ + virtual QCString trDesignUnitIndex() + { return "Entwurfseinheiten-Verzeichnis"; } + /** VHDL design units */ + virtual QCString trDesignUnits() + { return "Entwurfseinheiten"; } + /** VHDL functions/procedures/processes */ + virtual QCString trFunctionAndProc() + { return "Funktionen/Prozeduren/Prozesse"; } + /** VHDL type */ + virtual QCString trVhdlType(uint64 type,bool single) + { + switch(type) + { + case VhdlDocGen::LIBRARY: + if (single) return "Bibliothek"; + else return "Bibliotheken"; + case VhdlDocGen::PACKAGE: + if (single) return "Paket"; + else return "Pakete"; + case VhdlDocGen::SIGNAL: + if (single) return "Signal"; + else return "Signale"; + case VhdlDocGen::COMPONENT: + if (single) return "Komponente"; + else return "Komponenten"; + case VhdlDocGen::CONSTANT: + if (single) return "Konstante"; + else return "Konstanten"; + case VhdlDocGen::ENTITY: + if (single) return "Entwurfseinheit"; + else return "Entwurfseinheiten"; + case VhdlDocGen::TYPE: + if (single) return "Typ"; + else return "Typen"; + case VhdlDocGen::SUBTYPE: + if (single) return "Subtyp"; + else return "Subtypen"; + case VhdlDocGen::FUNCTION: + if (single) return "Funktion"; + else return "Funktionen"; + case VhdlDocGen::RECORD: + if (single) return "Datenstruktur"; + else return "Datenstrukturen"; + case VhdlDocGen::PROCEDURE: + if (single) return "Prozedur"; + else return "Prozeduren"; + case VhdlDocGen::ARCHITECTURE: + if (single) return "Architektur"; + else return "Architekturen"; + case VhdlDocGen::ATTRIBUTE: + if (single) return "Attribut"; + else return "Attribute"; + case VhdlDocGen::PROCESS: + if (single) return "Prozess"; + else return "Prozesse"; + case VhdlDocGen::PORT: + if (single) return "Schnittstelle"; + else return "Schnittstellen"; + case VhdlDocGen::USE: + if (single) return "Use Klausel"; + else return "Use Klauseln"; + case VhdlDocGen::GENERIC: + if (single) return "Parameter"; + else return "Parameter"; + case VhdlDocGen::PACKAGE_BODY: + return "Paketkörper"; + case VhdlDocGen::UNITS: + return "Einheiten"; + case VhdlDocGen::SHAREDVARIABLE: + if (single) return "Geteilte Variable"; + else return "Geteilte Variablen"; + case VhdlDocGen::VFILE: + if (single) return "Datei"; + else return "Dateien"; + case VhdlDocGen::GROUP: + if (single) return "Gruppe"; + else return "Gruppen"; + case VhdlDocGen::INSTANTIATION: + if (single) return "Instanziierung"; + else return "Instanziierungen"; + case VhdlDocGen::ALIAS: + if (single) return "Alias"; + else return "Aliase"; + case VhdlDocGen::CONFIG: + if (single) return "Konfiguration"; + else return "Konfigurationen"; + case VhdlDocGen::MISCELLANEOUS: + return "Verschiedenes"; + case VhdlDocGen::UCF_CONST: + return "Constraints"; + default: + return "Klasse"; + } + } + virtual QCString trCustomReference(const char *name) + { return QCString(name)+"-Referenz"; } + + ////////////////////////////////////////////////////////////////////////// }; diff --git a/src/translator_dk.h b/src/translator_dk.h index e98cfa8..70e9032 100644 --- a/src/translator_dk.h +++ b/src/translator_dk.h @@ -116,8 +116,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0 virtual QCString latexLanguageSupportCommand() { return - "\\usepackage[danish]{babel}\n" - "\\usepackage[T1]{fontenc}\n"; + "\\usepackage[danish]{babel}\n"; } // --- Language translation methods ------------------- diff --git a/src/translator_en.h b/src/translator_en.h index 190ba79..400e59c 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -224,8 +224,16 @@ class TranslatorEnglish : public Translator /*! This is an introduction to the class hierarchy. */ virtual QCString trClassHierarchyDescription() - { return "This inheritance list is sorted roughly, " - "but not completely, alphabetically:"; + { + if (Config_getBool(OPTIMIZE_OUTPUT_VHDL)) + { + return "Here is a hierarchical list of all entities:"; + } + else + { + return "This inheritance list is sorted roughly, " + "but not completely, alphabetically:"; + } } /*! This is an introduction to the list with all files. */ @@ -245,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, " @@ -1993,6 +2005,255 @@ class TranslatorEnglish : public Translator } ////////////////////////////////////////////////////////////////////////// +// new since 1.8.15 +////////////////////////////////////////////////////////////////////////// + + /** VHDL design unit hierarchy */ + virtual QCString trDesignUnitHierarchy() + { return "Design Unit Hierarchy"; } + /** VHDL design unit list */ + virtual QCString trDesignUnitList() + { return "Design Unit List"; } + /** VHDL design unit members */ + virtual QCString trDesignUnitMembers() + { return "Design Unit Members"; } + /** VHDL design unit list description */ + virtual QCString trDesignUnitListDescription() + { + return "Here is a list of all design unit members with links to " + "the Entities they belong to:"; + } + /** VHDL design unit index */ + virtual QCString trDesignUnitIndex() + { return "Design Unit Index"; } + /** VHDL design units */ + virtual QCString trDesignUnits() + { return "Design Units"; } + /** VHDL functions/procedures/processes */ + virtual QCString trFunctionAndProc() + { return "Functions/Procedures/Processes"; } + /** VHDL type */ + virtual QCString trVhdlType(uint64 type,bool single) + { + switch(type) + { + case VhdlDocGen::LIBRARY: + if (single) return "Library"; + else return "Libraries"; + case VhdlDocGen::PACKAGE: + if (single) return "Package"; + else return "Packages"; + case VhdlDocGen::SIGNAL: + if (single) return "Signal"; + else return "Signals"; + case VhdlDocGen::COMPONENT: + if (single) return "Component"; + else return "Components"; + case VhdlDocGen::CONSTANT: + if (single) return "Constant"; + else return "Constants"; + case VhdlDocGen::ENTITY: + if (single) return "Entity"; + else return "Entities"; + case VhdlDocGen::TYPE: + if (single) return "Type"; + else return "Types"; + case VhdlDocGen::SUBTYPE: + if (single) return "Subtype"; + else return "Subtypes"; + case VhdlDocGen::FUNCTION: + if (single) return "Function"; + else return "Functions"; + case VhdlDocGen::RECORD: + if (single) return "Record"; + else return "Records"; + case VhdlDocGen::PROCEDURE: + if (single) return "Procedure"; + else return "Procedures"; + case VhdlDocGen::ARCHITECTURE: + if (single) return "Architecture"; + else return "Architectures"; + case VhdlDocGen::ATTRIBUTE: + if (single) return "Attribute"; + else return "Attributes"; + 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 "use clause"; + else return "Use Clauses"; + case VhdlDocGen::GENERIC: + if (single) return "Generic"; + else return "Generics"; + case VhdlDocGen::PACKAGE_BODY: + return "Package Body"; + case VhdlDocGen::UNITS: + return "Units"; + case VhdlDocGen::SHAREDVARIABLE: + if (single) return "Shared Variable"; + else return "Shared Variables"; + case VhdlDocGen::VFILE: + if (single) return "File"; + else return "Files"; + case VhdlDocGen::GROUP: + if (single) return "Group"; + else return "Groups"; + case VhdlDocGen::INSTANTIATION: + if (single) return "Instantiation"; + else return "Instantiations"; + case VhdlDocGen::ALIAS: + if (single) return "Alias"; + else return "Aliases"; + case VhdlDocGen::CONFIG: + if (single) return "Configuration"; + else return "Configurations"; + case VhdlDocGen::MISCELLANEOUS: + return "Miscellaneous"; + case VhdlDocGen::UCF_CONST: + return "Constraints"; + default: + return "Class"; + } + } + 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 8922297..b28ed75 100644 --- a/src/translator_es.h +++ b/src/translator_es.h @@ -34,7 +34,7 @@ * Updated to 1.8.4 by Bartomeu Creus Navarro (17-julio-2013) */ -class TranslatorSpanish : public Translator +class TranslatorSpanish : public TranslatorAdapter_1_8_15 { public: @@ -2057,6 +2057,254 @@ class TranslatorSpanish : public Translator } ////////////////////////////////////////////////////////////////////////// +// 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 9775a29..f355619 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -103,7 +103,7 @@ // Translator class (by the local maintainer) when the localized // translator is made up-to-date again. -class TranslatorFrench : public Translator +class TranslatorFrench : public TranslatorAdapter_1_8_15 { public: @@ -2055,6 +2055,258 @@ class TranslatorFrench : public Translator } ////////////////////////////////////////////////////////////////////////// +// 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_gr.h b/src/translator_gr.h index 8b7afe1..6ed43db 100644 --- a/src/translator_gr.h +++ b/src/translator_gr.h @@ -42,7 +42,7 @@ #ifndef TRANSLATOR_GR_H #define TRANSLATOR_GR_H -class TranslatorGreek : public Translator +class TranslatorGreek : public TranslatorAdapter_1_8_15 { public: @@ -59,8 +59,8 @@ class TranslatorGreek : public Translator virtual QCString latexLanguageSupportCommand() { - //return "\\usepackage[greek,english]{babel}\n\\usepackage[iso-8859-7]{inputenc}\n"; - return "\\usepackage[greek,english]{babel}\n"; + return "\\usepackage[greek,english]{babel}\n" + "\\usepackage{alphabeta}\n"; } // --- Language translation methods ------------------- diff --git a/src/translator_hu.h b/src/translator_hu.h index 17f0d44..44363c9 100644 --- a/src/translator_hu.h +++ b/src/translator_hu.h @@ -13,21 +13,46 @@ * */ - /* - * Original Hungarian translation by - * György Földvári <foldvari@diatronltd.com> - * - * Extended, revised and updated by - * Ákos Kiss <akiss@users.sourceforge.net> - * - * Further extended, revised and updated by - * Tamási Ferenc <tf551@hszk.bme.hu> - */ +/* + * Original Hungarian translation by + * György Földvári <foldvari@diatronltd.com> + * + * Extended, revised and updated by + * Ákos Kiss <akiss@users.sourceforge.net> + * + * Further extended, revised and updated by + * Ferenc Tamási <tf551@hszk.bme.hu> + * + * Further extended, since 1.4.6 to 1.8.4 + * László Kmety <silverkml@gmail.com> + */ #ifndef TRANSLATOR_HU_H #define TRANSLATOR_HU_H -class TranslatorHungarian : public TranslatorAdapter_1_4_6 +/*! + When defining a translator class for the new language, follow + the description in the documentation. One of the steps says + that you should copy the translator_en.h (this) file to your + translator_xx.h new file. Your new language should use the + Translator class as the base class. This means that you need to + implement exactly the same (pure virtual) methods as the + TranslatorEnglish does. Because of this, it is a good idea to + start with the copy of TranslatorEnglish and replace the strings + one by one. + + It is not necessary to include "translator.h" or + "translator_adapter.h" here. The files are included in the + language.cpp correctly. Not including any of the mentioned + files frees the maintainer from thinking about whether the + first, the second, or both files should be included or not, and + why. This holds namely for localized translators because their + base class is changed occasionally to adapter classes when the + Translator class changes the interface, or back to the + Translator class (by the local maintainer) when the localized + translator is made up-to-date again. +*/ +class TranslatorHungarian : public TranslatorAdapter_1_8_15 { private: const char * zed(char c) @@ -45,12 +70,29 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 public: // --- Language control methods ------------------- + + /*! Used for identification of the language. The identification + * should not be translated. It should be replaced by the name + * of the language in English using lower-case characters only + * (e.g. "czech", "japanese", "russian", etc.). It should be equal to + * the identification used in language.cpp. + */ virtual QCString idLanguage() { return "hungarian"; } - /*! Used to get the command(s) for the language support. This method - * was designed for languages which do not prefer babel package. - * If this methods returns empty string, then the latexBabelPackage() - * method is used to generate the command for using the babel package. + + /*! Used to get the LaTeX command(s) for the language support. + * This method should return string with commands that switch + * LaTeX to the desired language. For example + * <pre>"\\usepackage[german]{babel}\n" + * </pre> + * or + * <pre>"\\usepackage{polski}\n" + * "\\usepackage[latin2]{inputenc}\n" + * "\\usepackage[T1]{fontenc}\n" + * </pre> + * + * The English LaTeX does not use such commands. Because of this + * the empty string is returned in this implementation. */ virtual QCString latexLanguageSupportCommand() { @@ -117,6 +159,9 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 virtual QCString trIncludingInheritedMembers() { return " osztály tagjainak teljes listája, az örökölt tagokkal együtt."; } + /*! this is put at the author sections at the bottom of man pages. + * parameter s is name of the project name. + */ virtual QCString trGeneratedAutomatically(const char *s) { QCString result="Ezt a dokumentációt a Doxygen készítette "; if (s) result+=(QCString)" a" + zed(s[0])+s+(QCString)" projekthez"; @@ -243,7 +288,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 } if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C)) { - result+="struktúra- és úniómező"; + result+="struktúra- és uniómező"; } else { @@ -254,7 +299,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 { if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C)) { - result+="a megfelelő struktúra-/úniódokumentációra minden mezőnél:"; + result+="a megfelelő struktúra/unió dokumentációra minden mezőnél:"; } else { @@ -265,7 +310,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 { if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C)) { - result+="a struktúrákra/úniókra, amikhez tartoznak:"; + result+="a struktúrákra/uniókra, amikhez tartoznak:"; } else { @@ -575,8 +620,8 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 case ClassDef::Struct: result+=" struktúra"; break; case ClassDef::Union: result+=" unió"; break; case ClassDef::Interface: result+=" interfész"; break; - case ClassDef::Protocol: result+=" protocol"; break; // translate me! - case ClassDef::Category: result+=" category"; break; // translate me! + case ClassDef::Protocol: result+=" protokoll"; break; + case ClassDef::Category: result+=" kategória"; break; case ClassDef::Exception: result+=" kivétel"; break; default: break; } @@ -726,8 +771,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 */ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool single) - { // here s is one of " Class", " Struct" or " Union" - // single is true implies a single file + { // single is true implies a single file QCString result=(QCString)"Ez a dokumentáció "; switch(compType) { @@ -735,8 +779,8 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 case ClassDef::Struct: result+="a struktúráról"; break; case ClassDef::Union: result+="az unióról"; break; case ClassDef::Interface: result+="az interfészről"; break; - case ClassDef::Protocol: result+="protocol"; break; // translate me! - case ClassDef::Category: result+="category"; break; // translate me! + case ClassDef::Protocol: result+="a protokollról"; break; + case ClassDef::Category: result+="a kategóriáról"; break; case ClassDef::Exception: result+="a kivételről"; break; default: break; } @@ -960,7 +1004,9 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 { return "Jelmagyarázat"; } - /*! page explaining how the dot graph's should be interpreted */ + /*! page explaining how the dot graph's should be interpreted + * The %A in the text below are to prevent link to classes called "A". + */ virtual QCString trLegendDocs() { return @@ -995,29 +1041,31 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 " Used *m_usedClass;\n" "};\n" "\\endcode\n" - "Ha a konfigurációs fájl \\c MAX_DOT_GRAPH_HEIGHT elemének értékét " - "240-re állítjuk, az eredmény a következő ábra lesz:" - "<p><center><img src=\"graph_legend."+getDotImageExtension()+"\"></center>\n" + "Az eredmény a következő ábra lesz:" + "<p><center><img alt=\"\" src=\"graph_legend."+getDotImageExtension()+"\"></center></p>\n" "<p>\n" - "Az ábrán levő dobozok jelentése:\n" + "A fenti ábrán levő dobozok jelentése a következő:\n" "<ul>\n" "<li>Kitöltött fekete doboz jelzi azt az osztályt vagy struktúrát," - "amelyről az ábra szól.\n" - "<li>Fekete keret jelzi a dokumentált osztályokat és struktúrákat.\n" - "<li>Szürke keret jelzi a nem dokumentált osztályokat és struktúrákat.\n" + "amelyről az ábra szól.</li>\n" + "<li>Fekete keret jelzi a dokumentált osztályokat és struktúrákat.</li>\n" + "<li>Szürke keret jelzi a nem dokumentált osztályokat és struktúrákat.</li>\n" "<li>Piros keret jelzi azokat az osztályokat és struktúrákat, amelyeknél vágás miatt nem látható " "az összes leszármaztatási kapcsolat. Egy ábra vágásra kerül, ha nem fér bele " - "a megadott tartományba." + "a megadott tartományba.</li>\n" "</ul>\n" - "A nyilak jelentése:\n" + "<p>\n" + "A nyilak jelentése a következő:\n" + "</p>\n" "<ul>\n" - "<li>Sötétkék nyíl jelzi a publikus származtatást.\n" - "<li>Sötétzöld nyíl jelzi a védett származtatást.\n" - "<li>Sötétvörös nyíl jelzi a privát származtatást.\n" + "<li>Sötétkék nyíl jelzi a publikus származtatás " + "kapcsolatát két osztály között.</li>\n" + "<li>Sötétzöld nyíl jelzi a védett származtatást.</li>\n" + "<li>Sötétvörös nyíl jelzi a privát származtatást.</li>\n" "<li>Lila szaggatott nyíl jelzi, ha az osztály egy másikat használ vagy tartalmaz. " - "A nyíl felirata jelzi a változó(k) nevét, amelyeken keresztül a másik osztály kapcsolódik.\n" + "A nyíl felirata jelzi a változó(k) nevét, amelyeken keresztül a másik osztály kapcsolódik.</li>\n" "<li>Sárga szaggatott nyíl jelzi a kapcsolatot a sablonpéldány és a példányosított " - "osztálysablon között. A nyíl felirata jelzi a pélány sablonparamétereit.\n" + "osztálysablon között. A nyíl felirata jelzi a pélány sablonparamétereit.</li>\n" "</ul>\n"; } @@ -1086,7 +1134,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 /*! The description of the package index page */ virtual QCString trPackageListDescription() { - return "A csomagok rövid leírásai (amennyiben léteznek):"; + return "A csomagok rövid leírásai (ha léteznek):"; } /*! The link name in the Quick links header for each page */ virtual QCString trPackages() @@ -1167,10 +1215,10 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trClass(bool first_capital, bool /*singular*/) + virtual QCString trClass(bool first_capital, bool singular) { QCString result((first_capital ? "Osztály" : "osztály")); - //if (!singular) result+="es"; + //if (!singular) result+="ok"; return result; } @@ -1178,10 +1226,10 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trFile(bool first_capital, bool /*singular*/) + virtual QCString trFile(bool first_capital, bool singular) { QCString result((first_capital ? "Fájl" : "fájl")); - //if (!singular) result+="s"; + if (!singular) result+="ok"; return result; } @@ -1189,10 +1237,11 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trNamespace(bool first_capital, bool /*singular*/) + virtual QCString trNamespace(bool first_capital, bool singular) { - QCString result((first_capital ? "Névtér" : "névtér")); - //if (!singular) result+="s"; + QCString result(""); + if (!singular) result+=first_capital ? "Névterek" : "névterek"; + else result+=first_capital ? "Névtér" : "névtér"; return result; } @@ -1200,10 +1249,10 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trGroup(bool first_capital, bool /*singular*/) + virtual QCString trGroup(bool first_capital, bool singular) { - QCString result((first_capital ? "Csoport" : "csoport")); - //if (!singular) result+="s"; + QCString result((first_capital ? "Modul" : "modul")); + if (!singular) result+="ok"; return result; } @@ -1211,10 +1260,10 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trPage(bool first_capital, bool /*singular*/) + virtual QCString trPage(bool first_capital, bool singular) { QCString result((first_capital ? "Oldal" : "oldal")); - //if (!singular) result+="s"; + if (!singular) result+="ak"; return result; } @@ -1222,10 +1271,10 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trMember(bool first_capital, bool /*singular*/) + virtual QCString trMember(bool first_capital, bool singular) { QCString result((first_capital ? "Tag" : "tag")); - //if (!singular) result+="s"; + if (!singular) result+="ok"; return result; } @@ -1233,10 +1282,10 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trGlobal(bool first_capital, bool /*singular*/) + virtual QCString trGlobal(bool first_capital, bool singular) { QCString result((first_capital ? "Globális elem" : "globális elem")); - //if (!singular) result+="s"; + if (!singular) result+="ek"; return result; } @@ -1490,9 +1539,490 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 */ virtual QCString trOverloadText() { - return "Ez egy túlterhelt tagfüggvény." - "A fenti függvénytől csak argumentumaiban különbözik."; + return "Ez egy túlterhelt tagfüggvény, " + "a kényelem érdekében. A fenti függvénytől csak abban különbözik, " + "hogy milyen argumentumokat fogad el."; + } + + +////////////////////////////////////////////////////////////////////////// +// new since 1.4.6 +////////////////////////////////////////////////////////////////////////// + + /*! This is used to introduce a caller (or called-by) graph */ + virtual QCString trCallerGraph() + { + return "A függvény hívó gráfja:"; + } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration values + */ + virtual QCString trEnumerationValueDocumentation() + { return "Enumerációs-érték dokumentáció"; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.5.4 (mainly for Fortran) +////////////////////////////////////////////////////////////////////////// + + /*! header that is put before the list of member subprograms (Fortran). */ + virtual QCString trMemberFunctionDocumentationFortran() + { return "Tagfüggvény/Alprogram dokumentáció"; } + + /*! This is put above each page as a link to the list of annotated data types (Fortran). */ + virtual QCString trCompoundListFortran() + { return "Adattípusok listája"; } + + /*! This is put above each page as a link to all members of compounds (Fortran). */ + virtual QCString trCompoundMembersFortran() + { return "Adatmezők"; } + + /*! This is an introduction to the annotated compound list (Fortran). */ + virtual QCString trCompoundListDescriptionFortran() + { return "Rövid leírással ellátott adattípusok:"; } + + /*! This is an introduction to the page with all data types (Fortran). */ + virtual QCString trCompoundMembersDescriptionFortran(bool extractAll) + { + QCString result="Az összes "; + if (!extractAll) + { + result+="dokumentált "; + } + result+="adattípusú tagváltozó"; + result+=" hivatkozásokkal ellátva "; + if (!extractAll) + { + result+="az egyes adattagok adatszerkezetének dokumentációjára"; + } + else + { + result+="azokhoz az adattípusokhoz, amelyekhez tartoznak:"; + } + return result; + } + /*! This is used in LaTeX as the title of the chapter with the + * annotated compound index (Fortran). + */ + virtual QCString trCompoundIndexFortran() + { return "Adattípus index"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all data types (Fortran). + */ + virtual QCString trTypeDocumentation() + { return "Adattípus dokumentáció"; } + /*! This is used in the documentation of a file as a header before the + * list of (global) subprograms (Fortran). + */ + virtual QCString trSubprograms() + { return "Függvények/Alprogramok"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for subprograms (Fortran) + */ + virtual QCString trSubprogramDocumentation() + { return "Függvény/Alprogram dokumentáció"; } + + /*! This is used in the documentation of a file/namespace/group before + * the list of links to documented compounds (Fortran) + */ + virtual QCString trDataTypes() + { return "Adattípusok"; } + + /*! used as the title of page containing all the index of all modules (Fortran). */ + virtual QCString trModulesList() + { return "Modulok listája"; } + + /*! used as an introduction to the modules list (Fortran) */ + virtual QCString trModulesListDescription(bool extractAll) + { + QCString result="Az összes "; + if (!extractAll) result+="dokumentált "; + result+="rövid leírással ellátott modul:"; + return result; + } + + /*! used as the title of the HTML page of a module/type (Fortran) */ + virtual QCString trCompoundReferenceFortran(const char *clName, + ClassDef::CompoundType compType, + bool isTemplate) + { + QCString result=(QCString)clName; + switch(compType) + { + case ClassDef::Class: result+=" modul"; break; + case ClassDef::Struct: result+=" típus"; break; + case ClassDef::Union: result+=" unió"; break; + case ClassDef::Interface: result+=" interfész"; break; + case ClassDef::Protocol: result+=" protokoll"; break; + case ClassDef::Category: result+=" kategória"; break; + case ClassDef::Exception: result+=" kivétel"; break; + default: break; + } + if (isTemplate) result+=" sablon"; + result+=" hivatkozás"; + return result; + } + /*! used as the title of the HTML page of a module (Fortran) */ + virtual QCString trModuleReference(const char *namespaceName) + { + QCString result=namespaceName; + result+=" modul hivatkozás"; + return result; + } + + /*! This is put above each page as a link to all members of modules. (Fortran) */ + virtual QCString trModulesMembers() + { return "Modul adattagok"; } + + /*! This is an introduction to the page with all modules members (Fortran) */ + virtual QCString trModulesMemberDescription(bool extractAll) + { + QCString result="Az összes "; + if (!extractAll) result+="dokumentált "; + result+="modul adattagja hivatkozásokkal ellátva "; + if (extractAll) + { + result+="az egyes adattagok moduljainak dokumentációjára:"; + } + else + { + result+="azokhoz a modulokhoz, amelyekhez tartoznak:"; + } + return result; + } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all modules (Fortran). + */ + virtual QCString trModulesIndex() + { return "Modulok indexe"; } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trModule(bool first_capital, bool singular) + { + QCString result((first_capital ? "Modul" : "modul")); + if (!singular) result+="s"; + return result; + } + + /*! This is put at the bottom of a module documentation page and is + * followed by a list of files that were used to generate the page. + */ + virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, + bool single) + { + // single is true implies a single file + QCString result=(QCString)"Ez a dokumentáció "; + switch(compType) + { + case ClassDef::Class: result+="a modulról"; break; + case ClassDef::Struct: result+="a típusról"; break; + case ClassDef::Union: result+="az unióról"; break; + case ClassDef::Interface: result+="az interfészról"; break; + case ClassDef::Protocol: result+="a protokollról"; break; + case ClassDef::Category: result+="a kategóriáról"; break; + case ClassDef::Exception: result+="a kivételről"; break; + default: break; + } + result+=" a következő fájl"; + if (!single) result+="ok"; + result+=" alapján készült:"; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trType(bool first_capital, bool singular) + { + QCString result((first_capital ? "Típus" : "típus")); + if (!singular) result+="ok"; + return result; } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trSubprogram(bool first_capital, bool singular) + { + QCString result((first_capital ? "Alprogram" : "alprogram")); + if (!singular) result+="ok"; + return result; + } + + /*! C# Type Constraint list */ + virtual QCString trTypeConstraints() + { + return "Típuskorlátozások"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.6.0 (mainly for the new search engine) +////////////////////////////////////////////////////////////////////////// + + /*! directory relation for \a name */ + virtual QCString trDirRelation(const char *name) + { + return QCString(name)+" kapcsolat"; + } + + /*! Loading message shown when loading search results */ + virtual QCString trLoading() + { + return "Betöltés..."; + } + + /*! Label used for search results in the global namespace */ + virtual QCString trGlobalNamespace() + { + return "Globális névtér"; + } + + /*! Message shown while searching */ + virtual QCString trSearching() + { + return "Keresés..."; + } + + /*! Text shown when no search results are found */ + virtual QCString trNoMatches() + { + return "Nincs egyezés"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.6.3 (missing items for the directory pages) +////////////////////////////////////////////////////////////////////////// + + /*! when clicking a directory dependency label, a page with a + * table is shown. The heading for the first column mentions the + * source file that has a relation to another file. + */ + virtual QCString trFileIn(const char *name) + { + return (QCString)"Fájl a(z) "+name+" könyvtárban"; + } + + /*! when clicking a directory dependency label, a page with a + * table is shown. The heading for the second column mentions the + * destination file that is included. + */ + virtual QCString trIncludesFileIn(const char *name) + { + return (QCString)"Tartalmazott fájl a(z) "+name+" könyvtárban"; + } + + /** Compiles a date string. + * @param year Year in 4 digits + * @param month Month of the year: 1=January + * @param day Day of the Month: 1..31 + * @param dayOfWeek Day of the week: 1=Monday..7=Sunday + * @param hour Hour of the day: 0..23 + * @param minutes Minutes in the hour: 0..59 + * @param seconds Seconds within the minute: 0..59 + * @param includeTime Include time in the result string? + */ + virtual QCString trDateTime(int year,int month,int day,int dayOfWeek, + int hour,int minutes,int seconds, + bool includeTime) + { + static const char *days[] = { "Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat","Vasárnap" }; + static const char *months[] = { "Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December" }; + QCString sdate; + sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year); + if (includeTime) + { + QCString stime; + stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds); + sdate+=stime; + } + return sdate; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.7.5 +////////////////////////////////////////////////////////////////////////// + + /*! Header for the page with bibliographic citations */ + virtual QCString trCiteReferences() + { return "Bibliográfia"; } + + /*! Text for copyright paragraph */ + virtual QCString trCopyright() + { return "Szerzői jog"; } + + /*! Header for the graph showing the directory dependencies */ + virtual QCString trDirDepGraph(const char *name) + { return QCString("Könyvtár függőségi gráf a(z) ")+name+"-könyvtárhoz:"; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.0 +////////////////////////////////////////////////////////////////////////// + + /*! Detail level selector shown for hierarchical indices */ + virtual QCString trDetailLevel() + { return "részletességi szint"; } + + /*! Section header for list of template parameters */ + virtual QCString trTemplateParameters() + { return "Sablon paraméterek"; } + + /*! Used in dot graph when UML_LOOK is enabled and there are many fields */ + virtual QCString trAndMore(const QCString &number) + { return "és "+number+" elemmel több..."; } + + /*! Used file list for a Java enum */ + virtual QCString trEnumGeneratedFromFiles(bool single) + { QCString result = "A dokumentáció ehhez az enum-hoz a következő fájl"; + if (!single) result+="ok"; + result+=" alapján készült:"; + return result; + } + + /*! Header of a Java enum page (Java enums are represented as classes). */ + virtual QCString trEnumReference(const char *name) + { return QCString(name)+" felsoroló referencia"; } + + /*! Used for a section containing inherited members */ + virtual QCString trInheritedFrom(const char *members,const char *what) + { return QCString(members)+" a(z) "+what+" osztályból származnak"; } + + /*! Header of the sections with inherited members specific for the + * base class(es) + */ + virtual QCString trAdditionalInheritedMembers() + { return "További örökölt tagok"; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.2 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a tooltip for the toggle button that appears in the + * navigation tree in the HTML output when GENERATE_TREEVIEW is + * enabled. This tooltip explains the meaning of the button. + */ + virtual QCString trPanelSynchronisationTooltip(bool enable) + { + QCString opt = enable ? "engedélyez" : "letilt"; + return "Kattintson a(z) "+opt+" panel synchronisation"; + } + + /*! Used in a method of an Objective-C class that is declared in a + * a category. Note that the @1 marker is required and is replaced + * by a link. + */ + virtual QCString trProvidedByCategory() + { + return "@0 kategória szerint."; + } + + /*! Used in a method of an Objective-C category that extends a class. + * Note that the @1 marker is required and is replaced by a link to + * the class method. + */ + virtual QCString trExtendsClass() + { + return "@0 kiterjesztett osztály."; + } + + /*! Used as the header of a list of class methods in Objective-C. + * These are similar to static public member functions in C++. + */ + virtual QCString trClassMethods() + { + return "Osztály metódusok"; + } + + /*! Used as the header of a list of instance methods in Objective-C. + * These are similar to public member functions in C++. + */ + virtual QCString trInstanceMethods() + { + return "Példány metódusok"; + } + + /*! Used as the header of the member functions of an Objective-C class. + */ + virtual QCString trMethodDocumentation() + { + return "Metódus dokumentáció"; + } + + /*! Used as the title of the design overview picture created for the + * VHDL output. + */ + virtual QCString trDesignOverview() + { + return "Dizájn áttekintés"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.4 +////////////////////////////////////////////////////////////////////////// + + /** old style UNO IDL services: implemented interfaces */ + virtual QCString trInterfaces() + { return "Exportált interfészek"; } + + /** old style UNO IDL services: inherited services */ + virtual QCString trServices() + { return "Mellékelt szolgáltatások"; } + + /** UNO IDL constant groups */ + virtual QCString trConstantGroups() + { return "Konstans csoportok"; } + + /** UNO IDL constant groups */ + virtual QCString trConstantGroupReference(const char *namespaceName) + { + QCString result=namespaceName; + result+=" konstans csoport referencia"; + return result; + } + /** UNO IDL service page title */ + virtual QCString trServiceReference(const char *sName) + { + QCString result=(QCString)sName; + result+=" szolgáltatás referencia"; + return result; + } + /** UNO IDL singleton page title */ + virtual QCString trSingletonReference(const char *sName) + { + QCString result=(QCString)sName; + result+=" egyke példány referencia"; + return result; + } + /** UNO IDL service page */ + virtual QCString trServiceGeneratedFromFiles(bool single) + { + // single is true implies a single file + QCString result=(QCString)"A szolgáltatás dokumentációja " + "a következő fájl"; + if (single) result+="ból"; else result+="okból"; + result+="lett létrehozva:"; + return result; + } + /** UNO IDL singleton page */ + virtual QCString trSingletonGeneratedFromFiles(bool single) + { + // single is true implies a single file + QCString result=(QCString)"Az egyke példány dokomentációja " + "a következő fájl"; + if (single) result+="ból"; else result+="okból"; + result+="lett létrehozva:"; + return result; + } + +////////////////////////////////////////////////////////////////////////// + }; #endif diff --git a/src/translator_it.h b/src/translator_it.h index 8f08b5a..9638a01 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -89,7 +89,7 @@ #ifndef TRANSLATOR_IT_H #define TRANSLATOR_IT_H -class TranslatorItalian : public Translator +class TranslatorItalian : public TranslatorAdapter_1_8_15 { public: diff --git a/src/translator_je.h b/src/translator_je.h index 835a516..d555421 100644 --- a/src/translator_je.h +++ b/src/translator_je.h @@ -36,7 +36,19 @@ class TranslatorJapaneseEn : public TranslatorEnglish { return "japanese-en"; } virtual QCString latexLanguageSupportCommand() { - return "platex"; + return "\\usepackage{CJKutf8}\n"; + } + virtual QCString latexFontenc() + { + return ""; + } + virtual QCString latexDocumentPre() + { + return "\\begin{CJK}{UTF8}{min}\n"; + } + virtual QCString latexDocumentPost() + { + return "\\end{CJK}\n"; } virtual QCString trRTFansicp() { diff --git a/src/translator_jp.h b/src/translator_jp.h index c4f92c2..fc0d65d 100644 --- a/src/translator_jp.h +++ b/src/translator_jp.h @@ -69,7 +69,7 @@ Doxygen の開発の方でもそれはそれでいーんじゃん?みたいな #ifndef TRANSLATOR_JP_H #define TRANSLATOR_JP_H -class TranslatorJapanese : public Translator +class TranslatorJapanese : public TranslatorAdapter_1_8_15 { public: virtual QCString idLanguage() @@ -77,8 +77,20 @@ class TranslatorJapanese : public Translator virtual QCString latexLanguageSupportCommand() { + return "\\usepackage{CJKutf8}\n"; + } + virtual QCString latexFontenc() + { return ""; } + virtual QCString latexDocumentPre() + { + return "\\begin{CJK}{UTF8}{min}\n"; + } + virtual QCString latexDocumentPost() + { + return "\\end{CJK}\n"; + } /*! used in the compound documentation before a list of related functions. */ virtual QCString trRelatedFunctions() diff --git a/src/translator_ke.h b/src/translator_ke.h index 525cf84..c9f488c 100644 --- a/src/translator_ke.h +++ b/src/translator_ke.h @@ -35,12 +35,22 @@ class TranslatorKoreanEn : public TranslatorEnglish { return "korean-en"; } virtual QCString latexLanguageSupportCommand() { - return "\\usepackage{hfont}\n"; + return "\\usepackage{kotex}\n"; } virtual QCString trRTFansicp() { return "949"; } + virtual QCString latexCommandName() + { + QCString latex_command = Config_getString(LATEX_CMD_NAME); + if (latex_command.isEmpty()) latex_command = "latex"; + if (Config_getBool(USE_PDFLATEX)) + { + if (latex_command == "latex") latex_command = "xelatex"; + } + return latex_command; + } /*! Used as ansicpg for RTF fcharset * \see trRTFansicp() for a table of possible values. diff --git a/src/translator_kr.h b/src/translator_kr.h index 7e95e3b..fb1c356 100644 --- a/src/translator_kr.h +++ b/src/translator_kr.h @@ -48,7 +48,7 @@ Translator class (by the local maintainer) when the localized translator is made up-to-date again. */ -class TranslatorKorean : public Translator +class TranslatorKorean : public TranslatorAdapter_1_8_15 { protected: friend class TranslatorAdapterBase; @@ -86,7 +86,17 @@ class TranslatorKorean : public Translator // I'm not sure what this should be. // When I figure it out, I'll update this. // see http://www.ktug.or.kr/jsboard/read.php?table=operate&no=4422&page=1 - return "\\usepackage{hfont}\n"; + return "\\usepackage{kotex}\n"; + } + virtual QCString latexCommandName() + { + QCString latex_command = Config_getString(LATEX_CMD_NAME); + if (latex_command.isEmpty()) latex_command = "latex"; + if (Config_getBool(USE_PDFLATEX)) + { + if (latex_command == "latex") latex_command = "xelatex"; + } + return latex_command; } // --- Language translation methods ------------------- diff --git a/src/translator_lv.h b/src/translator_lv.h index 2736bb0..bd579da 100644 --- a/src/translator_lv.h +++ b/src/translator_lv.h @@ -76,7 +76,7 @@ class TranslatorLatvian : public TranslatorAdapter_1_8_4 */ virtual QCString latexLanguageSupportCommand() { - return "\\usepackage[LV]{fontenc}\n" + return "\\usepackage[T2A]{fontenc}\n" "\\usepackage[latvian]{babel}\n"; } diff --git a/src/translator_nl.h b/src/translator_nl.h index 241cf97..7cecc7d 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -93,8 +93,15 @@ class TranslatorDutch : public Translator QCString trSearch() { return "Zoeken"; } QCString trClassHierarchyDescription() - { return "Deze inheritance lijst is min of meer alfabetisch " - "gesorteerd:"; + { + if (Config_getBool(OPTIMIZE_OUTPUT_VHDL)) + { + return "Hieronder is een hiërarchische lijst met alle entiteiten:"; + } + else + { + return "Deze inheritance lijst is min of meer alfabetisch gesorteerd:"; + } } QCString trFileListDescription(bool extractAll) { @@ -1586,6 +1593,198 @@ class TranslatorDutch : public Translator } ////////////////////////////////////////////////////////////////////////// +// new since 1.8.15 +////////////////////////////////////////////////////////////////////////// + + /** VHDL design unit hierarchy */ + virtual QCString trDesignUnitHierarchy() + { return "Ontwerp Eenheid Hiërarchie"; } + /** VHDL design unit list */ + virtual QCString trDesignUnitList() + { return "Ontwerp Eenheid Lijst"; } + /** VHDL design unit members */ + virtual QCString trDesignUnitMembers() + { return "Ontwerp Eenheid Members"; } + /** VHDL design unit list description */ + virtual QCString trDesignUnitListDescription() + { + return "hieronder volgt de lijst met all ontwerp eenheden met links " + "naar de entiteiten waar ze bij behoren:"; + } + /** VHDL design unit index */ + virtual QCString trDesignUnitIndex() + { return "Ontwerp Eenheid Index"; } + /** VHDL design units */ + virtual QCString trDesignUnits() + { return "Ontwerp Eenheden"; } + /** VHDL functions/procedures/processes */ + virtual QCString trFunctionAndProc() + { return "Functies/Procedures/Processen"; } + /** VHDL type */ + virtual QCString trVhdlType(uint64 type,bool single) + { + switch(type) + { + case VhdlDocGen::LIBRARY: + if (single) return "Bibliotheek"; + else return "Bibliotheken"; + case VhdlDocGen::PACKAGE: + if (single) return "Package"; + else return "Packages"; + case VhdlDocGen::SIGNAL: + if (single) return "Signal"; + else return "Signals"; + case VhdlDocGen::COMPONENT: + if (single) return "Bestanddeel"; + else return "Bestanddelen"; + case VhdlDocGen::CONSTANT: + if (single) return "Konstante"; + else return "Konstanten"; + case VhdlDocGen::ENTITY: + if (single) return "Entiteit"; + else return "Entiteiten"; + case VhdlDocGen::TYPE: + if (single) return "Type"; + else return "Types"; + case VhdlDocGen::SUBTYPE: + if (single) return "Ondertype"; + else return "Ondertypes"; + case VhdlDocGen::FUNCTION: + if (single) return "Funktie"; + else return "Funkties"; + case VhdlDocGen::RECORD: + if (single) return "Record"; + else return "Records"; + case VhdlDocGen::PROCEDURE: + if (single) return "Procedure"; + else return "Procedures"; + case VhdlDocGen::ARCHITECTURE: + if (single) return "Architectuur"; + else return "Architecturen"; + case VhdlDocGen::ATTRIBUTE: + if (single) return "Attribuut"; + else return "Attributen"; + case VhdlDocGen::PROCESS: + if (single) return "Proces"; + else return "Processen"; + case VhdlDocGen::PORT: + if (single) return "Poort"; + else return "Porten"; + case VhdlDocGen::USE: + if (single) return "gebruiks clausule"; + else return "Gebruiks Clausules"; + case VhdlDocGen::GENERIC: + if (single) return "Algemeen"; + else return "Algemene"; + case VhdlDocGen::PACKAGE_BODY: + return "Package Body"; + case VhdlDocGen::UNITS: + return "Eenheden"; + case VhdlDocGen::SHAREDVARIABLE: + if (single) return "Gedeelde Variable"; + else return "Gedeelde Variablen"; + case VhdlDocGen::VFILE: + if (single) return "Bestand"; + else return "Bestanden"; + case VhdlDocGen::GROUP: + if (single) return "Groep"; + else return "Groepen"; + case VhdlDocGen::INSTANTIATION: + if (single) return "Instantiëring"; + else return "Instantiëringen"; + case VhdlDocGen::ALIAS: + if (single) return "Alias"; + else return "Aliases"; + case VhdlDocGen::CONFIG: + if (single) return "Configuratie"; + else return "Configuraties"; + case VhdlDocGen::MISCELLANEOUS: + return "Diverse"; + case VhdlDocGen::UCF_CONST: + return "Limiteringen"; + default: + return "Klasse"; + } + } + 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ë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ë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_no.h b/src/translator_no.h index 58b596a..eccd952 100644 --- a/src/translator_no.h +++ b/src/translator_no.h @@ -72,8 +72,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6 virtual QCString latexLanguageSupportCommand() { return - "\\usepackage[norwegian]{babel}\n" - "\\usepackage[T1]{fontenc}\n"; + "\\usepackage[norsk]{babel}\n"; } // --- Language translation methods ------------------- diff --git a/src/translator_pl.h b/src/translator_pl.h index 421f407..e0ecc8f 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -44,8 +44,14 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2 */ QCString latexLanguageSupportCommand() { - return "\\usepackage{polski}\n" - "\\usepackage[T1]{fontenc}\n"; + return "\\usepackage[polish]{babel}\n" + "\\let\\lll\\undefined\n"; /* to overcome problems with the <<< + symbol as defined in the amssymb + package, and the Polish symbol + "Latin Small Letter L With Stroke" + ł or ł or ł + We take the amssymb symbol as leading. + */ } // --- Language translation methods ------------------- diff --git a/src/translator_pt.h b/src/translator_pt.h index c58bf64..23faf7f 100644 --- a/src/translator_pt.h +++ b/src/translator_pt.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (C) 1997-2015 by Dimitri van Heesch. + * 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 @@ -10,9 +10,9 @@ * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - * Portuguese translation version 20110428 + * Portuguese translation version * Maintainer (from 04/28/2011): - * Fabio "FJTC" Jun Takada Chino <jun-chino at uol.com.br> + * Fabio "FJTC" Jun Takada Chino <fjtc at brokenbits dot com dot br> * Maintainer (until 04/28/2011): * Rui Godinho Lopes <rui at ruilopes.com> * @@ -24,6 +24,8 @@ * VERSION HISTORY * --------------- * History: + * 20180612: + * - Updated to 1.8.15; * 20131129: * - Updated to 1.8.5; * - Translation in the method trFileMembers() fixed; @@ -55,7 +57,7 @@ #define TRANSLATOR_PT_H -class TranslatorPortuguese : public Translator +class TranslatorPortuguese : public TranslatorAdapter_1_8_15 { public: @@ -85,7 +87,10 @@ class TranslatorPortuguese : public Translator * the empty string is returned in this implementation. */ virtual QCString latexLanguageSupportCommand() - { return "Portuguese"; } + { + return + "\\usepackage[portuges]{babel}\n"; + } // --- Language translation methods ------------------- @@ -2016,7 +2021,124 @@ class TranslatorPortuguese : public Translator return result; } -////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + // new since 1.8.15 + ////////////////////////////////////////////////////////////////////////// + + /** VHDL design unit hierarchy */ + virtual QCString trDesignUnitHierarchy() + { return "Hierarquia da Unidade de Design"; } + /** VHDL design unit list */ + virtual QCString trDesignUnitList() + { return "Lista de Unidades de Design"; } + /** VHDL design unit members */ + virtual QCString trDesignUnitMembers() + { return "Membros da Unidade de Design"; } + /** VHDL design unit list description */ + virtual QCString trDesignUnitListDescription() + { + return "Esta é uma lista de todos os membros de unidades de design " + "com ligações para as entidades às quais pertencem:"; + } + /** VHDL design unit index */ + virtual QCString trDesignUnitIndex() + { return "Índice de Unidades de Design"; } + /** VHDL design units */ + virtual QCString trDesignUnits() + { return "Unidades de Design"; } + /** VHDL functions/procedures/processes */ + virtual QCString trFunctionAndProc() + { return "Funções/Procedimentos/Processos"; } + /** VHDL type */ + virtual QCString trVhdlType(uint64 type,bool single) + { + switch(type) + { + case VhdlDocGen::LIBRARY: + if (single) return "Biblioteca"; + else return "Bibliotecas"; + case VhdlDocGen::PACKAGE: + if (single) return "Pacote"; + else return "Pacotes"; + case VhdlDocGen::SIGNAL: + if (single) return "Sinal"; + else return "Sinais"; + 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 "Entidade"; + 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 "Função"; + else return "Funções"; + case VhdlDocGen::RECORD: + if (single) return "Registro"; + else return "Registros"; + case VhdlDocGen::PROCEDURE: + if (single) return "Procedimento"; + else return "Procedimentos"; + case VhdlDocGen::ARCHITECTURE: + if (single) return "Arquitetura"; + else return "Arquiteturas"; + case VhdlDocGen::ATTRIBUTE: + if (single) return "Atributo"; + else return "Atributos"; + case VhdlDocGen::PROCESS: + if (single) return "Processo"; + else return "Processos"; + case VhdlDocGen::PORT: + if (single) return "Porta"; + else return "Portas"; + case VhdlDocGen::USE: + if (single) return "cláusula de uso"; + else return "cláusulas de uso"; + case VhdlDocGen::GENERIC: + if (single) return "Generico"; + else return "Genericos"; + case VhdlDocGen::PACKAGE_BODY: + return "Corpo do Pacote"; + case VhdlDocGen::UNITS: + return "Unidades"; + case VhdlDocGen::SHAREDVARIABLE: + if (single) return "Variável Compartilhada"; + else return "Variáveis Compartilhadas"; + case VhdlDocGen::VFILE: + if (single) return "Ficheiro"; + else return "Ficheiros"; + case VhdlDocGen::GROUP: + if (single) return "Grupo"; + else return "Grupos"; + case VhdlDocGen::INSTANTIATION: + if (single) return "Instância"; + else return "Instâncias"; + case VhdlDocGen::ALIAS: + if (single) return "Apelido"; + else return "Apelidos"; + case VhdlDocGen::CONFIG: + if (single) return "Configuração"; + else return "Configurações"; + case VhdlDocGen::MISCELLANEOUS: + return "Outros"; // Is this correct for VHDL? + case VhdlDocGen::UCF_CONST: + return "Restrições"; + default: + return "Classe"; + } + } + virtual QCString trCustomReference(const char *name) + { return "Referência de " + QCString(name); } + + ////////////////////////////////////////////////////////////////////////// }; #endif diff --git a/src/translator_ro.h b/src/translator_ro.h index 661578b..6f0c197 100644 --- a/src/translator_ro.h +++ b/src/translator_ro.h @@ -42,7 +42,7 @@ #define TRANSLATOR_RO_H -class TranslatorRomanian : public Translator +class TranslatorRomanian : public TranslatorAdapter_1_8_15 { public: diff --git a/src/translator_ru.h b/src/translator_ru.h index 54c0202..9d92888 100644 --- a/src/translator_ru.h +++ b/src/translator_ru.h @@ -26,7 +26,7 @@ #ifndef TRANSLATOR_RU_H #define TRANSLATOR_RU_H -class TranslatorRussian : public Translator +class TranslatorRussian : public TranslatorAdapter_1_8_15 { public: /*! Used for identification of the language. */ diff --git a/src/translator_sc.h b/src/translator_sc.h index d2b3954..e8191df 100644 --- a/src/translator_sc.h +++ b/src/translator_sc.h @@ -71,6 +71,11 @@ class TranslatorSerbianCyrillic : public TranslatorAdapter_1_6_0 */ virtual QCString latexLanguageSupportCommand() { + return "\\usepackage[T2A]{fontenc}\n" + "\\usepackage[russian]{babel}\n"; + } + virtual QCString latexFontenc() + { return ""; } diff --git a/src/translator_si.h b/src/translator_si.h index 792053e..2dd7e5b 100644 --- a/src/translator_si.h +++ b/src/translator_si.h @@ -36,7 +36,7 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6 */ QCString latexLanguageSupportCommand() { - return "\\usepackage[slovene]{babel}\n\\usepackage[T1]{fontenc}\n"; + return "\\usepackage[slovene]{babel}\n"; } QCString trRelatedFunctions() { return "Povezane funkcije"; } diff --git a/src/translator_sk.h b/src/translator_sk.h index 3a925ec..9ee8252 100644 --- a/src/translator_sk.h +++ b/src/translator_sk.h @@ -32,7 +32,7 @@ #ifndef TRANSLATOR_SK_H #define TRANSLATOR_SK_H -class TranslatorSlovak : public Translator +class TranslatorSlovak : public TranslatorAdapter_1_8_15 { public: // --- Language control methods ------------------- @@ -41,8 +41,14 @@ class TranslatorSlovak : public Translator { return "slovak"; } virtual QCString latexLanguageSupportCommand() - { return "\\usepackage[slovak]{babel}\n"; } - + { return "\\usepackage[slovak]{babel}\n" + "\\usepackage{regexpatch}\n" + "\\makeatletter\n" + "% Change the `-` delimiter to an active character\n" + "\\xpatchparametertext\\@@@cmidrule{-}{\\cA-}{}{}\n" + "\\xpatchparametertext\\@cline{-}{\\cA-}{}{}\n" + "\\makeatother\n"; + } // --- Language translation methods ------------------- /*! used in the compound documentation before a list of related functions. */ diff --git a/src/translator_sv.h b/src/translator_sv.h index 88fffd9..5da89df 100644 --- a/src/translator_sv.h +++ b/src/translator_sv.h @@ -120,7 +120,7 @@ Problem! #ifndef TRANSLATOR_SE_H #define TRANSLATOR_SE_H -class TranslatorSwedish : public Translator +class TranslatorSwedish : public TranslatorAdapter_1_8_15 { public: diff --git a/src/translator_tw.h b/src/translator_tw.h index 26a6db6..9e9092d 100644 --- a/src/translator_tw.h +++ b/src/translator_tw.h @@ -41,7 +41,7 @@ // Translator class (by the local maintainer) when the localized // translator is made up-to-date again. -class TranslatorChinesetraditional : public Translator +class TranslatorChinesetraditional : public TranslatorAdapter_1_8_15 { public: @@ -72,8 +72,20 @@ class TranslatorChinesetraditional : public Translator */ virtual QCString latexLanguageSupportCommand() { + return "\\usepackage{CJKutf8}\n"; + } + virtual QCString latexFontenc() + { return ""; } + virtual QCString latexDocumentPre() + { + return "\\begin{CJK}{UTF8}{min}\n"; + } + virtual QCString latexDocumentPost() + { + return "\\end{CJK}\n"; + } // --- Language translation methods ------------------- diff --git a/src/translator_vi.h b/src/translator_vi.h index a0046b0..b391b0c 100644 --- a/src/translator_vi.h +++ b/src/translator_vi.h @@ -78,9 +78,23 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0 */ virtual QCString latexLanguageSupportCommand() { + return + "\\usepackage[vietnamese]{babel}\n"; + } + virtual QCString latexFontenc() + { return ""; } - + virtual QCString latexCommandName() + { + QCString latex_command = Config_getString(LATEX_CMD_NAME); + if (latex_command.isEmpty()) latex_command = "latex"; + if (Config_getBool(USE_PDFLATEX)) + { + if (latex_command == "latex") latex_command = "xelatex"; + } + return latex_command; + } // --- Language translation methods ------------------- /*! used in the compound documentation before a list of related functions. */ diff --git a/src/types.h b/src/types.h index 806e6fc..4d305b6 100644 --- a/src/types.h +++ b/src/types.h @@ -16,6 +16,7 @@ #ifndef TYPES_H #define TYPES_H +#include <string.h> #include <qcstring.h> /** @file @@ -55,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 */ @@ -191,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, @@ -209,6 +216,8 @@ enum MemberType MemberType_Event, MemberType_Interface, MemberType_Service, + MemberType_Sequence, + MemberType_Dictionary }; enum FortranFormat @@ -218,4 +227,56 @@ enum FortranFormat FortranFormat_Fixed }; +class LocalToc +{ + public: + enum Type { + None = 0, // initial value + Html = 0, // index / also to be used as bit position in mask (1 << Html) + Latex = 1, // ... + Xml = 2, // ... + Docbook = 3, // ... + numTocTypes = 4 // number of enum values + }; + LocalToc() : m_mask(None) { memset(m_level,0,sizeof(m_level)); } + + // setters + void enableHtml(int level) + { + m_mask|=(1<<Html); + m_level[Html]=level; + } + void enableLatex(int level) + { + m_mask|=(1<<Latex); + m_level[Latex]=level; + } + void enableXml(int level) + { + 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: + int m_mask; + int m_level[numTocTypes]; +}; + #endif diff --git a/src/util.cpp b/src/util.cpp index 7a4bd65..08c13fb 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -47,6 +47,7 @@ #include "searchindex.h" #include "doxygen.h" #include "textdocvisitor.h" +#include "latexdocvisitor.h" #include "portable.h" #include "parserintf.h" #include "bufstr.h" @@ -250,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(); @@ -322,7 +324,6 @@ int guessSection(const char *name) n.right(4)==".c++" || n.right(5)==".java" || n.right(2)==".m" || - n.right(2)==".M" || n.right(3)==".mm" || n.right(3)==".ii" || // inline n.right(4)==".ixx" || @@ -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; } @@ -1781,7 +1783,7 @@ QCString removeRedundantWhiteSpace(const QCString &s) pc = c; i++; c = src[i]; - *dst+=c; + *dst++=c; } else if (c=='"') { @@ -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++=' '; @@ -1855,7 +1857,11 @@ QCString removeRedundantWhiteSpace(const QCString &s) case '&': if (i>0 && isId(pc)) { - *dst++=' '; + if (nc != '=') + // avoid splitting operator&= + { + *dst++=' '; + } } *dst++=c; break; @@ -1889,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: @@ -2211,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); @@ -2587,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; } } @@ -2661,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()) { @@ -4190,7 +4204,7 @@ bool getDefs(const QCString &scName, //} } } - //printf(" >Succes=%d\n",mdist<maxInheritanceDepth); + //printf(" >Success=%d\n",mdist<maxInheritanceDepth); if (mdist<maxInheritanceDepth) { if (!md->isLinkable() || md->isStrongEnumValue()) @@ -4600,7 +4614,7 @@ bool resolveRef(/* in */ const char *scName, QCString fullName = substitute(tsName,"#","::"); if (fullName.find("anonymous_namespace{")==-1) { - fullName = removeRedundantWhiteSpace(substitute(fullName,".","::")); + fullName = removeRedundantWhiteSpace(substitute(fullName,".","::",3)); } else { @@ -4773,7 +4787,7 @@ QCString linkToText(SrcLangExt lang,const char *link,bool isFileName) // replace # by :: result=substitute(result,"#","::"); // replace . by :: - if (!isFileName && result.find('<')==-1) result=substitute(result,".","::"); + if (!isFileName && result.find('<')==-1) result=substitute(result,".","::",3); // strip leading :: prefix if present if (result.at(0)==':' && result.at(1)==':') { @@ -5217,6 +5231,7 @@ QCString substitute(const QCString &s,const QCString &src,const QCString &dst) int l = (int)(q-p); memcpy(r,p,l); r+=l; + if (dst) memcpy(r,dst,dstLen); r+=dstLen; } @@ -5225,6 +5240,82 @@ QCString substitute(const QCString &s,const QCString &src,const QCString &dst) return result; } + +/// substitute all occurrences of \a src in \a s by \a dst, but skip +/// each consecutive sequence of \a src where the number consecutive +/// \a src matches \a skip_seq; if \a skip_seq is negative, skip any +/// number of consecutive \a src +QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq) +{ + if (s.isEmpty() || src.isEmpty()) return s; + const char *p, *q; + int srcLen = src.length(); + int dstLen = dst.length(); + int resLen; + if (srcLen!=dstLen) + { + int count; + for (count=0, p=s.data(); (q=strstr(p,src))!=0; p=q+srcLen) count++; + resLen = s.length()+count*(dstLen-srcLen); + } + else // result has same size as s + { + resLen = s.length(); + } + QCString result(resLen+1); + char *r; + for (r=result.rawData(), p=s; (q=strstr(p,src))!=0; p=q+srcLen) + { + // search a consecutive sequence of src + int seq = 0, skip = 0; + if (skip_seq) + { + for (const char *n=q+srcLen; qstrncmp(n,src,srcLen)==0; seq=1+skip, n+=srcLen) + ++skip; // number of consecutive src after the current one + + // verify the allowed number of consecutive src to skip + if (skip_seq > 0 && skip_seq != seq) + seq = skip = 0; + } + + // skip a consecutive sequence of src when necessary + int l = (int)((q + seq * srcLen)-p); + memcpy(r,p,l); + r+=l; + + if (skip) + { + // skip only the consecutive src found after the current one + q += skip * srcLen; + // the next loop will skip the current src, aka (p=q+srcLen) + continue; + } + + if (dst) memcpy(r,dst,dstLen); + r+=dstLen; + } + qstrcpy(r,p); + result.resize(strlen(result.data())+1); + //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data()); + return result; +} + +/// substitute all occurrences of \a srcChar in \a s by \a dstChar +QCString substitute(const QCString &s,char srcChar,char dstChar) +{ + int l=s.length(); + QCString result(l+1); + char *q=result.rawData(); + if (l>0) + { + const char *p=s.data(); + char c; + while ((c=*p++)) *q++ = (c==srcChar) ? dstChar : c; + } + *q='\0'; + return result; +} + //---------------------------------------------------------------------- QCString substituteKeywords(const QCString &s,const char *title, @@ -5851,12 +5942,73 @@ 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("<"); break; + case '>': growBuf.addStr(">"); 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("&"); + } + else + { + growBuf.addStr(HtmlEntityMapper::instance()->docbook(res)); + q++; + p = q; + } + } + else + { + growBuf.addStr("&"); + } + break; + case '\'': growBuf.addStr("'"); break; + case '"': growBuf.addStr("""); break; + case '\007': growBuf.addStr("␇"); 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) { static GrowBuf growBuf; growBuf.clear(); if (s==0) return ""; + growBuf.addStr(getHtmlDirEmbedingChar(getTextDirByConfig(s))); const char *p=s; char c; while ((c=*p++)) @@ -5898,11 +6050,13 @@ QCString convertToHtml(const char *s,bool keepEntities) return growBuf.get(); } -QCString convertToJSString(const char *s) +QCString convertToJSString(const char *s, bool applyTextDir) { static GrowBuf growBuf; growBuf.clear(); if (s==0) return ""; + if (applyTextDir) + growBuf.addStr(getJsDirEmbedingChar(getTextDirByConfig(s))); const char *p=s; char c; while ((c=*p++)) @@ -6403,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))) { @@ -6492,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 { @@ -6657,10 +6813,26 @@ void filterLatexString(FTextStream &t,const char *str, { switch(c) { + case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 0xef 0xbf 0xbd + // the LaTeX command \ucr has been defined in doxygen.sty + if ((unsigned char)*(p) == 0xbf && (unsigned char)*(p+1) == 0xbd) + { + t << "{\\ucr}"; + p += 2; + } + else + t << (char)c; + break; case '\\': t << "\\(\\backslash\\)"; break; case '{': t << "\\{"; break; case '}': t << "\\}"; break; case '_': t << "\\_"; break; + case '&': t << "\\&"; break; + case '%': t << "\\%"; break; + case '#': t << "\\#"; break; + case '$': t << "\\$"; break; + case '^': (usedTableLevels()>0) ? t << "\\string^" : t << (char)c; break; + case '~': (usedTableLevels()>0) ? t << "\\string~" : t << (char)c; break; case ' ': if (keepSpaces) t << "~"; else t << ' '; break; default: @@ -6672,6 +6844,16 @@ void filterLatexString(FTextStream &t,const char *str, { switch(c) { + case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 0xef 0xbf 0xbd + // the LaTeX command \ucr has been defined in doxygen.sty + if ((unsigned char)*(p) == 0xbf && (unsigned char)*(p+1) == 0xbd) + { + t << "{\\ucr}"; + p += 2; + } + else + t << (char)c; + break; case '#': t << "\\#"; break; case '$': t << "\\$"; break; case '%': t << "\\%"; break; @@ -6755,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); @@ -6785,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); @@ -6823,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; } } @@ -6854,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) { @@ -7064,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 }, @@ -7169,6 +7371,7 @@ void initDefaultExtensionMapping() updateLanguageMapping(".qsf", "vhdl"); updateLanguageMapping(".md", "md"); updateLanguageMapping(".markdown", "md"); + updateLanguageMapping(".ice", "slice"); } void addCodeOnlyMappings() @@ -7320,23 +7523,23 @@ int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos) { if (((uchar)c&0xE0)==0xC0) { - bytes++; // 11xx.xxxx: >=2 byte character + bytes+=1; // 11xx.xxxx: >=2 byte character } if (((uchar)c&0xF0)==0xE0) { - bytes++; // 111x.xxxx: >=3 byte character + bytes+=2; // 111x.xxxx: >=3 byte character } if (((uchar)c&0xF8)==0xF0) { - bytes++; // 1111.xxxx: >=4 byte character + bytes+=3; // 1111.xxxx: >=4 byte character } if (((uchar)c&0xFC)==0xF8) { - bytes++; // 1111.1xxx: >=5 byte character + bytes+=4; // 1111.1xxx: >=5 byte character } if (((uchar)c&0xFE)==0xFC) { - bytes++; // 1111.1xxx: 6 byte character + bytes+=5; // 1111.1xxx: 6 byte character } } else if (c=='&') // skip over character entities @@ -7370,11 +7573,10 @@ QCString parseCommentAsText(const Definition *scope,const MemberDef *md, root->accept(visitor); delete visitor; delete root; - QCString result = convertCharEntitiesToUTF8(s.data()); + QCString result = convertCharEntitiesToUTF8(s.data()).stripWhiteSpace(); int i=0; int charCnt=0; int l=result.length(); - bool addEllipsis=FALSE; while ((i=nextUtf8CharPosition(result,l,i))<l) { charCnt++; @@ -7385,19 +7587,17 @@ QCString parseCommentAsText(const Definition *scope,const MemberDef *md, while ((i=nextUtf8CharPosition(result,l,i))<l && charCnt<100) { charCnt++; - if (result.at(i)>=0 && isspace(result.at(i))) - { - addEllipsis=TRUE; - } - else if (result.at(i)==',' || - result.at(i)=='.' || - result.at(i)=='?') + if (result.at(i)==',' || + result.at(i)=='.' || + result.at(i)=='!' || + result.at(i)=='?') { + i++; // we want to be "behind" last inspected character break; } } } - if (addEllipsis || charCnt==100) result=result.left(i)+"..."; + if ( i < l) result=result.left(i)+"..."; return result.data(); } @@ -7842,8 +8042,8 @@ bool readInputFile(const char *fileName,BufStr &inBuf,bool filter,bool isSourceC int start=0; if (size>=2 && - ((inBuf.at(0)==-1 && inBuf.at(1)==-2) || // Litte endian BOM - (inBuf.at(0)==-2 && inBuf.at(1)==-1) // big endian BOM + (((uchar)inBuf.at(0)==0xFF && (uchar)inBuf.at(1)==0xFE) || // Little endian BOM + ((uchar)inBuf.at(0)==0xFE && (uchar)inBuf.at(1)==0xFF) // big endian BOM ) ) // UCS-2 encoded file { @@ -8006,7 +8206,7 @@ QCString externalRef(const QCString &relPath,const QCString &ref,bool href) return result; } -/** Writes the intensity only bitmap representated by \a data as an image to +/** Writes the intensity only bitmap represented by \a data as an image to * directory \a dir using the colors defined by HTML_COLORSTYLE_*. */ void writeColoredImgData(const char *dir,ColoredImgDataItem data[]) @@ -8205,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"; } @@ -8336,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() ) { @@ -8357,7 +8555,7 @@ void addDocCrossReference(MemberDef *src,MemberDef *dst) mdDecl->addSourceReferencedBy(src); } } - if ((referencesRelation || src->hasCallGraph()) && + if ((src->hasReferencesRelation() || src->hasCallGraph()) && src->showInCallGraph() ) { @@ -8444,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()) { @@ -8456,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; + } } } } @@ -8759,3 +8977,49 @@ void writeExtraLatexPackages(FTextStream &t) } } +void writeLatexSpecialFormulaChars(FTextStream &t) +{ + unsigned char minus[4]; // Superscript minus + char *pminus = (char *)minus; + unsigned char sup2[3]; // Superscript two + char *psup2 = (char *)sup2; + unsigned char sup3[3]; + char *psup3 = (char *)sup3; // Superscript three + minus[0]= 0xE2; + minus[1]= 0x81; + minus[2]= 0xBB; + minus[3]= 0; + sup2[0]= 0xC2; + sup2[1]= 0xB2; + sup2[2]= 0; + sup3[0]= 0xC2; + sup3[1]= 0xB3; + sup3[2]= 0; + + t << "\\usepackage{newunicodechar}\n" + " \\newunicodechar{" << pminus << "}{${}^{-}$}% Superscript minus\n" + " \\newunicodechar{" << psup2 << "}{${}^{2}$}% Superscript two\n" + " \\newunicodechar{" << psup3 << "}{${}^{3}$}% Superscript three\n" + "\n"; +} + +//------------------------------------------------------ + +static int g_usedTableLevels = 0; + +void incUsedTableLevels() +{ + g_usedTableLevels++; +} +void decUsedTableLevels() +{ + g_usedTableLevels--; +} +int usedTableLevels() +{ + return g_usedTableLevels; +} + +//------------------------------------------------------ + + @@ -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. */ @@ -27,6 +27,7 @@ #include "types.h" #include "sortdict.h" #include "docparser.h" +#include "classdef.h" //-------------------------------------------------------------------- @@ -70,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. */ @@ -139,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, @@ -194,6 +195,8 @@ void mergeArguments(ArgumentList *,ArgumentList *,bool forceNameOverwrite=FALSE) QCString substituteClassNames(const QCString &s); QCString substitute(const QCString &s,const QCString &src,const QCString &dst); +QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq); +QCString substitute(const QCString &s,char srcChar,char dstChar); QCString clearBlock(const char *s,const char *begin,const char *end); @@ -259,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); @@ -283,7 +286,9 @@ QCString convertToLaTeX(const QCString &s,bool insideTabbing=FALSE,bool keepSpac QCString convertToXML(const char *s); -QCString convertToJSString(const char *s); +QCString convertToDocBook(const char *s); + +QCString convertToJSString(const char *s, bool applyTextDir = true); QCString getOverloadDocs(); @@ -342,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); @@ -388,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); @@ -477,6 +483,10 @@ void convertProtectionLevel( bool mainPageHasTitle(); bool openOutputFile(const char *outFile,QFile &f); void writeExtraLatexPackages(FTextStream &t); +void writeLatexSpecialFormulaChars(FTextStream &t); -#endif +int usedTableLevels(); +void incUsedTableLevels(); +void decUsedTableLevels(); +#endif diff --git a/src/vhdlcode.l b/src/vhdlcode.l index ce1f92b..aa15183 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -31,7 +31,7 @@ #include <ctype.h> #include <qregexp.h> #include <qdir.h> -#include <qstringlist.h> +#include <qcstringlist.h> #include "entry.h" #include "doxygen.h" @@ -94,7 +94,7 @@ static QCString g_exampleFile; static QCString g_classScope; -static QCString g_CurrScope; +static bool g_CurrARCH = FALSE; static FileDef * g_sourceFileDef; static Definition * g_currentDefinition; @@ -109,7 +109,7 @@ static int g_braceCount=0; static void writeFont(const char *s,const char* text); static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName); static bool writeColoredWord(QCString& word ); -static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool typeOnly=FALSE); +static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool typeOnly=FALSE, const char *curr_class=0); static void endFontClass(); static void startFontClass(const char *s); //------------------------------------------------------------------- @@ -138,8 +138,8 @@ static bool checkVhdlString(QCString &name) int len=name.length(); if (name.at(0)=='"' && name.at(len-1)=='"' && len > 2) { - QStringList qrl=QStringList::split(regg,name,FALSE); - if (VhdlDocGen::isNumber(qrl[0].utf8())) + QCStringList qrl=QCStringList::split(regg,name); + if (VhdlDocGen::isNumber(qrl[0])) { g_code->codify("\""); startFontClass("vhdllogic"); @@ -291,7 +291,7 @@ static void writeWord(const char *word,const char* curr_class=0,bool classLink=F } else { - generateClassOrGlobalLink(*g_code,temp); + generateClassOrGlobalLink(*g_code,temp,FALSE,curr_class); } } else @@ -328,7 +328,7 @@ static void writeWord(const char *word,const char* curr_class=0,bool classLink=F } else { - generateClassOrGlobalLink(*g_code,temp); + generateClassOrGlobalLink(*g_code,temp,FALSE,curr_class); } } else @@ -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,9 +381,9 @@ 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); + writeWord(sp,cl,classlink); done=TRUE; } } @@ -510,7 +510,7 @@ static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& m }// generateMemLink -static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool /*typeOnly*/) +static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool /*typeOnly*/, const char *curr_class) { QCString className=clName; @@ -521,6 +521,11 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName //bool isLocal=FALSE; className.stripPrefix("_"); cd = getClass(className.data()); + if (!cd && curr_class) + { + if (QCString(curr_class).contains(QRegExp("::"+QCString(clName)+"$"))) cd = getClass(curr_class); + } + while (cd) { //className.stripPrefix("_"); @@ -686,8 +691,8 @@ static void writeFuncProto() codifyLines(g_FuncProto.data(),g_CurrClass.data()); return; } - QStringList qlist=QStringList::split(name,g_FuncProto,FALSE); - QCString temp=qlist[0].utf8(); + QCStringList qlist=QCStringList::split(name,g_FuncProto); + QCString temp=qlist[0]; codifyLines(temp.data(),g_CurrClass.data()); g_FuncProto.stripPrefix(temp.data()); temp.resize(0); @@ -759,7 +764,7 @@ DIGITSS [0-9]+|[0-9]+("#")*[0-9_a-fA-F\+\.\-]+("#")* ALLTYPESMAP {B}*[_a-zA-Z0-9. ]+{BN}* ALLTYPESMAP1 {BN}*[_a-zA-Z0-9.() ]+{BN}* -ARCHITECTURE ^{B}*("architecture"){BN}+{FUNCNAME}{BN}+("of"){BN}+{FUNCNAME} +ARCHITECTURE ^{B}*("architecture"){BN}+{FUNCNAME}{BN}+("of"){BN}+{FUNCNAME}{BN}+("is") PROCESS ({BN}*{FUNCNAME}{BN}*[:]+{BN}*("process"){BN}*[(]*)|[^a-zA-Z]("process "|"process("){BN}*[ (]*|[^a-zA-Z]("process"){BN}+ END1 {B}*("end "){BN}+("if"|"case"|"loop"|"generate"|"for") @@ -768,7 +773,7 @@ END3 {BN}*[^a-zA-Z]("end"){BN}+{FUNCNAME}{BN}*[;] END4 {B}*("end"){BN}+"function"{BN}+{FUNCNAME}{BN}*[;] ENDEFUNC {END3}|{END4}|{END2} -KEYWORD ("new"|"event"|"break"|"case"|"end"|"loop"|"else"|"for"|"goto"|"if"|"return"|"generate"|"is"|"while"|"in") +KEYWORD ("of"|"new"|"event"|"break"|"case"|"end"|"loop"|"else"|"for"|"goto"|"if"|"return"|"generate"|"is"|"while"|"in") TYPEKW ^{B}*("type"|"subtype"|"constant"|"attribute"|"signal"|"variable","alias","configuration") FUNC ^{B}*("function"|"procedure"){BN}*{FUNCNAME}{BN}*("(") @@ -807,6 +812,7 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI %x ClassVar %x ClassesName %x Map +%x End %x Body %% @@ -825,11 +831,11 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI QCString tt(vhdlcodeYYtext); VhdlDocGen::deleteAllChars(tt,','); QRegExp r("=>"); - QStringList ql=QStringList::split(r,tt,FALSE); + QCStringList ql=QCStringList::split(r,tt); if (ql.count()>=2) { unsigned int index=0; - QCString t1=ql[0].utf8(); + QCString t1=ql[0]; char cc=t1.at(index); while (cc==' ' || cc=='\t') { @@ -860,7 +866,7 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI } codifyLines("=>"); index=0; - QCString s2=ql[1].utf8(); + QCString s2=ql[1]; t1=s2; cc=t1.at(index); while (cc==' ' || cc=='\t') @@ -953,7 +959,7 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI tt=tt.lower(); VhdlDocGen::deleteAllChars(tt,';'); tt.stripWhiteSpace(); - QStringList ql=QStringList::split(regg,tt,FALSE); + QCStringList ql=QCStringList::split(regg,tt); int index=ql.findIndex(QCString("if"))+1; index+=ql.findIndex(QCString("case"))+1; index+=ql.findIndex(QCString("loop"))+1; @@ -1058,14 +1064,7 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI g_CurrClass.append(vhdlcodeYYtext); g_CurrClass=g_CurrClass.stripWhiteSpace(); - if (!writeColoredWord(g_CurrScope)) - { - generateClassOrGlobalLink(*g_code,vhdlcodeYYtext); - } - else - { - codifyLines(vhdlcodeYYtext,g_CurrClass.data()); - } + generateClassOrGlobalLink(*g_code,vhdlcodeYYtext); BEGIN(Bases); } @@ -1169,13 +1168,12 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI <ParsePackage>[^:;]* { //found package QCString temp(vhdlcodeYYtext); - QStringList strl=QStringList::split(".",temp,FALSE); - + QCStringList strl=QCStringList::split(".",temp); if (strl.count()>2) { - QCString s1=strl[0].utf8(); - QCString s2=strl[1].utf8(); - QCString s3=strl[2].utf8(); + QCString s1=strl[0]; + QCString s2=strl[1]; + QCString s3=strl[2]; s1.append("."); s3.prepend("."); codifyLines(s1.data(),g_CurrClass.data()); @@ -1284,6 +1282,7 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI //temp+=("-"); //temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,3); QCString temp = VhdlDocGen::getIndexWord(vhdlcodeYYtext,3); + g_CurrARCH = TRUE; temp+="::"; temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1); g_CurrClass=temp; @@ -1291,15 +1290,14 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI codifyLines(vhdlcodeYYtext,temp.data(),TRUE); //generateClassOrGlobalLink(*g_code,temp.data()); isPackageBody=FALSE; - BEGIN(ClassName); } <Bases>^{B}*("package "){BN}*("body"){BN}*{FUNCNAME} { // found package body QCString ss(vhdlcodeYYtext); QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,2); - QStringList ql=QStringList::split(temp,ss,FALSE); - QCString ll=ql[0].utf8(); + QCStringList ql=QCStringList::split(temp,ss); + QCString ll=ql[0]; codifyLines(ll.data(),g_CurrClass.data()); temp=temp.stripWhiteSpace(); temp.prepend("_"); @@ -1371,6 +1369,41 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI } +<Bases>"end"{BN}+"architecture"{BN}+{FUNCNAME} { + codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE); + g_CurrARCH = FALSE; + } +<Bases>"end"{BN}+{FUNCNAME} { + if (g_CurrARCH) + { + codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE); + g_CurrARCH = FALSE; + } + else + REJECT; + } +<Bases>"end" { + appStringLower(g_PrevString,vhdlcodeYYtext); + QCString temp(vhdlcodeYYtext); + temp=temp.stripWhiteSpace(); + + writeColoredWord(temp); + BEGIN(End); + } +<End>{ID} { + appStringLower(g_PrevString,vhdlcodeYYtext); + QCString temp(vhdlcodeYYtext); + temp=temp.stripWhiteSpace(); + + if (!writeColoredWord(temp)) + { + generateClassOrGlobalLink(*g_code,temp.data()); + } + } +<End>";" { + codifyLines(vhdlcodeYYtext); + BEGIN(Bases); + } <Bases>{KEYWORD} { // found keyword QCString qcs(vhdlcodeYYtext); if (!writeColoredWord(qcs)) @@ -1445,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); } @@ -1464,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 dcf7f42..b18bd3f 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -26,7 +26,7 @@ #include <string.h> #include <qcstring.h> #include <qfileinfo.h> -#include <qstringlist.h> +#include <qcstringlist.h> #include <qmap.h> /* --------------------------------------------------------------- */ @@ -61,7 +61,7 @@ #include "vhdlcode.h" #include "plantuml.h" //#define DEBUGFLOW -#define theTranslator_vhdlType VhdlDocGen::trVhdlType +#define theTranslator_vhdlType theTranslator->trVhdlType static QDict<QCString> g_vhdlKeyDict0(17,FALSE); static QDict<QCString> g_vhdlKeyDict1(17,FALSE); @@ -299,10 +299,10 @@ static QCString formatBriefNote(const QCString &brief,ClassDef * cd) int k=cd->briefLine(); - QStringList qsl=QStringList::split(ep,brief); + QCStringList qsl=QCStringList::split(ep,brief); for(uint j=0;j<qsl.count();j++) { - QCString qcs=qsl[j].data(); + QCString qcs=qsl[j]; vForm+=parseCommentAsText(cd,NULL,qcs,file,k); k++; vForm+='\n'; @@ -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"); @@ -968,7 +968,6 @@ QCString VhdlDocGen::getClassTitle(const ClassDef *cd) int ii=cd->protection(); pageTitle+=" "; pageTitle+=theTranslator_vhdlType(ii+2,TRUE); - pageTitle+=" "; return pageTitle; } // getClassTitle @@ -1029,8 +1028,8 @@ void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol) } else if (ii==VhdlDocGen::ARCHITECTURE) { - QStringList qlist=QStringList::split("-",nn,FALSE); - nn=qlist[1].utf8(); + QCStringList qlist=QCStringList::split("-",nn); + nn=qlist[1]; cd=VhdlDocGen::getClass(nn.data()); } @@ -1042,9 +1041,9 @@ void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol) for (int i=0;i<j;i++) { QCString *temp=ql.at(i); - QStringList qlist=QStringList::split("-",*temp,FALSE); - QCString s1=qlist[0].utf8(); - QCString s2=qlist[1].utf8(); + QCStringList qlist=QCStringList::split("-",*temp); + QCString s1=qlist[0]; + QCString s2=qlist[1]; s1.stripPrefix("_"); if (j==1) s1.resize(0); ClassDef*cc = getClass(temp->data()); @@ -1076,8 +1075,8 @@ void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd) QCString jj=citer->className(); if (cd != citer && jj.contains('-')!=-1) { - QStringList ql=QStringList::split("-",jj,FALSE); - QCString temp=ql[1].utf8(); + QCStringList ql=QCStringList::split("-",jj); + QCString temp=ql[1]; if (qstricmp(cd->className(),temp)==0) { QCString *cl=new QCString(jj); @@ -1096,10 +1095,10 @@ ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd) for ( ; (citer=cli.current()) ; ++cli ) { QCString jj=citer->name(); - QStringList ql=QStringList::split(":",jj,FALSE); + QCStringList ql=QCStringList::split(":",jj); if (ql.count()>1) { - if (ql[0].utf8()==nn ) + if (ql[0]==nn ) { return citer; } @@ -1212,15 +1211,15 @@ void VhdlDocGen::parseFuncProto(const char* text,QList<Argument>& qlist, QCString VhdlDocGen::getIndexWord(const char* c,int index) { - QStringList ql; + QCStringList ql; QCString temp(c); QRegExp reg("[\\s:|]"); - ql=QStringList::split(reg,temp,FALSE); + ql=QCStringList::split(reg,temp); if (ql.count() > (unsigned int)index) { - return ql[index].utf8(); + return ql[index]; } return ""; @@ -1241,42 +1240,6 @@ QCString VhdlDocGen::getProtectionName(int prot) return ""; } -QCString VhdlDocGen::trTypeString(uint64 type) -{ - switch(type) - { - case VhdlDocGen::LIBRARY: return "Library"; - case VhdlDocGen::ENTITY: return "Entity"; - case VhdlDocGen::PACKAGE_BODY: return "Package Body"; - case VhdlDocGen::ATTRIBUTE: return "Attribute"; - case VhdlDocGen::PACKAGE: return "Package"; - case VhdlDocGen::SIGNAL: return "Signal"; - case VhdlDocGen::COMPONENT: return "Component"; - case VhdlDocGen::CONSTANT: return "Constant"; - case VhdlDocGen::TYPE: return "Type"; - case VhdlDocGen::SUBTYPE: return "Subtype"; - case VhdlDocGen::FUNCTION: return "Function"; - case VhdlDocGen::RECORD: return "Record"; - case VhdlDocGen::PROCEDURE: return "Procedure"; - case VhdlDocGen::ARCHITECTURE: return "Architecture"; - case VhdlDocGen::USE: return "Package"; - case VhdlDocGen::PROCESS: return "Process"; - case VhdlDocGen::PORT: return "Port"; - case VhdlDocGen::GENERIC: return "Generic"; - case VhdlDocGen::UNITS: return "Units"; - //case VhdlDocGen::PORTMAP: return "Port Map"; - case VhdlDocGen::SHAREDVARIABLE: return "Shared Variable"; - case VhdlDocGen::GROUP: return "Group"; - case VhdlDocGen::VFILE: return "File"; - case VhdlDocGen::INSTANTIATION: return "Instantiation"; - case VhdlDocGen::ALIAS: return "Alias"; - case VhdlDocGen::CONFIG: return "Configuration"; - case VhdlDocGen::MISCELLANEOUS: return "Miscellaneous"; - case VhdlDocGen::UCF_CONST: return "Constraints"; - default: return ""; - } -} // convertType - /*! * deletes a char backwards in a string */ @@ -1790,7 +1753,7 @@ void VhdlDocGen::writeVhdlDeclarations(MemberList* ml, VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::GROUP,FALSE),0,FALSE,VhdlDocGen::GROUP); VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::INSTANTIATION,FALSE),0,FALSE,VhdlDocGen::INSTANTIATION); VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::ALIAS,FALSE),0,FALSE,VhdlDocGen::ALIAS); - VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::MISCELLANEOUS),0,FALSE,VhdlDocGen::MISCELLANEOUS); + VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::MISCELLANEOUS,TRUE),0,FALSE,VhdlDocGen::MISCELLANEOUS); // configurations must be added to global file definitions. VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::CONFIG,FALSE),0,FALSE,VhdlDocGen::CONFIG); @@ -2096,19 +2059,21 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, writeLink(mdef,ol); ol.docify(" "); - ol.insertMemberAlign(); if (mm==VhdlDocGen::GENERIC) { + ol.insertMemberAlign(); ol.startBold(); VhdlDocGen::formatString(largs,ol,mdef); ol.endBold(); } else { + ol.insertMemberAlignLeft(isAnonymous, false); ol.docify(" "); ol.startBold(); VhdlDocGen::formatString(ltype,ol,mdef); ol.endBold(); + ol.insertMemberAlign(); ol.docify(" "); VhdlDocGen::formatString(largs,ol,mdef); } @@ -2263,11 +2228,11 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.endMemberItem(); if (!mdef->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC) /* && !annMemb */) { - QCString s=mdef->briefDescription(); - ol.startMemberDescription(mdef->anchor()); + QCString s=mdef->briefDescription(); + ol.startMemberDescription(mdef->anchor(), NULL, mm == VhdlDocGen::PORT); ol.generateDoc(mdef->briefFile(),mdef->briefLine(), - mdef->getOuterScope()?mdef->getOuterScope():d, - mdef,s.data(),TRUE,FALSE,0,TRUE,FALSE); + mdef->getOuterScope()?mdef->getOuterScope():d, + mdef,s.data(),TRUE,FALSE,0,TRUE,FALSE); if (detailsVisible) { ol.pushGeneratorState(); @@ -2364,7 +2329,7 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol, if (title) { - ol.startMemberHeader(title); + ol.startMemberHeader(convertToId(title),type == VhdlDocGen::PORT ? 3 : 2); ol.parseText(title); ol.endMemberHeader(); ol.docify(" "); @@ -2416,7 +2381,7 @@ bool VhdlDocGen::writeClassType( ClassDef *& cd, OutputList &ol ,QCString & cname) { int id=cd->protection(); - QCString qcs = VhdlDocGen::trTypeString(id+2); + QCString qcs = theTranslator->trVhdlType(id+2,TRUE); cname=VhdlDocGen::getClassName(cd); ol.startBold(); ol.writeString(qcs.data()); @@ -2426,128 +2391,6 @@ bool VhdlDocGen::writeClassType( ClassDef *& cd, return FALSE; }// writeClassLink -QCString VhdlDocGen::trVhdlType(uint64 type,bool sing) -{ - switch(type) - { - case VhdlDocGen::LIBRARY: - if (sing) return "Library"; - else return "Libraries"; - case VhdlDocGen::PACKAGE: - if (sing) return "Package"; - else return "Packages"; - case VhdlDocGen::SIGNAL: - if (sing) return "Signal"; - else return "Signals"; - case VhdlDocGen::COMPONENT: - if (sing) return "Component"; - else return "Components"; - case VhdlDocGen::CONSTANT: - if (sing) return "Constant"; - else return "Constants"; - case VhdlDocGen::ENTITY: - if (sing) return "Entity"; - else return "Entities"; - case VhdlDocGen::TYPE: - if (sing) return "Type"; - else return "Types"; - case VhdlDocGen::SUBTYPE: - if (sing) return "Subtype"; - else return "Subtypes"; - case VhdlDocGen::FUNCTION: - if (sing) return "Function"; - else return "Functions"; - case VhdlDocGen::RECORD: - if (sing) return "Record"; - else return "Records"; - case VhdlDocGen::PROCEDURE: - if (sing) return "Procedure"; - else return "Procedures"; - case VhdlDocGen::ARCHITECTURE: - if (sing) return "Architecture"; - else return "Architectures"; - case VhdlDocGen::ATTRIBUTE: - if (sing) return "Attribute"; - else return "Attributes"; - case VhdlDocGen::PROCESS: - if (sing) return "Process"; - else return "Processes"; - case VhdlDocGen::PORT: - if (sing) return "Port"; - else return "Ports"; - case VhdlDocGen::USE: - if (sing) return "use clause"; - else return "Use Clauses"; - case VhdlDocGen::GENERIC: - if (sing) return "Generic"; - else return "Generics"; - case VhdlDocGen::PACKAGE_BODY: - return "Package Body"; - case VhdlDocGen::UNITS: - return "Units"; - case VhdlDocGen::SHAREDVARIABLE: - if (sing) return "Shared Variable"; - return "Shared Variables"; - case VhdlDocGen::VFILE: - if (sing) return "File"; - return "Files"; - case VhdlDocGen::GROUP: - if (sing) return "Group"; - return "Groups"; - case VhdlDocGen::INSTANTIATION: - if (sing) return "Instantiation"; - else return "Instantiations"; - case VhdlDocGen::ALIAS: - if (sing) return "Alias"; - return "Aliases"; - case VhdlDocGen::CONFIG: - if (sing) return "Configuration"; - return "Configurations"; - case VhdlDocGen::MISCELLANEOUS: - return "Miscellaneous"; - case VhdlDocGen::UCF_CONST: - return "Constraints"; - default: - return "Class"; - } -} - -QCString VhdlDocGen::trDesignUnitHierarchy() -{ - return "Design Unit Hierarchy"; -} - -QCString VhdlDocGen::trDesignUnitList() -{ - return "Design Unit List"; -} - -QCString VhdlDocGen::trDesignUnitMembers() -{ - return "Design Unit Members"; -} - -QCString VhdlDocGen::trDesignUnitListDescription() -{ - return "Here is a list of all design unit members with links to " - "the Entities they belong to:"; -} - -QCString VhdlDocGen::trDesignUnitIndex() -{ - return "Design Unit Index"; -} - -QCString VhdlDocGen::trDesignUnits() -{ - return "Design Units"; -} - -QCString VhdlDocGen::trFunctionAndProc() -{ - return "Functions/Procedures/Processes"; -} - /*! writes a link if the string is linkable else a formatted string */ @@ -2623,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); } @@ -2835,11 +2678,11 @@ QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch) if (!entity.contains(":")) return ""; QRegExp exp("[:()\\s]"); - QStringList ql=QStringList::split(exp,entity,FALSE); + QCStringList ql=QCStringList::split(exp,entity); //int ii=ql.findIndex(ent); assert(ql.count()>=2); - label = ql[0].utf8(); - entity = ql[1].utf8(); + label = ql[0]; + entity = ql[1]; if ((index=entity.findRev("."))>=0) { entity.remove(0,index+1); @@ -2847,8 +2690,8 @@ QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch) if (ql.count()==3) { - arch= ql[2].utf8(); - ql=QStringList::split(exp,arch,FALSE); + arch= ql[2]; + ql=QCStringList::split(exp,arch); if (ql.count()>1) // expression { arch=""; @@ -2865,16 +2708,16 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch) QRegExp exp("[()\\s]"); QCString label=""; - QStringList ql=QStringList::split(exp,entity,FALSE); + QCStringList ql=QCStringList::split(exp,entity); if (ql.contains("open")) { return "open"; } - label=ql[0].utf8(); + label=ql[0]; - entity = ql[1].utf8(); + entity = ql[1]; if ((index=entity.findRev("."))>=0) { entity.remove(0,index+1); @@ -2882,7 +2725,7 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch) if (ql.count()==3) { - arch=ql[2].utf8(); + arch=ql[2]; } return label; } @@ -3000,7 +2843,7 @@ void assignBinding(VhdlConfNode * conf) QCString inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower(); QCString comp=VhdlDocGen::getIndexWord(archy.data(),1).lower(); - QStringList ql=QStringList::split(",",inst1); + QCStringList ql=QCStringList::split(",",inst1); for (uint j=0;j<ql.count();j++) { @@ -3012,7 +2855,7 @@ void assignBinding(VhdlConfNode * conf) } else { - archy1=comp+":"+ql[j].utf8(); + archy1=comp+":"+ql[j]; sign1=cur->type+":"+cur->name; } @@ -3147,7 +2990,8 @@ ferr: Public, Normal, cur->stat,Member, MemberType_Variable, 0, - 0); + 0, + ""); if (ar->getOutputFileBase()) { @@ -3186,11 +3030,11 @@ ferr: void VhdlDocGen::writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef) { - QStringList ql=QStringList::split("#",largs,FALSE); + QCStringList ql=QCStringList::split("#",largs,FALSE); uint len=ql.count(); for(uint i=0;i<len;i++) { - QCString n=ql[i].utf8(); + QCString n=ql[i]; VhdlDocGen::formatString(n,ol,mdef); if ((len-i)>1) ol.lineBreak(); } @@ -3203,14 +3047,14 @@ void VhdlDocGen::writeRecUnitDocu( QCString largs) { - QStringList ql=QStringList::split("#",largs,FALSE); + QCStringList ql=QCStringList::split("#",largs); uint len=ql.count(); ol.startParameterList(TRUE); bool first=TRUE; for(uint i=0;i<len;i++) { - QCString n=ql[i].utf8(); + QCString n=ql[i]; ol.startParameterType(first,""); ol.endParameterType(); ol.startParameterName(TRUE); @@ -3643,14 +3487,14 @@ void FlowChart::alignCommentNode(FTextStream &t,QCString com) { uint max=0; QCString s; - QStringList ql=QStringList::split("\n",com); + QCStringList ql=QCStringList::split("\n",com); for (uint j=0;j<ql.count();j++) { - s=(QCString)ql[j].utf8(); + s=(QCString)ql[j]; if (max<s.length()) max=s.length(); } - s=ql.last().utf8(); + s=ql.last(); int diff=max-s.length(); QCString n(1); @@ -3665,7 +3509,7 @@ void FlowChart::alignCommentNode(FTextStream &t,QCString com) for (uint j=0;j<ql.count();j++) { - s=(QCString)ql[j].utf8(); + s=ql[j]; if (j<ql.count()-1) { s+="\n"; @@ -3993,7 +3837,7 @@ void FlowChart::createSVG() //const MemberDef *m=VhdlDocGen::getFlowMember(); //if (m) - // fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data()); + // fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",theTranslator->trVhdlType(m->getMemberSpecifiers(),TRUE),m->name().data(),m->getFileDef()->name().data()); QCString dir=" -o \""+ov+qcs+"\""; ov+="/flow_design.dot"; diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index bd190ca..9dd8417 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -150,33 +150,6 @@ class VhdlDocGen static bool isMisc(const MemberDef *mdef); //----------------------------------------------------- - // translatable items - - static QCString trTypeString(uint64 type); - static QCString trVhdlType(uint64 type,bool sing=true); - - // trClassHierarchy. - static QCString trDesignUnitHierarchy(); - - // trCompoundList - static QCString trDesignUnitList(); - - // trCompoundMembers. - static QCString trDesignUnitMembers(); - - // trCompoundListDescription - static QCString trDesignUnitListDescription(); - - // trCompounds - static QCString trDesignUnits(); - - // trCompoundIndex - static QCString trDesignUnitIndex(); - - // trFunctions - static QCString trFunctionAndProc(); - - //----------------------------------------------------- static void prepareComment(QCString&); static void formatString(const QCString&,OutputList& ol,const MemberDef*); diff --git a/src/vhdljjparser.cpp b/src/vhdljjparser.cpp index 953cd6b..81a7ca1 100644 --- a/src/vhdljjparser.cpp +++ b/src/vhdljjparser.cpp @@ -12,7 +12,7 @@ #include <qcstring.h> #include <qfileinfo.h> -#include <qstringlist.h> +#include <qcstringlist.h> #include "vhdljjparser.h" #include "vhdlcode.h" #include "vhdldocgen.h" @@ -80,9 +80,9 @@ static struct int iDocLine; } str_doc; -static bool doxComment=FALSE; // doxygen comment ? static QCString strComment; static int iCodeLen; +static const char *vhdlFileName = 0; bool checkMultiComment(QCString& qcs,int line); QList<Entry>* getEntryAtLine(const Entry* ce,int line); @@ -99,59 +99,6 @@ Entry* getVhdlCompound() return NULL; } -void startCodeBlock(int index) -{ - int ll=strComment.length(); - if (!gBlock) gBlock = new Entry; - iCodeLen=inputString.findRev(strComment.data())+ll; - // fprintf(stderr,"\n startin code..%d %d %d\n",iCodeLen,num_chars,ll); - gBlock->reset(); - int len=strComment.length(); - QCString name=strComment.right(len-index);// - name=VhdlDocGen::getIndexWord(name.data(),1); - if (!name) - gBlock->name="misc"+ VhdlDocGen::getRecordNumber(); - else - gBlock->name=name; - - gBlock->startLine=yyLineNr; - gBlock->bodyLine=yyLineNr; - - strComment=strComment.left(index); - VhdlDocGen::prepareComment(strComment); - gBlock->brief+=strComment; -} - -void makeInlineDoc(int endCode) -{ - int len=endCode-iCodeLen; - if (!gBlock) gBlock = new Entry; - QCString par=inputString.mid(iCodeLen,len); - //fprintf(stderr,"\n inline code: \n<%s>",par.data()); - gBlock->doc=par; - gBlock->inbodyDocs=par; - gBlock->section=Entry::VARIABLE_SEC; - gBlock->spec=VhdlDocGen::MISCELLANEOUS; - gBlock->fileName = yyFileName; - gBlock->endBodyLine=yyLineNr-1; - gBlock->lang=SrcLangExt_VHDL; - Entry *temp=new Entry(*gBlock); - Entry* compound=getVhdlCompound(); - - if (compound) - { - compound->addSubEntry(temp); - } - else - { - temp->type="misc"; // global code like library ieee... - VhdlParser::current_root->addSubEntry(temp); - } - strComment.resize(0); - gBlock->reset(); -}// makeInlineDoc - - bool isConstraintFile(const QCString &fileName,const QCString &ext) { return fileName.right(ext.length())==ext; @@ -200,6 +147,7 @@ void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,En VhdlParser::current=new Entry(); VhdlParser::initEntry(VhdlParser::current); groupEnterFile(fileName,yyLineNr); + vhdlFileName = fileName; lineParse=new int[200]; // Dimitri: dangerous constant: should be bigger than largest token id in VhdlParserConstants.h VhdlParserIF::parseVhdlfile(fileBuf,inLine); @@ -213,6 +161,7 @@ void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,En yyFileName.resize(0); libUse.clear(); VhdlDocGen::resetCodeVhdlParserState(); + vhdlFileName = 0; } void VhdlParser::lineCount() @@ -279,20 +228,6 @@ void VhdlParser::newEntry() initEntry(current); } -bool checkInlineCode(QCString & doc) -{ - int index=doc.find("\\code"); - - if (index>0) - { - strComment+=doc; - startCodeBlock(index); - doxComment=TRUE; - return true; - } - return false; -} - void VhdlParser::handleFlowComment(const char* doc) { lineCount(doc); @@ -310,7 +245,6 @@ void VhdlParser::handleFlowComment(const char* doc) void VhdlParser::handleCommentBlock(const char* doc1,bool brief) { int position=0; - static bool isIn; QCString doc; doc.append(doc1); // fprintf(stderr,"\n %s",doc.data()); @@ -322,22 +256,6 @@ void VhdlParser::handleCommentBlock(const char* doc1,bool brief) return; } - isIn=checkInlineCode(doc); - bool isEndCode=doc.contains("\\endcode"); - // empty comment --! - if (isEndCode) - { - int end=inputString.find(doc.data(),iCodeLen); - makeInlineDoc(end); - strComment.resize(0); - isIn=false; - } - if (isIn) - { - isIn=false; - return; - } - VhdlDocGen::prepareComment(doc); bool needsEntry=FALSE; @@ -463,11 +381,11 @@ void VhdlParser::addVhdlType(const char *n,int startLine,int section, spec= VhdlDocGen::GENERIC; } - QStringList ql=QStringList::split(",",name,FALSE); + QCStringList ql=QCStringList::split(",",name); for (uint u=0;u<ql.count();u++) { - current->name=ql[u].utf8(); + current->name=ql[u]; current->startLine=startLine; current->bodyLine=startLine; current->section=section; @@ -524,11 +442,11 @@ void VhdlParser::createFunction(const char *imp,uint64 spec,const char *fn) VhdlDocGen::deleteAllChars(current->args,' '); if (!fname.isEmpty()) { - QStringList q1=QStringList::split(",",fname); + QCStringList q1=QCStringList::split(",",fname); for (uint ii=0;ii<q1.count();ii++) { Argument *arg=new Argument; - arg->name=q1[ii].utf8(); + arg->name=q1[ii]; current->argList->append(arg); } } @@ -622,12 +540,12 @@ void VhdlParser::addProto(const char *s1,const char *s2,const char *s3, { (void)s5; // avoid unused warning QCString name=s2; - QStringList ql=QStringList::split(",",name,FALSE); + QCStringList ql=QCStringList::split(",",name); for (uint u=0;u<ql.count();u++) { Argument *arg=new Argument; - arg->name=ql[u].utf8(); + arg->name=ql[u]; if (s3) { arg->type=s3; @@ -788,31 +706,12 @@ void VhdlParser::setMultCommentLine() void VhdlParser::oneLineComment(QCString qcs) { - bool isEndCode=qcs.contains("\\endcode"); - - int index = qcs.find("\\code"); - if (isEndCode) - { - int end = inputString.find(qcs.data(),iCodeLen); - makeInlineDoc(end); - } - else if (index > 0) - { - // assert(false); - strComment=qcs; - startCodeBlock(index); - strComment.resize(0); - } - - if (!isEndCode && index==-1) - { int j=qcs.find("--!"); qcs=qcs.right(qcs.length()-3-j); if (!checkMultiComment(qcs,iDocLine)) { handleCommentBlock(qcs,TRUE); } - } } @@ -851,3 +750,7 @@ QList<Entry>* getEntryAtLine(const Entry* ce,int line) return &lineEntry; } +const char *getVhdlFileName(void) +{ + return vhdlFileName; +} diff --git a/src/vhdljjparser.h b/src/vhdljjparser.h index a0851d7..3a2ed61 100644 --- a/src/vhdljjparser.h +++ b/src/vhdljjparser.h @@ -7,6 +7,7 @@ #include <assert.h> #include <ctype.h> #include <qarray.h> +#include <qcstringlist.h> #include <qfile.h> #include <qdict.h> @@ -14,7 +15,6 @@ #include "types.h" #include "entry.h" #include "vhdldocgen.h" -#include "qstringlist.h" #include "vhdlcode.h" #include "memberlist.h" #include "config.h" @@ -30,7 +30,6 @@ class ClassSDict; class FileStorage; class ClassDef; class MemberDef; -class QStringList; struct VhdlConfNode; diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 93765b1..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; @@ -164,6 +184,12 @@ void XmlDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Bold: if (s->enable()) m_t << "<bold>"; else m_t << "</bold>"; break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "<strike>"; else m_t << "</strike>"; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "<underline>"; else m_t << "</underline>"; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "<emphasis>"; else m_t << "</emphasis>"; break; @@ -307,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; @@ -488,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 *) @@ -767,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 2222e46..bacf4d4 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"); @@ -175,7 +177,7 @@ static void writeCombineScript() " <xsl:output method=\"xml\" version=\"1.0\" indent=\"no\" standalone=\"yes\" />\n" " <xsl:template match=\"/\">\n" " <doxygen version=\"{doxygenindex/@version}\">\n" - " <!-- Load all doxgen generated xml files -->\n" + " <!-- Load all doxygen generated xml files -->\n" " <xsl:for-each select=\"doxygenindex/compound\">\n" " <xsl:copy-of select=\"document( concat( @refid, '.xml' ) )/doxygen/*\" />\n" " </xsl:for-each>\n" @@ -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) - { - } - - void finish() + if (!m_external.isEmpty()) { - if (m_insideCodeLine) endCodeLine(); + m_t << " external=\"" << m_external << "\""; } - - 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) @@ -954,11 +929,11 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De MemberDef *emd; for (emli.toFirst();(emd=emli.current());++emli) { - ti << " <member refid=\"" << memberOutputFileBase(emd) - << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>" + ti << " <member refid=\"" << memberOutputFileBase(md) + << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>" << convertToXML(emd->name()) << "</name></member>" << endl; - t << " <enumvalue id=\"" << memberOutputFileBase(emd) << "_1" + t << " <enumvalue id=\"" << memberOutputFileBase(md) << "_1" << emd->anchor() << "\" prot=\""; switch (emd->protection()) { @@ -1040,6 +1015,15 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De t << " </memberdef>" << endl; } +// namespace members are also inserted in the file scope, but +// to prevent this duplication in the XML output, we optionally filter those here. +static bool memberVisible(Definition *d,MemberDef *md) +{ + return Config_getBool(XML_NS_MEMB_FILE_SCOPE) || + d->definitionType()!=Definition::TypeFile || + md->getNamespaceDef()==0; +} + static void generateXMLSection(Definition *d,FTextStream &ti,FTextStream &t, MemberList *ml,const char *kind,const char *header=0, const char *documentation=0) @@ -1050,9 +1034,7 @@ static void generateXMLSection(Definition *d,FTextStream &ti,FTextStream &t, int count=0; for (mli.toFirst();(md=mli.current());++mli) { - // 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) + if (memberVisible(d,md)) { count++; } @@ -1072,9 +1054,7 @@ static void generateXMLSection(Definition *d,FTextStream &ti,FTextStream &t, } for (mli.toFirst();(md=mli.current());++mli) { - // 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) + if (memberVisible(d,md)) { generateXMLForMember(md,ti,t,d); } @@ -1163,7 +1143,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; @@ -1838,9 +1818,62 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) } } writeInnerPages(pd->getSubPages(),t); - if(pd->showToc()) - { - t << " <tableofcontents/>" << endl; + if (pd->localToc().isXmlEnabled()) + { + t << " <tableofcontents>" << endl; + SectionDict *sectionDict = pd->getSectionDict(); + SDict<SectionInfo>::Iterator li(*sectionDict); + SectionInfo *si; + int level=1,l; + bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; + int maxLevel = pd->localToc().xmlLevel(); + 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) t << " <tableofcontents>" << endl; + } + } + else if (nextLevel<level) + { + for (l=level;l>nextLevel;l--) + { + if (l <= maxLevel && inLi[l]) t << " </tocsect>" << endl; + inLi[l]=FALSE; + if (l <= maxLevel) t << " </tableofcontents>" << 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; + } + } + } + while (level>1 && level <= maxLevel) + { + if (inLi[level]) t << " </tocsect>" << endl; + inLi[level]=FALSE; + t << " </tableofcontents>" << endl; + level--; + } + if (level <= maxLevel && inLi[level]) t << " </tocsect>" << endl; + inLi[level]=FALSE; + t << " </tableofcontents>" << endl; } t << " <briefdescription>" << endl; writeXMLDocBlock(t,pd->briefFile(),pd->briefLine(),pd,0,pd->briefDescription()); 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 26169de..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 { @@ -134,12 +143,12 @@ a.qindex { a.qindexHL { font-weight: bold; background-color: ##AA; - color: #ffffff; + color: ##ff; border: 1px double ##98; } .contents a.qindexHL:visited { - color: #ffffff; + color: ##ff; } a.el { @@ -150,11 +159,11 @@ a.elRef { } a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; + color: ##60; } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; + color: ##60; } /* @end */ @@ -163,9 +172,28 @@ dl.el { margin-left: -1cm; } +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; + border: 1px solid ##CC; + background-color: ##FC; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; @@ -177,8 +205,8 @@ pre.fragment { } div.fragment { - padding: 0px; - margin: 4px 8px 4px 2px; + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; background-color: ##FC; border: 1px solid ##CC; } @@ -248,7 +276,7 @@ span.lineno a:hover { div.ah, span.ah { background-color: black; font-weight: bold; - color: #ffffff; + color: ##ff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; @@ -324,7 +352,7 @@ img.formulaDsp { } -img.formulaInl { +img.formulaInl, img.inline { vertical-align: middle; } @@ -402,6 +430,13 @@ blockquote { padding: 0 12px 0 16px; } +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid ##AA; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + /* @end */ /* @@ -488,7 +523,7 @@ table.memberdecls { } .memSeparator { - border-bottom: 1px solid #DEE4F0; + border-bottom: 1px solid ##E2; line-height: 1px; margin: 0px; padding: 0px; @@ -618,7 +653,7 @@ table.memberdecls { border-top-width: 0; background-image:url('nav_g.png'); background-repeat:repeat-x; - background-color: #FFFFFF; + background-color: ##ff; /* opera specific markup */ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; @@ -666,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; } @@ -890,7 +925,7 @@ table.doxtable td, table.doxtable th { table.doxtable th { background-color: ##47; - color: #FFFFFF; + color: ##ff; font-size: 110%; padding-bottom: 4px; padding-top: 5px; @@ -1081,72 +1116,143 @@ div.headertitle padding: 5px 5px 5px 10px; } -dl -{ - padding: 0 0 0 10px; +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; } -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ -dl.section -{ +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { margin-left: 0px; padding-left: 0px; } -dl.note -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #D0C000; +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; } -dl.warning, dl.attention -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #FF0000; +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; } -dl.pre, dl.post, dl.invariant -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #00D000; +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; } -dl.deprecated -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #505050; +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; } -dl.todo -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #00C0E0; +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; } -dl.test -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #3030E0; +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; } -dl.bug -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #C08050; +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; } dl.section dd { @@ -1263,6 +1369,11 @@ div.toc { width: 200px; } +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + div.toc li { background: url("bdwn.png") no-repeat scroll 0 5px transparent; font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; @@ -1271,6 +1382,12 @@ div.toc li { padding-top: 2px; } +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + div.toc h3 { font: bold 12px/1.2 Arial,FreeSans,sans-serif; color: ##60; @@ -1300,6 +1417,26 @@ div.toc li.level4 { margin-left: 45px; } +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + .inherit_header { font-weight: bold; color: gray; @@ -1413,7 +1550,7 @@ tr.heading h2 { } #powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: #ffffff; + border-top-color: ##ff; border-width: 10px; margin: 0px -10px; } @@ -1441,7 +1578,7 @@ tr.heading h2 { } #powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: #ffffff; + border-bottom-color: ##ff; border-width: 10px; margin: 0px -10px; } @@ -1468,7 +1605,7 @@ tr.heading h2 { left: 100%; } #powerTip.e:after { - border-left-color: #ffffff; + border-left-color: ##ff; border-width: 10px; top: 50%; margin-top: -10px; @@ -1484,7 +1621,7 @@ tr.heading h2 { right: 100%; } #powerTip.w:after { - border-right-color: #ffffff; + border-right-color: ##ff; border-width: 10px; top: 50%; margin-top: -10px; @@ -1539,7 +1676,7 @@ table.markdownTableBodyLeft td, table.markdownTable th { th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { background-color: ##47; - color: #FFFFFF; + color: ##ff; font-size: 110%; padding-bottom: 4px; padding-top: 5px; @@ -1573,8 +1710,8 @@ table.markdownTable tr { } th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; + background-color: ##47; + color: ##ff; font-size: 110%; padding-bottom: 4px; padding-top: 5px; @@ -1592,5 +1729,36 @@ th.markdownTableHeadCenter, td.markdownTableBodyCenter { text-align: center } +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} /* @end */ + +u { + text-decoration: underline; +} + diff --git a/templates/html/dynsections.js b/templates/html/dynsections.js index c1ce122..ea0a7b3 100644 --- a/templates/html/dynsections.js +++ b/templates/html/dynsections.js @@ -60,7 +60,7 @@ function toggleLevel(level) $(this).show(); } else if (l==level+1) { i.removeClass('iconfclosed iconfopen').addClass('iconfclosed'); - a.html('▶'); + a.html('►'); $(this).show(); } else { $(this).hide(); @@ -87,7 +87,7 @@ function toggleFolder(id) // replace down arrow by right arrow for current row var currentRowSpans = currentRow.find("span"); currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); - currentRowSpans.filter(".arrow").html('▶'); + currentRowSpans.filter(".arrow").html('►'); rows.filter("[id^=row_"+id+"]").hide(); // hide all children } else { // we are SHOWING // replace right arrow by down arrow for current row @@ -97,7 +97,7 @@ function toggleFolder(id) // replace down arrows by right arrows for child rows var childRowsSpans = childRows.find("span"); childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); - childRowsSpans.filter(".arrow").html('▶'); + childRowsSpans.filter(".arrow").html('►'); childRows.show(); //show all children } updateStripes(); 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/htmldirtree.tpl b/templates/html/htmldirtree.tpl index 6d3ef8c..a6b9b21 100644 --- a/templates/html/htmldirtree.tpl +++ b/templates/html/htmldirtree.tpl @@ -20,7 +20,7 @@ {% else %} <span style="width:{{ (node.level)*16 }}px;display:inline-block;"> </span> <span id="arr_{{ node.id }}" class="arrow" onclick="toggleFolder('{{ node.id}}')"> - {%if node.level+1<tree.preferredDepth %}▼{% else %}▶{% endif %} + {%if node.level+1<tree.preferredDepth %}▼{% else %}►{% endif %} </span> {% endif %} {% if node.namespace %} 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/jquery.js b/templates/html/jquery.js index 2771c74..1ee895c 100644 --- a/templates/html/jquery.js +++ b/templates/html/jquery.js @@ -1,33 +1,5 @@ -/* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ /*! - * jQuery JavaScript Library v1.7.1 + * jQuery JavaScript Library v1.7.2 * http://jquery.com/ * * Copyright 2011, John Resig @@ -39,16 +11,16 @@ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * - * Date: Mon Nov 21 21:11:03 2011 -0500 + * Date: Wed Mar 21 12:46:34 2012 -0700 */ -(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +(function(bd,L){var av=bd.document,bu=bd.navigator,bm=bd.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bd.jQuery,bH=bd.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bd.$===bF){bd.$=bH}if(b0&&bd.jQuery===bF){bd.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bd.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bd.attachEvent("onload",bF.ready);var b0=false;try{b0=bd.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0!=null&&b0==b0.window},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bd.JSON&&bd.JSON.parse){return bd.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){if(typeof b2!=="string"||!b2){return null}var b0,b1;try{if(bd.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bd.execScript||function(b1){bd["eval"].call(bd,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b6,b9,b7,b4,ca,b8){var b2,b5=b9==null,b3=0,b1=b0.length;if(b9&&typeof b9==="object"){for(b3 in b9){bF.access(b0,b6,b3,b9[b3],1,ca,b7)}b4=1}else{if(b7!==L){b2=b8===L&&bF.isFunction(b7);if(b5){if(b2){b2=b6;b6=function(cc,cb,cd){return b2.call(bF(cc),cd)}}else{b6.call(b0,b7);b6=null}}if(b6){for(;b3<b1;b3++){b6(b0[b3],b9,b2?b7.call(b0[b3],b3,b6(b0[b3],b9)):b7,b8)}}b4=1}}return b4?b0:b5?b6.call(b0):b1?b6(b0[0],b9):ca},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a3={};function X(e){var bv=a3[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bx){bx=bx?(a3[bx]||X(bx)):{};var bC=[],bD=[],by,e,bz,bw,bA,bB,bF=function(bG){var bH,bK,bJ,bI,bL;for(bH=0,bK=bG.length;bH<bK;bH++){bJ=bG[bH];bI=b.type(bJ);if(bI==="array"){bF(bJ)}else{if(bI==="function"){if(!bx.unique||!bE.has(bJ)){bC.push(bJ)}}}}},bv=function(bH,bG){bG=bG||[];by=!bx.memory||[bH,bG];e=true;bz=true;bB=bw||0;bw=0;bA=bC.length;for(;bC&&bB<bA;bB++){if(bC[bB].apply(bH,bG)===false&&bx.stopOnFalse){by=true;break}}bz=false;if(bC){if(!bx.once){if(bD&&bD.length){by=bD.shift();bE.fireWith(by[0],by[1])}}else{if(by===true){bE.disable()}else{bC=[]}}}},bE={add:function(){if(bC){var bG=bC.length;bF(arguments);if(bz){bA=bC.length}else{if(by&&by!==true){bw=bG;bv(by[0],by[1])}}}return this},remove:function(){if(bC){var bG=arguments,bI=0,bJ=bG.length;for(;bI<bJ;bI++){for(var bH=0;bH<bC.length;bH++){if(bG[bI]===bC[bH]){if(bz){if(bH<=bA){bA--;if(bH<=bB){bB--}}}bC.splice(bH--,1);if(bx.unique){break}}}}}return this},has:function(bH){if(bC){var bG=0,bI=bC.length;for(;bG<bI;bG++){if(bH===bC[bG]){return true}}}return false},empty:function(){bC=[];return this},disable:function(){bC=bD=by=L;return this},disabled:function(){return !bC},lock:function(){bD=L;if(!by||by===true){bE.disable()}return this},locked:function(){return !bD},fireWith:function(bH,bG){if(bD){if(bz){if(!bx.once){bD.push([bH,bG])}}else{if(!(bx.once&&by)){bv(bH,bG)}}}return this},fire:function(){bE.fireWith(this,arguments);return this},fired:function(){return !!e}};return bE};var aK=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aK.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aK.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aK.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bI,bH,bE,bF,bx,bD,bC,bz,bJ,bA,by,bw,bv=av.createElement("div"),bG=av.documentElement;bv.setAttribute("className","t");bv.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bH=bv.getElementsByTagName("*");bE=bv.getElementsByTagName("a")[0];if(!bH||!bH.length||!bE){return{}}bF=av.createElement("select");bx=bF.appendChild(av.createElement("option"));bD=bv.getElementsByTagName("input")[0];bI={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bE.getAttribute("style")),hrefNormalized:(bE.getAttribute("href")==="/a"),opacity:/^0.55/.test(bE.style.opacity),cssFloat:!!bE.style.cssFloat,checkOn:(bD.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,pixelMargin:true};b.boxModel=bI.boxModel=(av.compatMode==="CSS1Compat");bD.checked=true;bI.noCloneChecked=bD.cloneNode(true).checked;bF.disabled=true;bI.optDisabled=!bx.disabled;try{delete bv.test}catch(bB){bI.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bI.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bD=av.createElement("input");bD.value="t";bD.setAttribute("type","radio");bI.radioValue=bD.value==="t";bD.setAttribute("checked","checked");bD.setAttribute("name","t");bv.appendChild(bD);bC=av.createDocumentFragment();bC.appendChild(bv.lastChild);bI.checkClone=bC.cloneNode(true).cloneNode(true).lastChild.checked;bI.appendChecked=bD.checked;bC.removeChild(bD);bC.appendChild(bv);if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bA="on"+by;bw=(bA in bv);if(!bw){bv.setAttribute(bA,"return;");bw=(typeof bv[bA]==="function")}bI[by+"Bubbles"]=bw}}bC.removeChild(bv);bC=bF=bx=bv=bD=null;b(function(){var bM,bV,bW,bU,bO,bP,bR,bL,bK,bQ,bN,e,bT,bS=av.getElementsByTagName("body")[0];if(!bS){return}bL=1;bT="padding:0;margin:0;border:";bN="position:absolute;top:0;left:0;width:1px;height:1px;";e=bT+"0;visibility:hidden;";bK="style='"+bN+bT+"5px solid #000;";bQ="<div "+bK+"display:block;'><div style='"+bT+"0;display:block;overflow:hidden;'></div></div><table "+bK+"' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=e+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bS.insertBefore(bM,bS.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='"+bT+"0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bI.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);if(bd.getComputedStyle){bv.innerHTML="";bR=av.createElement("div");bR.style.width="0";bR.style.marginRight="0";bv.style.width="2px";bv.appendChild(bR);bI.reliableMarginRight=(parseInt((bd.getComputedStyle(bR,null)||{marginRight:0}).marginRight,10)||0)===0}if(typeof bv.style.zoom!=="undefined"){bv.innerHTML="";bv.style.width=bv.style.padding="1px";bv.style.border=0;bv.style.overflow="hidden";bv.style.display="inline";bv.style.zoom=1;bI.inlineBlockNeedsLayout=(bv.offsetWidth===3);bv.style.display="block";bv.style.overflow="visible";bv.innerHTML="<div style='width:5px;'></div>";bI.shrinkWrapBlocks=(bv.offsetWidth!==3)}bv.style.cssText=bN+e;bv.innerHTML=bQ;bV=bv.firstChild;bW=bV.firstChild;bO=bV.nextSibling.firstChild.firstChild;bP={doesNotAddBorder:(bW.offsetTop!==5),doesAddBorderForTableAndCells:(bO.offsetTop===5)};bW.style.position="fixed";bW.style.top="20px";bP.fixedPosition=(bW.offsetTop===20||bW.offsetTop===15);bW.style.position=bW.style.top="";bV.style.overflow="hidden";bV.style.position="relative";bP.subtractsBorderForOverflowNotVisible=(bW.offsetTop===-5);bP.doesNotIncludeMarginInBodyOffset=(bS.offsetTop!==bL);if(bd.getComputedStyle){bv.style.marginTop="1%";bI.pixelMargin=(bd.getComputedStyle(bv,null)||{marginTop:0}).marginTop!=="1%"}if(typeof bM.style.zoom!=="undefined"){bM.style.zoom=1}bS.removeChild(bM);bR=bv=bM=null;b.extend(bI,bP)});return bI})();var aT=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(bD,bC){var by,bv,bB,e,bx,bw=this[0],bA=0,bz=null;if(bD===L){if(this.length){bz=b.data(bw);if(bw.nodeType===1&&!b._data(bw,"parsedAttrs")){bB=bw.attributes;for(bx=bB.length;bA<bx;bA++){e=bB[bA].name;if(e.indexOf("data-")===0){e=b.camelCase(e.substring(5));a6(bw,e,bz[e])}}b._data(bw,"parsedAttrs",true)}}return bz}if(typeof bD==="object"){return this.each(function(){b.data(this,bD)})}by=bD.split(".",2);by[1]=by[1]?"."+by[1]:"";bv=by[1]+"!";return b.access(this,function(bE){if(bE===L){bz=this.triggerHandler("getData"+bv,[by[0]]);if(bz===L&&bw){bz=b.data(bw,bD);bz=a6(bw,bD,bz)}return bz===L&&by[1]?this.data(by[0]):bz}by[1]=bE;this.each(function(){var bF=b(this);bF.triggerHandler("setData"+bv,by);b.data(this,bD,bE);bF.triggerHandler("changeData"+bv,by)})},null,bC,arguments.length>1,null,false)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a6(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?+by:aT.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bj(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bj(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bj(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){var bw=2;if(typeof e!=="string"){bv=e;e="fx";bw--}if(arguments.length<bw){return b.queue(this[0],e)}return bv===L?this:this.each(function(){var bx=b.queue(this,e,bv);if(e==="fx"&&bx[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise(bw)}});var aQ=/[\n\t\r]/g,ag=/\s+/,aV=/\r/g,g=/^(?:button|input)$/i,C=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,E=b.support.getSetAttribute,bf,aZ,aG;b.fn.extend({attr:function(e,bv){return b.access(this,b.attr,e,bv,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,b.prop,e,bv,arguments.length>1)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(ag);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(ag);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aQ," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(ag);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aQ," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.type]||b.valHooks[bw.nodeName.toLowerCase()];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aV,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aZ:bf)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(by,bA){var bz,bB,bw,e,bv,bx=0;if(bA&&by.nodeType===1){bB=bA.toLowerCase().split(ag);e=bB.length;for(;bx<e;bx++){bw=bB[bx];if(bw){bz=b.propFix[bw]||bw;bv=ao.test(bw);if(!bv){b.attr(by,bw,"")}by.removeAttribute(E?bw:bz);if(bv&&bz in by){by[bz]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(bf&&b.nodeName(bv,"button")){return bf.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(bf&&b.nodeName(bv,"button")){return bf.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):C.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aZ={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!E){aG={name:true,id:true,coords:true};bf=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aG[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=bf.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:bf.get,set:function(bv,bw,e){if(bw===""){bw="false"}bf.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var be=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/(?:^|\s)hover(\.\S+)?\b/,aP=/^key/,bg=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler;by=bv.selector}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:by&&Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bd,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(bH){bH=b.event.fix(bH||bd.event);var bD=((b._data(this,"events")||{})[bH.type]||[]),bC=bD.delegateCount,bx=[].slice.call(arguments,0),bE=!bH.exclusive&&!bH.namespace,bz=b.event.special[bH.type]||{},bv=[],bJ,bG,by,bA,bK,bI,bB,bw,e,bF,bL;bx[0]=bH;bH.delegateTarget=this;if(bz.preDispatch&&bz.preDispatch.call(this,bH)===false){return}if(bC&&!(bH.button&&bH.type==="click")){bA=b(this);bA.context=this.ownerDocument||this;for(by=bH.target;by!=this;by=by.parentNode||this){if(by.disabled!==true){bI={};bw=[];bA[0]=by;for(bJ=0;bJ<bC;bJ++){e=bD[bJ];bF=e.selector;if(bI[bF]===L){bI[bF]=(e.quick?j(by,e.quick):bA.is(bF))}if(bI[bF]){bw.push(e)}}if(bw.length){bv.push({elem:by,matches:bw})}}}}if(bD.length>bC){bv.push({elem:this,matches:bD.slice(bC)})}for(bJ=0;bJ<bv.length&&!bH.isPropagationStopped();bJ++){bB=bv[bJ];bH.currentTarget=bB.elem;for(bG=0;bG<bB.matches.length&&!bH.isImmediatePropagationStopped();bG++){e=bB.matches[bG];if(bE||(!bH.namespace&&!e.namespace)||bH.namespace_re&&bH.namespace_re.test(e.namespace)){bH.data=e.data;bH.handleObj=e;bK=((b.event.special[e.origType]||{}).handle||e.handler).apply(bB.elem,bx);if(bK!==L){bH.result=bK;if(bK===false){bH.preventDefault();bH.stopPropagation()}}}}}if(bz.postDispatch){bz.postDispatch.call(this,bH)}return bH.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bl}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bl(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bl,isPropagationStopped:bl,isImmediatePropagationStopped:bl};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){e._submit_bubble=true});bv._submit_attached=true}})},postDispatch:function(e){if(e._submit_bubble){delete e._submit_bubble;if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}}},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(be.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(be.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return be.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=bz||e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bl}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on(bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.origType+"."+bv.namespace:bv.origType,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bl}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aP.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bg.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ -(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9||e===11){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}bE.match.globalPOS=bD;var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,bb=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.globalPOS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aH(this,e,false),"not",e)},filter:function(e){return this.pushStack(aH(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(B(bx[0])||B(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||bb.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aH(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aS.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aS="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ah=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,v=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ai=new RegExp("<(?:"+aS+")[\\s/>]","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bn=/\/(java|ecma)script/i,aO=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){return b.access(this,function(bv){return bv===L?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(bv))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(e){return b.access(this,function(by){var bx=this[0]||{},bw=0,bv=this.length;if(by===L){return bx.nodeType===1?bx.innerHTML.replace(ah,""):null}if(typeof by==="string"&&!ae.test(by)&&(b.support.leadingWhitespace||!ar.test(by))&&!ax[(d.exec(by)||["",""])[1].toLowerCase()]){by=by.replace(R,"<$1></$2>");try{for(;bw<bv;bw++){bx=this[bw]||{};if(bx.nodeType===1){b.cleanData(bx.getElementsByTagName("*"));bx.innerHTML=by}}bx=0}catch(bz){}}if(bx){this.empty().append(by)}},null,e,arguments.length)},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?bc(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,function(bG,bH){if(bH.src){b.ajax({type:"GET",global:false,url:bH.src,async:false,dataType:"script"})}else{b.globalEval((bH.text||bH.textContent||bH.innerHTML||"").replace(aO,"/*$0*/"))}if(bH.parentNode){bH.parentNode.removeChild(bH)}})}}return this}});function bc(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function s(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by,bw[by][bx])}}}if(bz.data){bz.data=b.extend({},bz.data)}}function aj(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}else{if(bw==="script"&&e.text!==bv.text){e.text=bv.text}}}}}e.removeAttribute(b.expando);e.removeAttribute("_submit_attached");e.removeAttribute("_change_attached")}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ai.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bh(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function D(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function am(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||b.isXMLDoc(by)||!ai.test("<"+by.nodeName+">")?by.cloneNode(true):am(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){aj(by,bz);e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){if(bv[bx]){aj(e[bx],bv[bx])}}}if(bA){s(by,bz);if(bw){e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){s(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bI,bw,bv,bx){var bA,bH,bD,bJ=[];bw=bw||av;if(typeof bw.createElement==="undefined"){bw=bw.ownerDocument||bw[0]&&bw[0].ownerDocument||av}for(var bE=0,bG;(bG=bI[bE])!=null;bE++){if(typeof bG==="number"){bG+=""}if(!bG){continue}if(typeof bG==="string"){if(!W.test(bG)){bG=bw.createTextNode(bG)}else{bG=bG.replace(R,"<$1></$2>");var bN=(d.exec(bG)||["",""])[1].toLowerCase(),bz=ax[bN]||ax._default,bK=bz[0],bB=bw.createElement("div"),bL=ac.childNodes,bM;if(bw===av){ac.appendChild(bB)}else{a(bw).appendChild(bB)}bB.innerHTML=bz[1]+bG+bz[2];while(bK--){bB=bB.lastChild}if(!b.support.tbody){var by=v.test(bG),e=bN==="table"&&!by?bB.firstChild&&bB.firstChild.childNodes:bz[1]==="<table>"&&!by?bB.childNodes:[];for(bD=e.length-1;bD>=0;--bD){if(b.nodeName(e[bD],"tbody")&&!e[bD].childNodes.length){e[bD].parentNode.removeChild(e[bD])}}}if(!b.support.leadingWhitespace&&ar.test(bG)){bB.insertBefore(bw.createTextNode(ar.exec(bG)[0]),bB.firstChild)}bG=bB.childNodes;if(bB){bB.parentNode.removeChild(bB);if(bL.length>0){bM=bL[bL.length-1];if(bM&&bM.parentNode){bM.parentNode.removeChild(bM)}}}}}var bF;if(!b.support.appendChecked){if(bG[0]&&typeof(bF=bG.length)==="number"){for(bD=0;bD<bF;bD++){D(bG[bD])}}else{D(bG)}}if(bG.nodeType){bJ.push(bG)}else{bJ=b.merge(bJ,bG)}}if(bv){bA=function(bO){return !bO.type||bn.test(bO.type)};for(bE=0;bJ[bE];bE++){bH=bJ[bE];if(bx&&b.nodeName(bH,"script")&&(!bH.type||bn.test(bH.type))){bx.push(bH.parentNode?bH.parentNode.removeChild(bH):bH)}else{if(bH.nodeType===1){var bC=b.grep(bH.getElementsByTagName("script"),bA);bJ.splice.apply(bJ,[bE+1,0].concat(bC))}bv.appendChild(bH)}}}return bJ},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});var al=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,y=/([A-Z]|^ms)/g,bo=/^[\-+]?(?:\d*\.)?\d+$/i,a1=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,I=/^([\-+])=([\-+.\de]+)/,aE=/^margin/,a9={position:"absolute",visibility:"hidden",display:"block"},G=["Top","Right","Bottom","Left"],Z,aJ,aY;b.fn.css=function(e,bv){return b.access(this,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)},e,bv,arguments.length>1)};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(by,bx,bz){var e={},bw,bv;for(bv in bx){e[bv]=by.style[bv];by.style[bv]=bx[bv]}bw=bz.call(by);for(bv in bx){by.style[bv]=e[bv]}return bw}});b.curCSS=b.css;if(av.defaultView&&av.defaultView.getComputedStyle){aJ=function(bA,bw){var bv,bz,e,by,bx=bA.style;bw=bw.replace(y,"-$1").toLowerCase();if((bz=bA.ownerDocument.defaultView)&&(e=bz.getComputedStyle(bA,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(bA.ownerDocument.documentElement,bA)){bv=b.style(bA,bw)}}if(!b.support.pixelMargin&&e&&aE.test(bw)&&a1.test(bv)){by=bx.width;bx.width=bv;bv=e.width;bx.width=by}return bv}}if(av.documentElement.currentStyle){aY=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv==null&&bx&&(by=bx[bw])){bv=by}if(a1.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":bv;bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aJ||aY;function af(by,bw,bv){var bz=bw==="width"?by.offsetWidth:by.offsetHeight,bx=bw==="width"?1:0,e=4;if(bz>0){if(bv!=="border"){for(;bx<e;bx+=2){if(!bv){bz-=parseFloat(b.css(by,"padding"+G[bx]))||0}if(bv==="margin"){bz+=parseFloat(b.css(by,bv+G[bx]))||0}else{bz-=parseFloat(b.css(by,"border"+G[bx]+"Width"))||0}}}return bz+"px"}bz=Z(by,bw);if(bz<0||bz==null){bz=by.style[bw]}if(a1.test(bz)){return bz}bz=parseFloat(bz)||0;if(bv){for(;bx<e;bx+=2){bz+=parseFloat(b.css(by,"padding"+G[bx]))||0;if(bv!=="padding"){bz+=parseFloat(b.css(by,"border"+G[bx]+"Width"))||0}if(bv==="margin"){bz+=parseFloat(b.css(by,bv+G[bx]))||0}}}return bz+"px"}b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){if(bx){if(by.offsetWidth!==0){return af(by,e,bw)}else{return b.swap(by,a9,function(){return af(by,e,bw)})}}},set:function(bw,bx){return bo.test(bx)?bx+"px":bx}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(al,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=al.test(bw)?bw.replace(al,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bv,e){return b.swap(bv,{display:"inline-block"},function(){if(e){return Z(bv,"margin-right")}else{return bv.style.marginRight}})}}}});if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}b.each({margin:"",padding:"",border:"Width"},function(e,bv){b.cssHooks[e+bv]={expand:function(by){var bx,bz=typeof by==="string"?by.split(" "):[by],bw={};for(bx=0;bx<4;bx++){bw[e+G[bx]+bv]=bz[bx]||bz[bx-2]||bz[0]}return bw}}});var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,a0=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aN=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aR=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a7=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,z=b.fn.load,aa={},q={},aF,r,aW=["*/"]+["*"];try{aF=bm.href}catch(aw){aF=av.createElement("a");aF.href="";aF=aF.href}r=K.exec(aF.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aX(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aX(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aX(bv,bE,bz,bD,"*",bx)}return bC}function an(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&z){return z.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a7,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||a0.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){an(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}an(bv,e);return bv},ajaxSettings:{url:aF,isLocal:aN.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bd.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(q),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bk(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=F(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,r[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=r[1]||bI[2]!=r[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aX(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aR.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aW+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aX(q,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){u(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function u(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{u(bw+"["+(typeof bz==="object"?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&b.type(by)==="object"){for(var e in by){u(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bk(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function F(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),t=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=(typeof bD.data==="string")&&/^application\/x\-www\-form\-urlencoded/.test(bD.contentType);if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(t.test(bD.url)||bx&&t.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bd[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(t,bv);if(bD.url===e){if(bx){by=by.replace(t,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bd[bw]=function(bE){bB=[bE]};bC.always(function(){bd[bw]=bz;if(bB&&b.isFunction(bz)){bd[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var A=bd.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,x=0,N;function aM(){try{return new bd.XMLHttpRequest()}catch(bv){}}function ak(){try{return new bd.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bd.ActiveXObject?function(){return !this.isLocal&&aM()||ak()}:aM;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(A){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}try{bI.text=bA.responseText}catch(bK){}try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++x;if(A){if(!N){N={};b(bd).unload(A)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},ba,m,aB=/^(?:toggle|show|hide)$/,aU=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a4,aI=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a5;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a2("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if((by===""&&b.css(bw,"display")==="none")||!b.contains(bw.ownerDocument.documentElement,bw)){b._data(bw,"olddisplay",w(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a2("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a2("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bL=this.nodeType===1,bJ=bL&&b(this).is(":hidden"),bB,bG,bD,bK,bN,bF,bI,bC,bH,bM,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}if((bN=b.cssHooks[bB])&&"expand" in bN){bF=bN.expand(bz[bB]);delete bz[bB];for(bD in bF){if(!(bD in bz)){bz[bD]=bF[bD]}}}}for(bB in bz){bG=bz[bB];if(b.isArray(bG)){bE.animatedProperties[bB]=bG[1];bG=bz[bB]=bG[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bG==="hide"&&bJ||bG==="show"&&!bJ){return bE.complete.call(this)}if(bL&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||w(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bK=new b.fx(this,bE,bD);bG=bz[bD];if(aB.test(bG)){bA=b._data(this,"toggle"+bD)||(bG==="toggle"?bJ?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bK[bA]()}else{bK[bG]()}}else{bI=aU.exec(bG);bC=bK.cur();if(bI){bH=parseFloat(bI[2]);bM=bI[3]||(b.cssNumber[bD]?"":"px");if(bM!=="px"){b.style(this,bD,(bH||1)+bM);bC=((bH||1)/bK.cur())*bC;b.style(this,bD,bC+bM)}if(bI[1]){bH=((bI[1]==="-="?-1:1)*bH)+bC}bK.custom(bC,bH,bM)}else{bK.custom(bC,bG,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bi(){setTimeout(at,0);return(a5=b.now())}function at(){a5=L}function a2(bv,e){var bw={};b.each(aI.concat.apply([],aI.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a2("show",1),slideUp:a2("hide",1),slideToggle:a2("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(e){return e},swing:function(e){return(-Math.cos(e*Math.PI)/2)+0.5}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a5||bi();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(b._data(e.elem,"fxshow"+e.prop)===L){if(e.options.hide){b._data(e.elem,"fxshow"+e.prop,e.start)}else{if(e.options.show){b._data(e.elem,"fxshow"+e.prop,e.end)}}}};if(bv()&&b.timers.push(bv)&&!a4){a4=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a5||bi(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a4);a4=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(aI.concat.apply([],aI),function(e,bv){if(bv.indexOf("margin")){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function w(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!ba){ba=av.createElement("iframe");ba.frameBorder=ba.width=ba.height=0}e.appendChild(ba);if(!m||!ba.createElement){m=(ba.contentWindow||ba.contentDocument).document;m.write((b.support.boxModel?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(ba)}Q[bx]=bw}return Q[bx]}var a8,V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){a8=function(by,bH,bw,bB){try{bB=by.getBoundingClientRect()}catch(bF){}if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aL(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{a8=function(bz,bE,bx){var bC,bw=bz.offsetParent,bv=bz,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.fn.offset=function(e){if(arguments.length){return e===L?this:this.each(function(bx){b.offset.setOffset(this,e,bx)})}var bv=this[0],bw=bv&&bv.ownerDocument;if(!bw){return null}if(bv===bw.body){return b.offset.bodyOffset(bv)}return a8(bv,bw,bw.documentElement)};b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(bw,bv){var e=/Y/.test(bv);b.fn[bw]=function(bx){return b.access(this,function(by,bB,bA){var bz=aL(by);if(bA===L){return bz?(bv in bz)?bz[bv]:b.support.boxModel&&bz.document.documentElement[bB]||bz.document.body[bB]:by[bB]}if(bz){bz.scrollTo(!e?bA:b(bz).scrollLeft(),e?bA:b(bz).scrollTop())}else{by[bB]=bA}},bw,bx,arguments.length,null)}});function aL(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each({Height:"height",Width:"width"},function(bw,bx){var bv="client"+bw,e="scroll"+bw,by="offset"+bw;b.fn["inner"+bw]=function(){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,"padding")):this[bx]():null};b.fn["outer"+bw]=function(bA){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,bA?"margin":"border")):this[bx]():null};b.fn[bx]=function(bz){return b.access(this,function(bC,bB,bD){var bF,bE,bG,bA;if(b.isWindow(bC)){bF=bC.document;bE=bF.documentElement[bv];return b.support.boxModel&&bE||bF.body&&bF.body[bv]||bE}if(bC.nodeType===9){bF=bC.documentElement;if(bF[bv]>=bF[e]){return bF[bv]}return Math.max(bC.body[e],bF[e],bC.body[by],bF[by])}if(bD===L){bG=b.css(bC,bB);bA=parseFloat(bG);return b.isNumeric(bA)?bA:bG}b(bC).css(bB,bD)},bx,bz,arguments.length,null)}});bd.jQuery=bd.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! * jQuery UI 1.8.18 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) @@ -81,7 +53,7 @@ (function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! * jQuery hashchange event - v1.3 - 7/21/2010 * http://benalman.com/projects/jquery-hashchange-plugin/ - * + * * Copyright (c) 2010 "Cowboy" Ben Alman * Dual licensed under the MIT and GPL licenses. * http://benalman.com/about/license/ @@ -112,4 +84,4 @@ * * Licensed MIT */ -(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("<span/>").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a("<iframe/>").attr({src:"javascript:0",tabindex:-9}).css({position:"absolute",top:"auto",left:"0",opacity:0,border:"0"}))}},menuInit:function(l){if(!l.dataSM("in-mega")){if(l.hasClass("mega-menu")){l.find("ul").dataSM("in-mega",true)}var q=2,m=l[0];while((m=m.parentNode.parentNode)!=this.$root[0]){q++}var n=l.prevAll("a").eq(-1);if(!n.length){n=l.prevAll().find("a").eq(-1)}n.addClass("has-submenu").dataSM("sub",l);l.dataSM("parent-a",n).dataSM("level",q).parent().dataSM("sub",l);var o=n.attr("id")||this.accessIdPrefix+(++this.idInc),p=l.attr("id")||this.accessIdPrefix+(++this.idInc);n.attr({id:o,"aria-haspopup":"true","aria-controls":p,"aria-expanded":"false"});l.attr({id:p,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"});if(this.opts.subIndicators){n[this.opts.subIndicatorsPos](this.$subArrow.clone())}}},menuPosition:function(K){var r=K.dataSM("parent-a"),D=r.closest("li"),E=D.parent(),l=K.dataSM("level"),t=this.getWidth(K),J=this.getHeight(K),u=r.offset(),o=u.left,m=u.top,q=this.getWidth(r),F=this.getHeight(r),H=a(window),v=H.scrollLeft(),s=H.scrollTop(),z=this.getViewportWidth(),L=this.getViewportHeight(),w=E.parent().is("[data-sm-horizontal-sub]")||l==2&&!E.hasClass("sm-vertical"),B=this.opts.rightToLeftSubMenus&&!D.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&D.is("[data-sm-reverse]"),p=l==2?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,n=l==2?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY,C,A;if(w){C=B?q-t-p:p;A=this.opts.bottomToTopSubMenus?-J-n:F+n}else{C=B?p-t:q-p;A=this.opts.bottomToTopSubMenus?F-n-J:n}if(this.opts.keepInViewport){var N=o+C,M=m+A;if(B&&N<v){C=w?v-N+C:q-p}else{if(!B&&N+t>v+z){C=w?v+z-t-N+C:p-t}}if(!w){if(J<L&&M+J>s+L){A+=s+L-J-M}else{if(J>=L||M<s){A+=s-M}}}if(w&&(M+J>s+L+0.49||M<s)||!w&&J>L+0.49){var G=this;if(!K.dataSM("scroll-arrows")){K.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).bind({mouseenter:function(){K.dataSM("scroll").up=a(this).hasClass("scroll-up");G.menuScroll(K)},mouseleave:function(x){G.menuScrollStop(K);G.menuScrollOut(K,x)},"mousewheel DOMMouseScroll":function(x){x.preventDefault()}}).insertAfter(K))}var I=".smartmenus_scroll";K.dataSM("scroll",{y:this.cssTransforms3d?0:A-F,step:1,itemH:F,subH:J,arrowDownH:this.getHeight(K.dataSM("scroll-arrows").eq(1))}).bind(i([["mouseover",function(x){G.menuScrollOver(K,x)}],["mouseout",function(x){G.menuScrollOut(K,x)}],["mousewheel DOMMouseScroll",function(x){G.menuScrollMousewheel(K,x)}]],I)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:C+(parseInt(K.css("border-left-width"))||0),width:t-(parseInt(K.css("border-left-width"))||0)-(parseInt(K.css("border-right-width"))||0),zIndex:K.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show();if(this.isFixed()){K.css({"touch-action":"none","-ms-touch-action":"none"}).bind(i([[d?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp",function(x){G.menuScrollTouch(K,x)}]],I))}}}K.css({top:"auto",left:"0",marginLeft:C,marginTop:A-F});this.menuIframeShim(K);if(K.dataSM("ie-shim")){K.dataSM("ie-shim").css({zIndex:K.css("z-index"),width:t,height:J,marginLeft:C,marginTop:A-F})}},menuScroll:function(r,m,n){var p=r.dataSM("scroll"),q=r.dataSM("scroll-arrows"),o=p.up?p.upEnd:p.downEnd,s;if(!m&&p.momentum){p.momentum*=0.92;s=p.momentum;if(s<0.5){this.menuScrollStop(r);return}}else{s=n||(m||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(p.step))}var l=r.dataSM("level");if(this.activatedItems[l-1]&&this.activatedItems[l-1].dataSM("sub")&&this.activatedItems[l-1].dataSM("sub").is(":visible")){this.menuHideSubMenus(l-1)}p.y=p.up&&o<=p.y||!p.up&&o>=p.y?p.y:(Math.abs(o-p.y)>s?p.y+(p.up?s:-s):o);r.add(r.dataSM("ie-shim")).css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+p.y+"px, 0)",transform:"translate3d(0, "+p.y+"px, 0)"}:{marginTop:p.y});if(f&&(p.up&&p.y>p.downEnd||!p.up&&p.y<p.upEnd)){q.eq(p.up?1:0).show()}if(p.y==o){if(f){q.eq(p.up?0:1).hide()}this.menuScrollStop(r)}else{if(!m){if(this.opts.scrollAccelerate&&p.step<this.opts.scrollStep){p.step+=0.2}var t=this;this.scrollTimeout=g(function(){t.menuScroll(r)})}}},menuScrollMousewheel:function(m,n){if(this.getClosestMenu(n.target)==m[0]){n=n.originalEvent;var l=(n.wheelDelta||-n.detail)>0;if(m.dataSM("scroll-arrows").eq(l?0:1).is(":visible")){m.dataSM("scroll").up=l;this.menuScroll(m,true)}}n.preventDefault()},menuScrollOut:function(l,m){if(f){if(!/^scroll-(up|down)/.test((m.relatedTarget||"").className)&&(l[0]!=m.relatedTarget&&!a.contains(l[0],m.relatedTarget)||this.getClosestMenu(m.relatedTarget)!=l[0])){l.dataSM("scroll-arrows").css("visibility","hidden")}}},menuScrollOver:function(n,o){if(f){if(!/^scroll-(up|down)/.test(o.target.className)&&this.getClosestMenu(o.target)==n[0]){this.menuScrollRefreshData(n);var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;n.dataSM("scroll-arrows").eq(0).css("margin-top",l).end().eq(1).css("margin-top",l+this.getViewportHeight()-m.arrowDownH).end().css("visibility","visible")}}},menuScrollRefreshData:function(n){var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;if(this.cssTransforms3d){l=-(parseFloat(n.css("margin-top"))-l)}a.extend(m,{upEnd:l,downEnd:l+this.getViewportHeight()-m.subH})},menuScrollStop:function(l){if(this.scrollTimeout){c(this.scrollTimeout);this.scrollTimeout=0;l.dataSM("scroll").step=1;return true}},menuScrollTouch:function(p,q){q=q.originalEvent;if(j(q)){var m=this.getTouchPoint(q);if(this.getClosestMenu(m.target)==p[0]){var o=p.dataSM("scroll");if(/(start|down)$/i.test(q.type)){if(this.menuScrollStop(p)){q.preventDefault();this.$touchScrollingSub=p}else{this.$touchScrollingSub=null}this.menuScrollRefreshData(p);a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}else{if(/move$/i.test(q.type)){var n=o.touchY!==undefined?o.touchY:o.touchStartY;if(n!==undefined&&n!=m.pageY){this.$touchScrollingSub=p;var l=n<m.pageY;if(o.up!==undefined&&o.up!=l){a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}a.extend(o,{up:l,touchY:m.pageY});this.menuScroll(p,true,Math.abs(m.pageY-n))}q.preventDefault()}else{if(o.touchY!==undefined){if(o.momentum=Math.pow(Math.abs(m.pageY-o.touchStartY)/(q.timeStamp-o.touchStartTime),2)*15){this.menuScrollStop(p);this.menuScroll(p);q.preventDefault()}delete o.touchY}}}}}},menuShow:function(n){if(!n.dataSM("beforefirstshowfired")){n.dataSM("beforefirstshowfired",true);if(this.$root.triggerHandler("beforefirstshow.smapi",n[0])===false){return}}if(this.$root.triggerHandler("beforeshow.smapi",n[0])===false){return}n.dataSM("shown-before",true).stop(true,true);if(!n.is(":visible")){var m=n.dataSM("parent-a");if(this.opts.keepHighlighted||this.isCollapsible()){m.addClass("highlighted")}if(this.isCollapsible()){n.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""})}else{n.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1);if(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth){n.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap");if(this.opts.subMenusMinWidth){n.css("min-width",this.opts.subMenusMinWidth)}if(this.opts.subMenusMaxWidth){var o=this.getWidth(n);n.css("max-width",this.opts.subMenusMaxWidth);if(o>this.getWidth(n)){n.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}}}this.menuPosition(n);if(n.dataSM("ie-shim")){n.dataSM("ie-shim").insertBefore(n)}}var l=function(){n.css("overflow","")};if(this.isCollapsible()){if(this.opts.collapsibleShowFunction){this.opts.collapsibleShowFunction.call(this,n,l)}else{n.show(this.opts.collapsibleShowDuration,l)}}else{if(this.opts.showFunction){this.opts.showFunction.call(this,n,l)}else{n.show(this.opts.showDuration,l)}}m.attr("aria-expanded","true");n.attr({"aria-expanded":"true","aria-hidden":"false"});this.visibleSubMenus.push(n);this.$root.triggerHandler("show.smapi",n[0])}},popupHide:function(l){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var m=this;this.hideTimeout=setTimeout(function(){m.menuHideAll()},l?1:this.opts.hideTimeout)},popupShow:function(o,n){if(!this.opts.isPopup){alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}this.$root.dataSM("shown-before",true).stop(true,true);if(!this.$root.is(":visible")){this.$root.css({left:o,top:n});this.menuIframeShim(this.$root);if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").css({zIndex:this.$root.css("z-index"),width:this.getWidth(this.$root),height:this.getHeight(this.$root),left:o,top:n}).insertBefore(this.$root)}var m=this,l=function(){m.$root.css("overflow","")};if(this.opts.showFunction){this.opts.showFunction.call(this,this.$root,l)}else{this.$root.show(this.opts.showDuration,l)}this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(true);this.init(true)},rootKeyDown:function(o){if(!this.handleEvents()){return}switch(o.keyCode){case 27:var m=this.activatedItems[0];if(m){this.menuHideAll();m[0].focus();var n=m.dataSM("sub");if(n){this.menuHide(n)}}break;case 32:var l=a(o.target);if(l.is("a")&&this.handleItemEvents(l)){var n=l.dataSM("sub");if(n&&!n.is(":visible")){this.itemClick({currentTarget:o.target});o.preventDefault()}}break}},rootOut:function(m){if(!this.handleEvents()||this.isTouchMode()||m.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}if(!this.opts.showOnClick||!this.opts.hideOnClick){var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(l){if(!this.handleEvents()||this.isTouchMode()||l.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}},winResize:function(m){if(!this.handleEvents()){if(this.$disableOverlay){var n=this.$root.offset();this.$disableOverlay.css({top:n.top,left:n.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}return}if(!("onorientationchange" in window)||m.type=="orientationchange"){var l=this.isCollapsible();if(!(this.wasCollapsible&&l)){if(this.activatedItems.length){this.activatedItems[this.activatedItems.length-1][0].blur()}this.menuHideAll()}this.wasCollapsible=l}}}});a.fn.dataSM=function(l,m){if(m){return this.data(l+"_smartmenus",m)}return this.data(l+"_smartmenus")};a.fn.removeDataSM=function(l){return this.removeData(l+"_smartmenus")};a.fn.smartmenus=function(m){if(typeof m=="string"){var l=arguments,o=m;Array.prototype.shift.call(l);return this.each(function(){var p=a(this).data("smartmenus");if(p&&p[o]){p[o].apply(p,l)}})}var n=a.extend({},a.fn.smartmenus.defaults,m);return this.each(function(){new a.SmartMenus(this,n)})};a.fn.smartmenus.defaults={isPopup:false,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:true,subIndicatorsPos:"prepend",subIndicatorsText:"+",scrollStep:30,scrollAccelerate:true,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(m,l){m.fadeOut(200,l)},collapsibleShowDuration:0,collapsibleShowFunction:function(m,l){m.slideDown(200,l)},collapsibleHideDuration:0,collapsibleHideFunction:function(m,l){m.slideUp(200,l)},showOnClick:false,hideOnClick:true,noMouseOver:false,keepInViewport:true,keepHighlighted:true,markCurrentItem:false,markCurrentTree:true,rightToLeftSubMenus:false,bottomToTopSubMenus:false,overlapControlsInIE:true};return a})); +(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("<span/>").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a("<iframe/>").attr({src:"javascript:0",tabindex:-9}).css({position:"absolute",top:"auto",left:"0",opacity:0,border:"0"}))}},menuInit:function(l){if(!l.dataSM("in-mega")){if(l.hasClass("mega-menu")){l.find("ul").dataSM("in-mega",true)}var q=2,m=l[0];while((m=m.parentNode.parentNode)!=this.$root[0]){q++}var n=l.prevAll("a").eq(-1);if(!n.length){n=l.prevAll().find("a").eq(-1)}n.addClass("has-submenu").dataSM("sub",l);l.dataSM("parent-a",n).dataSM("level",q).parent().dataSM("sub",l);var o=n.attr("id")||this.accessIdPrefix+(++this.idInc),p=l.attr("id")||this.accessIdPrefix+(++this.idInc);n.attr({id:o,"aria-haspopup":"true","aria-controls":p,"aria-expanded":"false"});l.attr({id:p,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"});if(this.opts.subIndicators){n[this.opts.subIndicatorsPos](this.$subArrow.clone())}}},menuPosition:function(K){var r=K.dataSM("parent-a"),D=r.closest("li"),E=D.parent(),l=K.dataSM("level"),t=this.getWidth(K),J=this.getHeight(K),u=r.offset(),o=u.left,m=u.top,q=this.getWidth(r),F=this.getHeight(r),H=a(window),v=H.scrollLeft(),s=H.scrollTop(),z=this.getViewportWidth(),L=this.getViewportHeight(),w=E.parent().is("[data-sm-horizontal-sub]")||l==2&&!E.hasClass("sm-vertical"),B=this.opts.rightToLeftSubMenus&&!D.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&D.is("[data-sm-reverse]"),p=l==2?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,n=l==2?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY,C,A;if(w){C=B?q-t-p:p;A=this.opts.bottomToTopSubMenus?-J-n:F+n}else{C=B?p-t:q-p;A=this.opts.bottomToTopSubMenus?F-n-J:n}if(this.opts.keepInViewport){var N=o+C,M=m+A;if(B&&N<v){C=w?v-N+C:q-p}else{if(!B&&N+t>v+z){C=w?v+z-t-N+C:p-t}}if(!w){if(J<L&&M+J>s+L){A+=s+L-J-M}else{if(J>=L||M<s){A+=s-M}}}if(w&&(M+J>s+L+0.49||M<s)||!w&&J>L+0.49){var G=this;if(!K.dataSM("scroll-arrows")){K.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).bind({mouseenter:function(){K.dataSM("scroll").up=a(this).hasClass("scroll-up");G.menuScroll(K)},mouseleave:function(x){G.menuScrollStop(K);G.menuScrollOut(K,x)},"mousewheel DOMMouseScroll":function(x){x.preventDefault()}}).insertAfter(K))}var I=".smartmenus_scroll";K.dataSM("scroll",{y:this.cssTransforms3d?0:A-F,step:1,itemH:F,subH:J,arrowDownH:this.getHeight(K.dataSM("scroll-arrows").eq(1))}).bind(i([["mouseover",function(x){G.menuScrollOver(K,x)}],["mouseout",function(x){G.menuScrollOut(K,x)}],["mousewheel DOMMouseScroll",function(x){G.menuScrollMousewheel(K,x)}]],I)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:C+(parseInt(K.css("border-left-width"))||0),width:t-(parseInt(K.css("border-left-width"))||0)-(parseInt(K.css("border-right-width"))||0),zIndex:K.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show();if(this.isFixed()){K.css({"touch-action":"none","-ms-touch-action":"none"}).bind(i([[d?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp",function(x){G.menuScrollTouch(K,x)}]],I))}}}K.css({top:"auto",left:"0",marginLeft:C,marginTop:A-F});this.menuIframeShim(K);if(K.dataSM("ie-shim")){K.dataSM("ie-shim").css({zIndex:K.css("z-index"),width:t,height:J,marginLeft:C,marginTop:A-F})}},menuScroll:function(r,m,n){var p=r.dataSM("scroll"),q=r.dataSM("scroll-arrows"),o=p.up?p.upEnd:p.downEnd,s;if(!m&&p.momentum){p.momentum*=0.92;s=p.momentum;if(s<0.5){this.menuScrollStop(r);return}}else{s=n||(m||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(p.step))}var l=r.dataSM("level");if(this.activatedItems[l-1]&&this.activatedItems[l-1].dataSM("sub")&&this.activatedItems[l-1].dataSM("sub").is(":visible")){this.menuHideSubMenus(l-1)}p.y=p.up&&o<=p.y||!p.up&&o>=p.y?p.y:(Math.abs(o-p.y)>s?p.y+(p.up?s:-s):o);r.add(r.dataSM("ie-shim")).css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+p.y+"px, 0)",transform:"translate3d(0, "+p.y+"px, 0)"}:{marginTop:p.y});if(f&&(p.up&&p.y>p.downEnd||!p.up&&p.y<p.upEnd)){q.eq(p.up?1:0).show()}if(p.y==o){if(f){q.eq(p.up?0:1).hide()}this.menuScrollStop(r)}else{if(!m){if(this.opts.scrollAccelerate&&p.step<this.opts.scrollStep){p.step+=0.2}var t=this;this.scrollTimeout=g(function(){t.menuScroll(r)})}}},menuScrollMousewheel:function(m,n){if(this.getClosestMenu(n.target)==m[0]){n=n.originalEvent;var l=(n.wheelDelta||-n.detail)>0;if(m.dataSM("scroll-arrows").eq(l?0:1).is(":visible")){m.dataSM("scroll").up=l;this.menuScroll(m,true)}}n.preventDefault()},menuScrollOut:function(l,m){if(f){if(!/^scroll-(up|down)/.test((m.relatedTarget||"").className)&&(l[0]!=m.relatedTarget&&!a.contains(l[0],m.relatedTarget)||this.getClosestMenu(m.relatedTarget)!=l[0])){l.dataSM("scroll-arrows").css("visibility","hidden")}}},menuScrollOver:function(n,o){if(f){if(!/^scroll-(up|down)/.test(o.target.className)&&this.getClosestMenu(o.target)==n[0]){this.menuScrollRefreshData(n);var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;n.dataSM("scroll-arrows").eq(0).css("margin-top",l).end().eq(1).css("margin-top",l+this.getViewportHeight()-m.arrowDownH).end().css("visibility","visible")}}},menuScrollRefreshData:function(n){var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;if(this.cssTransforms3d){l=-(parseFloat(n.css("margin-top"))-l)}a.extend(m,{upEnd:l,downEnd:l+this.getViewportHeight()-m.subH})},menuScrollStop:function(l){if(this.scrollTimeout){c(this.scrollTimeout);this.scrollTimeout=0;l.dataSM("scroll").step=1;return true}},menuScrollTouch:function(p,q){q=q.originalEvent;if(j(q)){var m=this.getTouchPoint(q);if(this.getClosestMenu(m.target)==p[0]){var o=p.dataSM("scroll");if(/(start|down)$/i.test(q.type)){if(this.menuScrollStop(p)){q.preventDefault();this.$touchScrollingSub=p}else{this.$touchScrollingSub=null}this.menuScrollRefreshData(p);a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}else{if(/move$/i.test(q.type)){var n=o.touchY!==undefined?o.touchY:o.touchStartY;if(n!==undefined&&n!=m.pageY){this.$touchScrollingSub=p;var l=n<m.pageY;if(o.up!==undefined&&o.up!=l){a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}a.extend(o,{up:l,touchY:m.pageY});this.menuScroll(p,true,Math.abs(m.pageY-n))}q.preventDefault()}else{if(o.touchY!==undefined){if(o.momentum=Math.pow(Math.abs(m.pageY-o.touchStartY)/(q.timeStamp-o.touchStartTime),2)*15){this.menuScrollStop(p);this.menuScroll(p);q.preventDefault()}delete o.touchY}}}}}},menuShow:function(n){if(!n.dataSM("beforefirstshowfired")){n.dataSM("beforefirstshowfired",true);if(this.$root.triggerHandler("beforefirstshow.smapi",n[0])===false){return}}if(this.$root.triggerHandler("beforeshow.smapi",n[0])===false){return}n.dataSM("shown-before",true).stop(true,true);if(!n.is(":visible")){var m=n.dataSM("parent-a");if(this.opts.keepHighlighted||this.isCollapsible()){m.addClass("highlighted")}if(this.isCollapsible()){n.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""})}else{n.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1);if(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth){n.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap");if(this.opts.subMenusMinWidth){n.css("min-width",this.opts.subMenusMinWidth)}if(this.opts.subMenusMaxWidth){var o=this.getWidth(n);n.css("max-width",this.opts.subMenusMaxWidth);if(o>this.getWidth(n)){n.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}}}this.menuPosition(n);if(n.dataSM("ie-shim")){n.dataSM("ie-shim").insertBefore(n)}}var l=function(){n.css("overflow","")};if(this.isCollapsible()){if(this.opts.collapsibleShowFunction){this.opts.collapsibleShowFunction.call(this,n,l)}else{n.show(this.opts.collapsibleShowDuration,l)}}else{if(this.opts.showFunction){this.opts.showFunction.call(this,n,l)}else{n.show(this.opts.showDuration,l)}}m.attr("aria-expanded","true");n.attr({"aria-expanded":"true","aria-hidden":"false"});this.visibleSubMenus.push(n);this.$root.triggerHandler("show.smapi",n[0])}},popupHide:function(l){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var m=this;this.hideTimeout=setTimeout(function(){m.menuHideAll()},l?1:this.opts.hideTimeout)},popupShow:function(o,n){if(!this.opts.isPopup){alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}this.$root.dataSM("shown-before",true).stop(true,true);if(!this.$root.is(":visible")){this.$root.css({left:o,top:n});this.menuIframeShim(this.$root);if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").css({zIndex:this.$root.css("z-index"),width:this.getWidth(this.$root),height:this.getHeight(this.$root),left:o,top:n}).insertBefore(this.$root)}var m=this,l=function(){m.$root.css("overflow","")};if(this.opts.showFunction){this.opts.showFunction.call(this,this.$root,l)}else{this.$root.show(this.opts.showDuration,l)}this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(true);this.init(true)},rootKeyDown:function(o){if(!this.handleEvents()){return}switch(o.keyCode){case 27:var m=this.activatedItems[0];if(m){this.menuHideAll();m[0].focus();var n=m.dataSM("sub");if(n){this.menuHide(n)}}break;case 32:var l=a(o.target);if(l.is("a")&&this.handleItemEvents(l)){var n=l.dataSM("sub");if(n&&!n.is(":visible")){this.itemClick({currentTarget:o.target});o.preventDefault()}}break}},rootOut:function(m){if(!this.handleEvents()||this.isTouchMode()||m.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}if(!this.opts.showOnClick||!this.opts.hideOnClick){var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(l){if(!this.handleEvents()||this.isTouchMode()||l.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}},winResize:function(m){if(!this.handleEvents()){if(this.$disableOverlay){var n=this.$root.offset();this.$disableOverlay.css({top:n.top,left:n.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}return}if(!("onorientationchange" in window)||m.type=="orientationchange"){var l=this.isCollapsible();if(!(this.wasCollapsible&&l)){if(this.activatedItems.length){this.activatedItems[this.activatedItems.length-1][0].blur()}this.menuHideAll()}this.wasCollapsible=l}}}});a.fn.dataSM=function(l,m){if(m){return this.data(l+"_smartmenus",m)}return this.data(l+"_smartmenus")};a.fn.removeDataSM=function(l){return this.removeData(l+"_smartmenus")};a.fn.smartmenus=function(m){if(typeof m=="string"){var l=arguments,o=m;Array.prototype.shift.call(l);return this.each(function(){var p=a(this).data("smartmenus");if(p&&p[o]){p[o].apply(p,l)}})}var n=a.extend({},a.fn.smartmenus.defaults,m);return this.each(function(){new a.SmartMenus(this,n)})};a.fn.smartmenus.defaults={isPopup:false,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:true,subIndicatorsPos:"prepend",subIndicatorsText:"+",scrollStep:30,scrollAccelerate:true,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(m,l){m.fadeOut(200,l)},collapsibleShowDuration:0,collapsibleShowFunction:function(m,l){m.slideDown(200,l)},collapsibleHideDuration:0,collapsibleHideFunction:function(m,l){m.slideUp(200,l)},showOnClick:false,hideOnClick:true,noMouseOver:false,keepInViewport:true,keepHighlighted:true,markCurrentItem:false,markCurrentTree:true,rightToLeftSubMenus:false,bottomToTopSubMenus:false,overlapControlsInIE:true};return a}));
\ No newline at end of file diff --git a/templates/html/mag.png b/templates/html/mag.png Binary files differindex 492f71f..858fea5 100644 --- a/templates/html/mag.png +++ b/templates/html/mag.png diff --git a/templates/html/mag_sel.png b/templates/html/mag_sel.png Binary files differindex 81f6040..39c0ed5 100644 --- a/templates/html/mag_sel.png +++ b/templates/html/mag_sel.png diff --git a/templates/html/menu.js b/templates/html/menu.js index 89aaf57..433c15b 100644 --- a/templates/html/menu.js +++ b/templates/html/menu.js @@ -40,7 +40,7 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); if (searchEnabled) { if (serverSide) { - $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>'); + $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>'); } else { $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>'); } diff --git a/templates/html/navtree.css b/templates/html/navtree.css index 7d1cb67..81c54c2 100644 --- a/templates/html/navtree.css +++ b/templates/html/navtree.css @@ -96,7 +96,7 @@ .ui-resizable-e { background-image:url("splitbar.png"); background-size:100%; - background-repeat:no-repeat; + background-repeat:repeat-y; background-attachment: scroll; cursor:ew-resize; height:100%; diff --git a/templates/html/navtree.js b/templates/html/navtree.js index e310bc9..7ce2935 100644 --- a/templates/html/navtree.js +++ b/templates/html/navtree.js @@ -23,7 +23,7 @@ */ var navTreeSubIndices = new Array(); var arrowDown = '▼'; -var arrowRight = '▶'; +var arrowRight = '►'; function getData(varName) { diff --git a/templates/html/search_functions.php b/templates/html/search_functions.php index caa9e3b..7374de9 100644 --- a/templates/html/search_functions.php +++ b/templates/html/search_functions.php @@ -1,4 +1,4 @@ -<script language="PHP"> +<?php require_once "search_config.php"; function end_form($value) @@ -363,4 +363,4 @@ function main() report_results($sorted); end_page(); } -</script> +?> diff --git a/templates/html/search_l.png b/templates/html/search_l.png Binary files differindex c872f4d..fd5f7da 100644 --- a/templates/html/search_l.png +++ b/templates/html/search_l.png diff --git a/templates/html/search_opensearch.php b/templates/html/search_opensearch.php index 58ee4ab..95c1c2c 100644 --- a/templates/html/search_opensearch.php +++ b/templates/html/search_opensearch.php @@ -1,4 +1,4 @@ -<script language="PHP"> +<?php require "search_functions.php"; $mode = array_key_exists('v', $_GET)?$_GET['v']:""; @@ -125,4 +125,4 @@ function invalid_format($query, array $results) print "Search results for '$query':\n\n"; print_r($results); } -</script> +?> diff --git a/templates/html/search_r.png b/templates/html/search_r.png Binary files differindex 97ee8b4..1af5d21 100644 --- a/templates/html/search_r.png +++ b/templates/html/search_r.png diff --git a/templates/html/tabs.css b/templates/html/tabs.css index a28614b..8ea7d54 100644 --- a/templates/html/tabs.css +++ b/templates/html/tabs.css @@ -1 +1 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#doc-content{overflow:auto;display:block;padding:0;margin:0;-webkit-overflow-scrolling:touch}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
\ No newline at end of file +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
\ No newline at end of file diff --git a/templates/latex/doxygen.sty b/templates/latex/doxygen.sty index e457acc..cf92712 100644 --- a/templates/latex/doxygen.sty +++ b/templates/latex/doxygen.sty @@ -11,8 +11,15 @@ \RequirePackage[table]{xcolor} \RequirePackage{longtable} \RequirePackage{tabu} +\RequirePackage{fancyvrb} \RequirePackage{tabularx} \RequirePackage{multirow} +\RequirePackage{hanging} +\RequirePackage{ifpdf} +\RequirePackage{adjustbox} +\RequirePackage{amssymb} +\RequirePackage{stackengine} +\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis %---------- Internal commands used in this style file ---------------- @@ -77,20 +84,53 @@ \end{alltt}% \normalsize% } +% Necessary for redefining not defined charcaters, i.e. "Replacement Character" in tex output. +\newlength{\CodeWidthChar} +\newlength{\CodeHeightChar} +\settowidth{\CodeWidthChar}{?} +\settoheight{\CodeHeightChar}{?} +% Necessary for hanging indent +\newlength{\DoxyCodeWidth} + +\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par} + +\newcommand\NiceSpace{% + \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}% +} % Used by @code ... @endcode -\newenvironment{DoxyCode}{% +\newenvironment{DoxyCode}[1]{% \par% \scriptsize% - \begin{alltt}% + \normalfont\ttfamily% + \rightskip0pt plus 1fil% + \settowidth{\DoxyCodeWidth}{000000}% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{\equal{#1}{0}} + { + {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% + } + { + {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% + } + }{% - \end{alltt}% + \normalfont% \normalsize% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% } +% Redefining not defined characters, i.e. "Replacement Character" in tex output. +\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{% + \textcolor{white}{\sffamily\bfseries\small ?}}{% + \rotatebox{45}{$\blacksquare$}}}} + % Used by @example, @include, @includelineno and @dontinclude -\newenvironment{DoxyCodeInclude}{% - \DoxyCode% +\newenvironment{DoxyCodeInclude}[1]{% + \DoxyCode{#1}% }{% \endDoxyCode% } @@ -150,6 +190,12 @@ \end{center}% } +% Used by @image +% (only if inline is specified) +\newenvironment{DoxyInlineImage}{% +}{% +} + % Used by @attention \newenvironment{DoxyAttention}[1]{% \begin{DoxyDesc}{#1}% @@ -273,10 +319,10 @@ \tabulinesep=1mm% \par% \ifthenelse{\equal{#1}{}}% - {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description {\ifthenelse{\equal{#1}{1}}% - {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc - {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc } \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% \hline% @@ -285,7 +331,7 @@ \hline% \endhead% }{% - \end{longtabu}% + \end{longtabu*}% \vspace{6pt}% } @@ -293,7 +339,7 @@ \newenvironment{DoxyFields}[1]{% \tabulinesep=1mm% \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \hline% \endfirsthead% @@ -301,7 +347,7 @@ \hline% \endhead% }{% - \end{longtabu}% + \end{longtabu*}% \vspace{6pt}% } @@ -309,7 +355,7 @@ \newenvironment{DoxyEnumFields}[1]{% \tabulinesep=1mm% \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \hline% \endfirsthead% @@ -317,7 +363,7 @@ \hline% \endhead% }{% - \end{longtabu}% + \end{longtabu*}% \vspace{6pt}% } @@ -331,7 +377,7 @@ \newenvironment{DoxyRetVals}[1]{% \tabulinesep=1mm% \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \hline% \endfirsthead% @@ -339,7 +385,7 @@ \hline% \endhead% }{% - \end{longtabu}% + \end{longtabu*}% \vspace{6pt}% } @@ -347,7 +393,7 @@ \newenvironment{DoxyExceptions}[1]{% \tabulinesep=1mm% \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \hline% \endfirsthead% @@ -355,7 +401,7 @@ \hline% \endhead% }{% - \end{longtabu}% + \end{longtabu*}% \vspace{6pt}% } @@ -363,7 +409,7 @@ \newenvironment{DoxyTemplParams}[1]{% \tabulinesep=1mm% \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \hline% \endfirsthead% @@ -371,7 +417,7 @@ \hline% \endhead% }{% - \end{longtabu}% + \end{longtabu*}% \vspace{6pt}% } @@ -439,11 +485,11 @@ \newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% \newenvironment{TabularC}[1]% {\tabulinesep=1mm -\begin{longtabu} spread 0pt [c]{*#1{|X[-1]}|}}% -{\end{longtabu}\par}% +\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}% +{\end{longtabu*}\par}% \newenvironment{TabularNC}[1]% -{\begin{tabu} spread 0pt [l]{*#1{|X[-1]}|}}% +{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}% {\end{tabu}\par}% % Used for member group headers diff --git a/templates/xml/compound.xsd b/templates/xml/compound.xsd index b4356ac..cf48e03 100644 --- a/templates/xml/compound.xsd +++ b/templates/xml/compound.xsd @@ -29,7 +29,7 @@ <xsd:element name="innergroup" type="refType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" /> <xsd:element name="sectiondef" type="sectiondefType" minOccurs="0" maxOccurs="unbounded" /> - <xsd:element name="tableofcontents" minOccurs="0" maxOccurs="1" /> + <xsd:element name="tableofcontents" type="tableofcontentsType" minOccurs="0" maxOccurs="1" /> <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" /> <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" /> <xsd:element name="inheritancegraph" type="graphType" minOccurs="0" /> @@ -384,6 +384,8 @@ <xsd:choice> <xsd:element name="ulink" type="docURLLink" /> <xsd:element name="bold" type="docMarkupType" /> + <xsd:element name="strike" type="docMarkupType" /> + <xsd:element name="underline" type="docMarkupType" /> <xsd:element name="emphasis" type="docMarkupType" /> <xsd:element name="computeroutput" type="docMarkupType" /> <xsd:element name="subscript" type="docMarkupType" /> @@ -400,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> @@ -641,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"> 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/015/015__cond_8c.xml b/testing/015/015__cond_8c.xml index 43cf335..bcc18b5 100644 --- a/testing/015/015__cond_8c.xml +++ b/testing/015/015__cond_8c.xml @@ -11,15 +11,17 @@ <briefdescription> </briefdescription> <detaileddescription> + <para>Function to be shown. </para> </detaileddescription> <inbodydescription> </inbodydescription> - <location file="015_cond.c" line="20" column="1" bodyfile="015_cond.c" bodystart="20" bodyend="22"/> + <location file="015_cond.c" line="21" column="1" bodyfile="015_cond.c" bodystart="21" bodyend="23"/> </memberdef> </sectiondef> <briefdescription> </briefdescription> <detaileddescription> + <para>Text <emphasis>argument</emphasis> more text. </para> </detaileddescription> <location file="015_cond.c"/> </compounddef> diff --git a/testing/015_cond.c b/testing/015_cond.c index ab3044c..0ac209d 100644 --- a/testing/015_cond.c +++ b/testing/015_cond.c @@ -1,4 +1,4 @@ -// objective: test the \cond command +// objective: test the `cond` command // check: 015__cond_8c.xml // config: ENABLED_SECTIONS = COND_ENABLED @@ -17,12 +17,14 @@ void func(); /// \endcond /// \cond COND_ENABLED +/// Function to be shown. void cond_enabled() { } /// \endcond /** \cond COND_DISABLED */ + Function not to be shown. void cond_disabled() { } 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><h1>Hello world</h1> + <para>Some text. <htmlonly block="yes"><h1>Hello world</h1> </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/mypage.xml b/testing/043/mypage.xml index 79fb7ae..c9bd6d0 100644 --- a/testing/043/mypage.xml +++ b/testing/043/mypage.xml @@ -4,7 +4,34 @@ <compoundname>mypage</compoundname> <title>Page Title</title> <innerpage refid="another">Another Page</innerpage> - <tableofcontents/> + <tableofcontents> + <tocsect> + <name>Section Title.</name> + <reference>mypage_1mysect</reference> + <tableofcontents> + <tocsect> + <name>Subsection Title.</name> + <reference>mypage_1mysubsect</reference> + <tableofcontents> + <tocsect> + <name>Subsubsection Title.</name> + <reference>mypage_1mysubsubsect</reference> + <tableofcontents> + <tocsect> + <name>Paragraph Title.</name> + <reference>mypage_1mypara</reference> + </tocsect> + </tableofcontents> + </tocsect> + </tableofcontents> + </tocsect> + </tableofcontents> + </tocsect> + <tocsect> + <name>Another Section Title.</name> + <reference>mypage_1mysect2</reference> + </tocsect> + </tableofcontents> <briefdescription> <para>Page brief description. </para> </briefdescription> diff --git a/testing/043_page.dox b/testing/043_page.dox index 38c1894..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 + * @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 & Less < Greater > Hash # Percent % Quote " Dot . Double colon :: Pipe | Plus + Minus - </para> + <para>Dollar $ At @ Backslash \ Ampersand & Less < Greater > 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/054/054__parblock_8cpp.xml b/testing/054/054__parblock_8cpp.xml index ae6e462..5567908 100644 --- a/testing/054/054__parblock_8cpp.xml +++ b/testing/054/054__parblock_8cpp.xml @@ -80,6 +80,96 @@ <parameterdescription> <para> <parblock> + <para>First paragraph of the param description.</para> + <para>Second paragraph of the param description. </para> + </parblock> + </para> + </parameterdescription> + </parameteritem> + </parameterlist> + </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="054_parblock.cpp" line="33" column="1"/> + </memberdef> + <memberdef kind="function" id="054__parblock_8cpp_1a5cded03ec9e6fd626da35ab05f624f39" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void function_2</definition> + <argsstring>(int client, int *resource, int parblock, int *test, int p)</argsstring> + <name>function_2</name> + <param> + <type>int</type> + <declname>client</declname> + </param> + <param> + <type>int *</type> + <declname>resource</declname> + </param> + <param> + <type>int</type> + <declname>parblock</declname> + </param> + <param> + <type>int *</type> + <declname>test</declname> + </param> + <param> + <type>int</type> + <declname>p</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>call by target-specific code to manage resources required by the client.</para> + <para> + <parameterlist kind="param"> + <parameteritem> + <parameternamelist> + <parametername direction="in">client</parametername> + </parameternamelist> + <parameterdescription> + <para>ID of client requesting resource. </para> + </parameterdescription> + </parameteritem> + <parameteritem> + <parameternamelist> + <parametername direction="out">resource</parametername> + </parameternamelist> + <parameterdescription> + <para>Requested resource </para> + </parameterdescription> + </parameteritem> + <parameteritem> + <parameternamelist> + <parametername direction="in">parblock</parametername> + </parameternamelist> + <parameterdescription> + <para> + <parblock> + <para>This is a test for the @parblock command.</para> + <para>A list if values for the parblock param:<itemizedlist><listitem><para>Item 1. This is short one-line description.</para></listitem><listitem><para>Item 2. This is a long bullet item; sometimes they wrap on multiple lines like this one.</para></listitem></itemizedlist> +</para> + <para>This is the second paragraph description for the @parblock parameter. Always end the text inside the @parblock command with an @endparblock command. </para> + </parblock> + </para> + </parameterdescription> + </parameteritem> + <parameteritem> + <parameternamelist> + <parametername direction="out">test</parametername> + </parameternamelist> + <parameterdescription> + <para>This is a test parameter for this function to see if it is included in the parameter table </para> + </parameterdescription> + </parameteritem> + <parameteritem> + <parameternamelist> + <parametername direction="in">p</parametername> + </parameternamelist> + <parameterdescription> + <para> + <parblock> <para>First paragraph of the param description. <verbatim> Second paragraph of the param description. </verbatim> </para> </parblock> @@ -91,7 +181,7 @@ </detaileddescription> <inbodydescription> </inbodydescription> - <location file="054_parblock.cpp" line="32" column="1"/> + <location file="054_parblock.cpp" line="60" column="1"/> </memberdef> </sectiondef> <briefdescription> diff --git a/testing/054_parblock.cpp b/testing/054_parblock.cpp index 186feb5..4f303c6 100644 --- a/testing/054_parblock.cpp +++ b/testing/054_parblock.cpp @@ -24,9 +24,37 @@ @endparblock @param[out] test This is a test parameter for this function to see if it is included in the parameter table + @param[in] p + @parblock First paragraph of the param description. + + Second paragraph of the param description. + @endparblock + */ +void function(int client,int *resource,int parblock,int *test,int p); +/** + call by target-specific code to manage resources required by the client. + + @param[in] client ID of client requesting resource. + @param[out] resource Requested resource + @param[in] parblock @parblock This is a test for the \@parblock + command. + + A list if values for the parblock param: + - Item 1. This is short one-line description. + - Item 2. This is a long bullet item; + sometimes they wrap on multiple lines like this + one. + + This is the second paragraph description for the + \@parblock parameter. Always end the text inside + the \@parblock command with an \@endparblock + command. + @endparblock + @param[out] test This is a test parameter for this function to see if + it is included in the parameter table @param[in] p @parblock First paragraph of the param description. Second paragraph of the param description. - @endparblock + @endparblock */ -void function(int client,int *resource,int parblock,int *test,int p); +void function_2(int client,int *resource,int parblock,int *test,int p); diff --git a/testing/067/067__link__varargs_8cpp.xml b/testing/067/067__link__varargs_8cpp.xml new file mode 100644 index 0000000..76eb543 --- /dev/null +++ b/testing/067/067__link__varargs_8cpp.xml @@ -0,0 +1,54 @@ +<?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="067__link__varargs_8cpp" kind="file" language="C++"> + <compoundname>067_link_varargs.cpp</compoundname> + <innerclass refid="class_test" prot="public">Test</innerclass> + <sectiondef kind="func"> + <memberdef kind="function" id="067__link__varargs_8cpp_1affb6da6cff1b57cdf8efc0123dceac9b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A function </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="067_link_varargs.cpp" line="11" column="1"/> + </memberdef> + <memberdef kind="function" id="067__link__varargs_8cpp_1a106e01084409028d1b41f5ad83fb82c1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p,...)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>...</type> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>Overloaded function taking variadic arguments </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="067_link_varargs.cpp" line="15" column="1"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>See <ref refid="067__link__varargs_8cpp_1a106e01084409028d1b41f5ad83fb82c1" kindref="member">the function</ref> for more info. See the <ref refid="class_test" kindref="compound">test</ref> class. </para> + </detaileddescription> + <location file="067_link_varargs.cpp"/> + </compounddef> +</doxygen> diff --git a/testing/067_link_varargs.cpp b/testing/067_link_varargs.cpp new file mode 100644 index 0000000..8cf25a2 --- /dev/null +++ b/testing/067_link_varargs.cpp @@ -0,0 +1,20 @@ +// objective: test \link command with function variadic arguments '...' +// check: 067__link__varargs_8cpp.xml + +/** \file + * See \link func(int,...) the function\endlink for more info. + * See the \link Test test\endlink class. + */ + +/** A function + */ +void func(int p); + +/** Overloaded function taking variadic arguments + */ +void func(int p, ...); + +/** A test */ +class Test +{ +}; diff --git a/testing/068/068__ref__varargs_8cpp.xml b/testing/068/068__ref__varargs_8cpp.xml new file mode 100644 index 0000000..8e0dc00 --- /dev/null +++ b/testing/068/068__ref__varargs_8cpp.xml @@ -0,0 +1,54 @@ +<?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="068__ref__varargs_8cpp" kind="file" language="C++"> + <compoundname>068_ref_varargs.cpp</compoundname> + <innerclass refid="class_test" prot="public">Test</innerclass> + <sectiondef kind="func"> + <memberdef kind="function" id="068__ref__varargs_8cpp_1affb6da6cff1b57cdf8efc0123dceac9b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A function </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="068_ref_varargs.cpp" line="11" column="1"/> + </memberdef> + <memberdef kind="function" id="068__ref__varargs_8cpp_1a106e01084409028d1b41f5ad83fb82c1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p,...)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>...</type> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>Overloaded function taking variadic arguments </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="068_ref_varargs.cpp" line="15" column="1"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>See <ref refid="068__ref__varargs_8cpp_1a106e01084409028d1b41f5ad83fb82c1" kindref="member">the function</ref> for more info. See the <ref refid="class_test" kindref="compound">test</ref> class. </para> + </detaileddescription> + <location file="068_ref_varargs.cpp"/> + </compounddef> +</doxygen> diff --git a/testing/068_ref_varargs.cpp b/testing/068_ref_varargs.cpp new file mode 100644 index 0000000..c85daa2 --- /dev/null +++ b/testing/068_ref_varargs.cpp @@ -0,0 +1,20 @@ +// objective: test \ref command with function variadic arguments '...' +// check: 068__ref__varargs_8cpp.xml + +/** \file + * See \ref func(int,...) "the function" for more info. + * See the \ref Test "test" class. + */ + +/** A function + */ +void func(int p); + +/** Overloaded function taking variadic arguments + */ +void func(int p, ...); + +/** A test */ +class Test +{ +}; diff --git a/testing/069/069__link__variadic__template_8cpp.xml b/testing/069/069__link__variadic__template_8cpp.xml new file mode 100644 index 0000000..c93a732 --- /dev/null +++ b/testing/069/069__link__variadic__template_8cpp.xml @@ -0,0 +1,309 @@ +<?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="069__link__variadic__template_8cpp" kind="file" language="C++"> + <compoundname>069_link_variadic_template.cpp</compoundname> + <innerclass refid="class_test" prot="public">Test</innerclass> + <sectiondef kind="func"> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1affb6da6cff1b57cdf8efc0123dceac9b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A function </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="40" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1aa7e4936a17759246bce60256cf224e16" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args &... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args &...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="45" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1ad6fc2d2a6cb8980f3e0eaacbd2ae41fe" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args &&... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args &&...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="50" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args &... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args &...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="55" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1aed64c596fea5f4f5e719006539922f7c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args &&... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args &&...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="60" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1a0ad18d95a1dc2dbacee657c43f719187" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args *... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args *...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="65" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1a2331eedd0a1db9da5de0ad0faef78a4e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args **... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args **...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="70" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1a72bd94e61df947347f98a2a6214e9342" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args *... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args *...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="75" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1a0bd03c39aa36ae51d2b8d87e04cf7eab" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args **... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args **...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="80" column="1"/> + </memberdef> + <memberdef kind="function" id="069__link__variadic__template_8cpp_1abb1e0338f72ae46a1240ada65d6a397c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="069_link_variadic_template.cpp" line="85" column="1"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + <para> + <simplesect kind="attention"> + <para> + <parblock> + <para>At the time of writing, the part between <> is totally ignored: func<Args...>(Args... args) is interpreted as func(Args... args).</para> + <para>Beware that a function parameter with either a & or * operator, e.g. 'const Args&... args', requires \link and \ref to specify such parameter as verbatim, i.e. 'const Args&... args'. At the time of writing, the form func(const Args&...) will fail, unless the function parameter was declared just as 'const Args&...'. </para> + </parblock> + </para> + </simplesect> + </para> + <para> + <ref refid="class_test_1a64d85df31d518e39726467315a9b05e3" kindref="member">variadic template method</ref> + </para> + <para>Links to the variadic template function overloads: <itemizedlist><listitem><para><ref refid="069__link__variadic__template_8cpp_1aa7e4936a17759246bce60256cf224e16" kindref="member">First overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1ad6fc2d2a6cb8980f3e0eaacbd2ae41fe" kindref="member">Second overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" kindref="member">Third overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1aed64c596fea5f4f5e719006539922f7c" kindref="member">Fourth overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1a0ad18d95a1dc2dbacee657c43f719187" kindref="member">Fifth overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1a2331eedd0a1db9da5de0ad0faef78a4e" kindref="member">Sixth overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1a72bd94e61df947347f98a2a6214e9342" kindref="member">Seventh overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1a0bd03c39aa36ae51d2b8d87e04cf7eab" kindref="member">Eighth overload</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1abb1e0338f72ae46a1240ada65d6a397c" kindref="member">Ninth overload</ref></para></listitem></itemizedlist> +The followings are interpreted the same: <itemizedlist><listitem><para><ref refid="069__link__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" kindref="member">without template argument</ref></para></listitem><listitem><para><ref refid="069__link__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" kindref="member">with template argument</ref></para></listitem></itemizedlist> +See the <ref refid="class_test" kindref="compound">test</ref> class. </para> + </detaileddescription> + <location file="069_link_variadic_template.cpp"/> + </compounddef> +</doxygen> diff --git a/testing/069_link_variadic_template.cpp b/testing/069_link_variadic_template.cpp new file mode 100644 index 0000000..89ab57c --- /dev/null +++ b/testing/069_link_variadic_template.cpp @@ -0,0 +1,95 @@ +// objective: test \link command with a variadic template function +// check: 069__link__variadic__template_8cpp.xml + +/** \file + * + * @attention + * @parblock + * At the time of writing, the part between \<\> is totally ignored: + * %func<Args...>(Args... args) is interpreted as %func(Args... args). + * + * Beware that a function parameter with either a \& or \* operator, + * e.g. 'const Args&... args', requires \\link and \\ref to specify + * such parameter as verbatim, i.e. 'const Args&... args'. At the + * time of writing, the form %func(const Args&...) will fail, unless + * the function parameter was declared just as 'const Args&...'. + * @endparblock + * + * \link Test::func(int,Args...)const variadic template method\endlink + * + * Links to the variadic template function overloads: + * @li \link func(int,Args&... args) First overload\endlink + * @li \link func(int,Args&&... args) Second overload\endlink + * @li \link func(int,const Args&... args) Third overload\endlink + * @li \link func(int,const Args&&... args) Fourth overload\endlink + * @li \link func(int,Args*... args) Fifth overload\endlink + * @li \link func(int,Args**... args) Sixth overload\endlink + * @li \link func(int,const Args*... args) Seventh overload\endlink + * @li \link func(int,const Args**... args) Eighth overload\endlink + * @li \link func(int,Args...) Ninth overload\endlink + * + * The followings are interpreted the same: + * @li \link func(int,const Args&... args) without template argument\endlink + * @li \link func<Args...>(int,const Args&... args) with template argument\endlink + * + * See the \link Test test\endlink class. + */ + +/** A function + */ +void func(int p); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args&&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args&&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args*... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args**... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args*... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args**... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args... args); + +/** A test */ +class Test +{ + public: + /** A variadic template method + */ + template <typename... Args> + void func(int p, Args... args) const; +}; diff --git a/testing/070/070__ref__variadic__template_8cpp.xml b/testing/070/070__ref__variadic__template_8cpp.xml new file mode 100644 index 0000000..0f581e5 --- /dev/null +++ b/testing/070/070__ref__variadic__template_8cpp.xml @@ -0,0 +1,309 @@ +<?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="070__ref__variadic__template_8cpp" kind="file" language="C++"> + <compoundname>070_ref_variadic_template.cpp</compoundname> + <innerclass refid="class_test" prot="public">Test</innerclass> + <sectiondef kind="func"> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1affb6da6cff1b57cdf8efc0123dceac9b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A function </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="40" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1aa7e4936a17759246bce60256cf224e16" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args &... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args &...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="45" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1ad6fc2d2a6cb8980f3e0eaacbd2ae41fe" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args &&... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args &&...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="50" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args &... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args &...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="55" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1aed64c596fea5f4f5e719006539922f7c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args &&... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args &&...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="60" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1a0ad18d95a1dc2dbacee657c43f719187" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args *... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args *...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="65" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1a2331eedd0a1db9da5de0ad0faef78a4e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args **... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args **...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="70" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1a72bd94e61df947347f98a2a6214e9342" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args *... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args *...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="75" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1a0bd03c39aa36ae51d2b8d87e04cf7eab" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, const Args **... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>const Args **...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="80" column="1"/> + </memberdef> + <memberdef kind="function" id="070__ref__variadic__template_8cpp_1abb1e0338f72ae46a1240ada65d6a397c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <templateparamlist> + <param> + <type>typename...</type> + <declname>Args</declname> + <defname>Args</defname> + </param> + </templateparamlist> + <type>void</type> + <definition>void func</definition> + <argsstring>(int p, Args... args)</argsstring> + <name>func</name> + <param> + <type>int</type> + <declname>p</declname> + </param> + <param> + <type>Args...</type> + <declname>args</declname> + </param> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>A variadic template function overload </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="070_ref_variadic_template.cpp" line="85" column="1"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + <para> + <simplesect kind="attention"> + <para> + <parblock> + <para>At the time of writing, the part between <> is totally ignored: func<Args...>(Args... args) is interpreted as func(Args... args).</para> + <para>Beware that a function parameter with either a & or * operator, e.g. 'const Args&... args', requires \link and \ref to specify such parameter as verbatim, i.e. 'const Args&... args'. At the time of writing, the form func(const Args&...) will fail, unless the function parameter was declared just as 'const Args&...'. </para> + </parblock> + </para> + </simplesect> + </para> + <para> + <ref refid="class_test_1a64d85df31d518e39726467315a9b05e3" kindref="member">variadic template method</ref> + </para> + <para>References to the variadic template function overloads: <itemizedlist><listitem><para><ref refid="070__ref__variadic__template_8cpp_1aa7e4936a17759246bce60256cf224e16" kindref="member">First overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1ad6fc2d2a6cb8980f3e0eaacbd2ae41fe" kindref="member">Second overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" kindref="member">Third overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1aed64c596fea5f4f5e719006539922f7c" kindref="member">Fourth overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1a0ad18d95a1dc2dbacee657c43f719187" kindref="member">Fifth overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1a2331eedd0a1db9da5de0ad0faef78a4e" kindref="member">Sixth overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1a72bd94e61df947347f98a2a6214e9342" kindref="member">Seventh overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1a0bd03c39aa36ae51d2b8d87e04cf7eab" kindref="member">Eighth overload</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1abb1e0338f72ae46a1240ada65d6a397c" kindref="member">Ninth overload</ref></para></listitem></itemizedlist> +The followings are interpreted the same: <itemizedlist><listitem><para><ref refid="070__ref__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" kindref="member">without template argument</ref></para></listitem><listitem><para><ref refid="070__ref__variadic__template_8cpp_1a708a5bf22646ed7233fe61b83182811a" kindref="member">with template argument</ref></para></listitem></itemizedlist> +See the <ref refid="class_test" kindref="compound">test</ref> class. </para> + </detaileddescription> + <location file="070_ref_variadic_template.cpp"/> + </compounddef> +</doxygen> diff --git a/testing/070_ref_variadic_template.cpp b/testing/070_ref_variadic_template.cpp new file mode 100644 index 0000000..376cebe --- /dev/null +++ b/testing/070_ref_variadic_template.cpp @@ -0,0 +1,95 @@ +// objective: test \ref command with a variadic template function +// check: 070__ref__variadic__template_8cpp.xml + +/** \file + * + * @attention + * @parblock + * At the time of writing, the part between \<\> is totally ignored: + * %func<Args...>(Args... args) is interpreted as %func(Args... args). + * + * Beware that a function parameter with either a \& or \* operator, + * e.g. 'const Args&... args', requires \\link and \\ref to specify + * such parameter as verbatim, i.e. 'const Args&... args'. At the + * time of writing, the form %func(const Args&...) will fail, unless + * the function parameter was declared just as 'const Args&...'. + * @endparblock + * + * \ref Test::func(int,Args...)const "variadic template method" + * + * References to the variadic template function overloads: + * @li \ref func(int,Args&... args) "First overload" + * @li \ref func(int,Args&&... args) "Second overload" + * @li \ref func(int,const Args&... args) "Third overload" + * @li \ref func(int,const Args&&... args) "Fourth overload" + * @li \ref func(int,Args*... args) "Fifth overload" + * @li \ref func(int,Args**... args) "Sixth overload" + * @li \ref func(int,const Args*... args) "Seventh overload" + * @li \ref func(int,const Args**... args) "Eighth overload" + * @li \ref func(int,Args...) "Ninth overload" + * + * The followings are interpreted the same: + * @li \ref func(int,const Args&... args) "without template argument" + * @li \ref func<Args...>(int,const Args&... args) "with template argument" + * + * See the \ref Test "test" class. + */ + +/** A function + */ +void func(int p); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args&&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args&&... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args*... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args**... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args*... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, const Args**... args); + +/** A variadic template function overload + */ +template <typename... Args> +void func(int p, Args... args); + +/** A test */ +class Test +{ + public: + /** A variadic template method + */ + template <typename... Args> + void func(int p, Args... args) const; +}; diff --git a/testing/071/namespace_a_namespace_1_1_0D0.xml b/testing/071/namespace_a_namespace_1_1_0D0.xml new file mode 100644 index 0000000..76483ca --- /dev/null +++ b/testing/071/namespace_a_namespace_1_1_0D0.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace_a_namespace_1_1_0D0" kind="namespace" language="C++"> + <compoundname>ANamespace::@0</compoundname> + <sectiondef kind="enum"> + <memberdef kind="enum" id="071__enum__in__anon__ns_8cpp_1a96ab6574751fdf6a53ceec8a3896c45d" prot="public" static="no" strong="yes"> + <type/> + <name>Boolean</name> + <enumvalue id="071__enum__in__anon__ns_8cpp_1a96ab6574751fdf6a53ceec8a3896c45daf8320b26d30ab433c5a54546d21f414c" prot="public"> + <name>False</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + </enumvalue> + <enumvalue id="071__enum__in__anon__ns_8cpp_1a96ab6574751fdf6a53ceec8a3896c45daf827cf462f62848df37c5e1e94a4da74" prot="public"> + <name>True</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + </enumvalue> + <enumvalue id="071__enum__in__anon__ns_8cpp_1a96ab6574751fdf6a53ceec8a3896c45da2767828026039e8ba7b38973cbb701f2" prot="public"> + <name>FileNotFound</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + </enumvalue> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="071_enum_in_anon_ns.cpp" line="6" column="1" bodyfile="071_enum_in_anon_ns.cpp" bodystart="6" bodyend="10"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="071_enum_in_anon_ns.cpp" line="4" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/071_enum_in_anon_ns.cpp b/testing/071_enum_in_anon_ns.cpp new file mode 100644 index 0000000..a5b9ac8 --- /dev/null +++ b/testing/071_enum_in_anon_ns.cpp @@ -0,0 +1,12 @@ +// objective: test that enum values in anonymous namespaces produce no warning +// check: namespace_a_namespace_1_1_0D0.xml + +namespace ANamespace { namespace { + +enum class Boolean { + False, + True, + FileNotFound +}; + +}} diff --git a/testing/067/067__using_8cpp.xml b/testing/072/072__using_8cpp.xml index c278161..e368966 100644 --- a/testing/067/067__using_8cpp.xml +++ b/testing/072/072__using_8cpp.xml @@ -1,9 +1,9 @@ <?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="067__using_8cpp" kind="file" language="C++"> - <compoundname>067_using.cpp</compoundname> + <compounddef id="072__using_8cpp" kind="file" language="C++"> + <compoundname>072_using.cpp</compoundname> <sectiondef kind="typedef"> - <memberdef kind="typedef" id="067__using_8cpp_1a1b01c504448c96cd2191a5184dd31acf" prot="public" static="no"> + <memberdef kind="typedef" id="072__using_8cpp_1a1b01c504448c96cd2191a5184dd31acf" prot="public" static="no"> <templateparamlist> <param> <type>class T</type> @@ -20,13 +20,13 @@ </detaileddescription> <inbodydescription> </inbodydescription> - <location file="067_using.cpp" line="7" column="1" bodyfile="067_using.cpp" bodystart="7" bodyend="-1"/> + <location file="072_using.cpp" line="7" column="1" bodyfile="072_using.cpp" bodystart="7" bodyend="-1"/> </memberdef> </sectiondef> <briefdescription> </briefdescription> <detaileddescription> </detaileddescription> - <location file="067_using.cpp"/> + <location file="072_using.cpp"/> </compounddef> </doxygen> diff --git a/testing/067_using.cpp b/testing/072_using.cpp index eb2f5cc..ca02902 100644 --- a/testing/067_using.cpp +++ b/testing/072_using.cpp @@ -1,5 +1,5 @@ // objective: test template parameters for a type alias -// check: 067__using_8cpp.xml +// check: 072__using_8cpp.xml /** \file */ diff --git a/testing/068/068__typed__enum_8cpp.xml b/testing/073/073__typed__enum_8cpp.xml index 880bf14..9dda417 100644 --- a/testing/068/068__typed__enum_8cpp.xml +++ b/testing/073/073__typed__enum_8cpp.xml @@ -1,9 +1,9 @@ <?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="068__typed__enum_8cpp" kind="file" language="C++"> - <compoundname>068_typed_enum.cpp</compoundname> + <compounddef id="073__typed__enum_8cpp" kind="file" language="C++"> + <compoundname>073_typed_enum.cpp</compoundname> <sectiondef kind="enum"> - <memberdef kind="enum" id="068__typed__enum_8cpp_1aa72902e6181db009a6a84502f81612c2" prot="public" static="no" strong="yes"> + <memberdef kind="enum" id="073__typed__enum_8cpp_1aa72902e6181db009a6a84502f81612c2" prot="public" static="no" strong="yes"> <type>unsigned short</type> <name>E</name> <briefdescription> @@ -13,13 +13,13 @@ </detaileddescription> <inbodydescription> </inbodydescription> - <location file="068_typed_enum.cpp" line="7" column="1" bodyfile="068_typed_enum.cpp" bodystart="7" bodyend="7"/> + <location file="073_typed_enum.cpp" line="7" column="1" bodyfile="073_typed_enum.cpp" bodystart="7" bodyend="7"/> </memberdef> </sectiondef> <briefdescription> </briefdescription> <detaileddescription> </detaileddescription> - <location file="068_typed_enum.cpp"/> + <location file="073_typed_enum.cpp"/> </compounddef> </doxygen> diff --git a/testing/068_typed_enum.cpp b/testing/073_typed_enum.cpp index 44c4123..0818463 100644 --- a/testing/068_typed_enum.cpp +++ b/testing/073_typed_enum.cpp @@ -1,5 +1,5 @@ // objective: test underlying type and strongness for an enum -// check: 068__typed__enum_8cpp.xml +// check: 073__typed__enum_8cpp.xml /** \file */ 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> &</type> + <definition>Foo& Foo::operator<<</definition> + <argsstring>(int i)</argsstring> + <name>operator<<</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> &</type> + <definition>const Foo& Foo::operator<<</definition> + <argsstring>(int i) const</argsstring> + <name>operator<<</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> &</type> + <definition>Foo& Foo::operator&=</definition> + <argsstring>(const Foo &rhs)</argsstring> + <name>operator&=</name> + <param> + <type>const <ref refid="struct_foo" kindref="compound">Foo</ref> &</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> &</type> + <definition>Foo& Foo::operator&=</definition> + <argsstring>(const Foo &rhs)</argsstring> + <name>operator&=</name> + <param> + <type>const <ref refid="struct_foo" kindref="compound">Foo</ref> &</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->*</definition> + <argsstring>(int *p)</argsstring> + <name>operator->*</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&=</name> + </member> + <member refid="struct_foo_1aa20bd44b1bb87a652ac65170ddfa1a5a" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>operator&=</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->*</name> + </member> + <member refid="struct_foo_1a279debd94d894223fa8468933e2d6188" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>operator<<</name> + </member> + <member refid="struct_foo_1a48bcc3de9b2f1ad09a3518a0c9f0da61" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>operator<<</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/075/struct_foo.xml b/testing/075/struct_foo.xml new file mode 100644 index 0000000..eca791b --- /dev/null +++ b/testing/075/struct_foo.xml @@ -0,0 +1,148 @@ +<?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_1a4f9767677227174b2a9684b92e36cba7" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Foo::foo</definition> + <argsstring>(float value)</argsstring> + <name>foo</name> + <param> + <type>float</type> + <declname>value</declname> + </param> + <briefdescription> + <para>Float. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="075_argmatch.cpp" line="5" column="1" bodyfile="075_argmatch.cpp" bodystart="14" bodyend="14"/> + </memberdef> + <memberdef kind="function" id="struct_foo_1a3b1460a8784e5cc8156899a04df08b94" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Foo::foo</definition> + <argsstring>(unsigned value)</argsstring> + <name>foo</name> + <param> + <type>unsigned</type> + <declname>value</declname> + </param> + <briefdescription> + <para>Unsigned int. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="075_argmatch.cpp" line="6" column="1" bodyfile="075_argmatch.cpp" bodystart="17" bodyend="17"/> + </memberdef> + <memberdef kind="function" id="struct_foo_1a87f5be128245c4a16b25500fe6ae2fd1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Foo::foo</definition> + <argsstring>(unsigned long)</argsstring> + <name>foo</name> + <param> + <type>unsigned long</type> + </param> + <briefdescription> + <para>Unnamed unsigned long. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="075_argmatch.cpp" line="7" column="1" bodyfile="075_argmatch.cpp" bodystart="20" bodyend="20"/> + </memberdef> + <memberdef kind="function" id="struct_foo_1adc1cd4494f8a556d5bf6cb78409e3e68" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Foo::foo</definition> + <argsstring>(signed long)</argsstring> + <name>foo</name> + <param> + <type>signed long</type> + </param> + <briefdescription> + <para>Unnamed signed long. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="075_argmatch.cpp" line="8" column="1" bodyfile="075_argmatch.cpp" bodystart="23" bodyend="23"/> + </memberdef> + <memberdef kind="function" id="struct_foo_1a0baba36cdd24740c6e39d5641e30a0fe" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Foo::foo</definition> + <argsstring>(const struct Foo)</argsstring> + <name>foo</name> + <param> + <type>const struct <ref refid="struct_foo" kindref="compound">Foo</ref></type> + </param> + <briefdescription> + <para>Unnamed struct foo. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="075_argmatch.cpp" line="9" column="1" bodyfile="075_argmatch.cpp" bodystart="26" bodyend="26"/> + </memberdef> + <memberdef kind="function" id="struct_foo_1abeaaeb54ad61db26205c06927968845f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Foo::foo</definition> + <argsstring>(const char *const, const double param2)</argsstring> + <name>foo</name> + <param> + <type>const char * const</type> + </param> + <param> + <type>const double</type> + <declname>param2</declname> + </param> + <briefdescription> + <para>Unnamed const pointer. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="075_argmatch.cpp" line="10" column="1"/> + </memberdef> + </sectiondef> + <briefdescription> + <para><ref refid="struct_foo" kindref="compound">Foo</ref>. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="075_argmatch.cpp" line="4" column="1" bodyfile="075_argmatch.cpp" bodystart="4" bodyend="11"/> + <listofallmembers> + <member refid="struct_foo_1a4f9767677227174b2a9684b92e36cba7" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>foo</name> + </member> + <member refid="struct_foo_1a3b1460a8784e5cc8156899a04df08b94" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>foo</name> + </member> + <member refid="struct_foo_1a87f5be128245c4a16b25500fe6ae2fd1" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>foo</name> + </member> + <member refid="struct_foo_1adc1cd4494f8a556d5bf6cb78409e3e68" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>foo</name> + </member> + <member refid="struct_foo_1a0baba36cdd24740c6e39d5641e30a0fe" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>foo</name> + </member> + <member refid="struct_foo_1abeaaeb54ad61db26205c06927968845f" prot="public" virt="non-virtual"> + <scope>Foo</scope> + <name>foo</name> + </member> + </listofallmembers> + </compounddef> +</doxygen> diff --git a/testing/075_argmatch.cpp b/testing/075_argmatch.cpp new file mode 100644 index 0000000..439cdca --- /dev/null +++ b/testing/075_argmatch.cpp @@ -0,0 +1,30 @@ +// objective: test argument matching in particular for unnamed types +// check: struct_foo.xml +/** @brief Foo */ +struct Foo { + void foo(float value); + void foo(unsigned value); + void foo(unsigned long); + void foo(signed long); + void foo(const struct Foo); + void foo(const char * const, const double param2); +}; + +/** @brief Float */ +void Foo::foo(float) {} + +/** @brief Unsigned int */ +void Foo::foo(unsigned value) {} + +/** @brief Unnamed unsigned long */ +void Foo::foo(unsigned long) {} + +/** @brief Unnamed signed long */ +void Foo::foo(signed long) {} + +/** @brief Unnamed struct foo */ +void Foo::foo(const struct Foo) {} + +/** @brief Unnamed const pointer */ +void Foo::foo(const char * const, const double param2); + diff --git a/testing/076/indexpage.xml b/testing/076/indexpage.xml new file mode 100644 index 0000000..5665d9b --- /dev/null +++ b/testing/076/indexpage.xml @@ -0,0 +1,1500 @@ +<?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="indexpage" kind="page"> + <compoundname>index</compoundname> + <title>Emoji test</title> + <briefdescription> + </briefdescription> + <detaileddescription> + <para><emoji name="+1" unicode="&#x1f44d;"/><emoji name="+1" unicode="&#x1f44d;"/> from "+1"<linebreak/> + <emoji name="-1" unicode="&#x1f44e;"/> <emoji name="-1" unicode="&#x1f44e;"/> from "-1"<linebreak/> + <emoji name="100" unicode="&#x1f4af;"/> <emoji name="100" unicode="&#x1f4af;"/> from "100"<linebreak/> + <emoji name="1234" unicode="&#x1f522;"/> <emoji name="1234" unicode="&#x1f522;"/> from "1234"<linebreak/> + <emoji name="1st_place_medal" unicode="&#x1f947;"/> <emoji name="1st_place_medal" unicode="&#x1f947;"/> from "1st_place_medal"<linebreak/> + <emoji name="2nd_place_medal" unicode="&#x1f948;"/> <emoji name="2nd_place_medal" unicode="&#x1f948;"/> from "2nd_place_medal"<linebreak/> + <emoji name="3rd_place_medal" unicode="&#x1f949;"/> <emoji name="3rd_place_medal" unicode="&#x1f949;"/> from "3rd_place_medal"<linebreak/> + <emoji name="8ball" unicode="&#x1f3b1;"/> <emoji name="8ball" unicode="&#x1f3b1;"/> from "8ball"<linebreak/> + <emoji name="a" unicode="&#x1f170;"/> <emoji name="a" unicode="&#x1f170;"/> from "a"<linebreak/> + <emoji name="ab" unicode="&#x1f18e;"/> <emoji name="ab" unicode="&#x1f18e;"/> from "ab"<linebreak/> + <emoji name="abc" unicode="&#x1f524;"/> <emoji name="abc" unicode="&#x1f524;"/> from "abc"<linebreak/> + <emoji name="abcd" unicode="&#x1f521;"/> <emoji name="abcd" unicode="&#x1f521;"/> from "abcd"<linebreak/> + <emoji name="accept" unicode="&#x1f251;"/> <emoji name="accept" unicode="&#x1f251;"/> from "accept"<linebreak/> + <emoji name="aerial_tramway" unicode="&#x1f6a1;"/> <emoji name="aerial_tramway" unicode="&#x1f6a1;"/> from "aerial_tramway"<linebreak/> + <emoji name="afghanistan" unicode="&#x1f1e6;&#x1f1eb;"/> <emoji name="afghanistan" unicode="&#x1f1e6;&#x1f1eb;"/> from "afghanistan"<linebreak/> + <emoji name="airplane" unicode="&#x2708;"/> <emoji name="airplane" unicode="&#x2708;"/> from "airplane"<linebreak/> + <emoji name="aland_islands" unicode="&#x1f1e6;&#x1f1fd;"/> <emoji name="aland_islands" unicode="&#x1f1e6;&#x1f1fd;"/> from "aland_islands"<linebreak/> + <emoji name="alarm_clock" unicode="&#x23f0;"/> <emoji name="alarm_clock" unicode="&#x23f0;"/> from "alarm_clock"<linebreak/> + <emoji name="albania" unicode="&#x1f1e6;&#x1f1f1;"/> <emoji name="albania" unicode="&#x1f1e6;&#x1f1f1;"/> from "albania"<linebreak/> + <emoji name="alembic" unicode="&#x2697;"/> <emoji name="alembic" unicode="&#x2697;"/> from "alembic"<linebreak/> + <emoji name="algeria" unicode="&#x1f1e9;&#x1f1ff;"/> <emoji name="algeria" unicode="&#x1f1e9;&#x1f1ff;"/> from "algeria"<linebreak/> + <emoji name="alien" unicode="&#x1f47d;"/> <emoji name="alien" unicode="&#x1f47d;"/> from "alien"<linebreak/> + <emoji name="ambulance" unicode="&#x1f691;"/> <emoji name="ambulance" unicode="&#x1f691;"/> from "ambulance"<linebreak/> + <emoji name="american_samoa" unicode="&#x1f1e6;&#x1f1f8;"/> <emoji name="american_samoa" unicode="&#x1f1e6;&#x1f1f8;"/> from "american_samoa"<linebreak/> + <emoji name="amphora" unicode="&#x1f3fa;"/> <emoji name="amphora" unicode="&#x1f3fa;"/> from "amphora"<linebreak/> + <emoji name="anchor" unicode="&#x2693;"/> <emoji name="anchor" unicode="&#x2693;"/> from "anchor"<linebreak/> + <emoji name="andorra" unicode="&#x1f1e6;&#x1f1e9;"/> <emoji name="andorra" unicode="&#x1f1e6;&#x1f1e9;"/> from "andorra"<linebreak/> + <emoji name="angel" unicode="&#x1f47c;"/> <emoji name="angel" unicode="&#x1f47c;"/> from "angel"<linebreak/> + <emoji name="anger" unicode="&#x1f4a2;"/> <emoji name="anger" unicode="&#x1f4a2;"/> from "anger"<linebreak/> + <emoji name="angola" unicode="&#x1f1e6;&#x1f1f4;"/> <emoji name="angola" unicode="&#x1f1e6;&#x1f1f4;"/> from "angola"<linebreak/> + <emoji name="angry" unicode="&#x1f620;"/> <emoji name="angry" unicode="&#x1f620;"/> from "angry"<linebreak/> + <emoji name="anguilla" unicode="&#x1f1e6;&#x1f1ee;"/> <emoji name="anguilla" unicode="&#x1f1e6;&#x1f1ee;"/> from "anguilla"<linebreak/> + <emoji name="anguished" unicode="&#x1f627;"/> <emoji name="anguished" unicode="&#x1f627;"/> from "anguished"<linebreak/> + <emoji name="ant" unicode="&#x1f41c;"/> <emoji name="ant" unicode="&#x1f41c;"/> from "ant"<linebreak/> + <emoji name="antarctica" unicode="&#x1f1e6;&#x1f1f6;"/> <emoji name="antarctica" unicode="&#x1f1e6;&#x1f1f6;"/> from "antarctica"<linebreak/> + <emoji name="antigua_barbuda" unicode="&#x1f1e6;&#x1f1ec;"/> <emoji name="antigua_barbuda" unicode="&#x1f1e6;&#x1f1ec;"/> from "antigua_barbuda"<linebreak/> + <emoji name="apple" unicode="&#x1f34e;"/> <emoji name="apple" unicode="&#x1f34e;"/> from "apple"<linebreak/> + <emoji name="aquarius" unicode="&#x2652;"/> <emoji name="aquarius" unicode="&#x2652;"/> from "aquarius"<linebreak/> + <emoji name="argentina" unicode="&#x1f1e6;&#x1f1f7;"/> <emoji name="argentina" unicode="&#x1f1e6;&#x1f1f7;"/> from "argentina"<linebreak/> + <emoji name="aries" unicode="&#x2648;"/> <emoji name="aries" unicode="&#x2648;"/> from "aries"<linebreak/> + <emoji name="armenia" unicode="&#x1f1e6;&#x1f1f2;"/> <emoji name="armenia" unicode="&#x1f1e6;&#x1f1f2;"/> from "armenia"<linebreak/> + <emoji name="arrow_backward" unicode="&#x25c0;"/> <emoji name="arrow_backward" unicode="&#x25c0;"/> from "arrow_backward"<linebreak/> + <emoji name="arrow_double_down" unicode="&#x23ec;"/> <emoji name="arrow_double_down" unicode="&#x23ec;"/> from "arrow_double_down"<linebreak/> + <emoji name="arrow_double_up" unicode="&#x23eb;"/> <emoji name="arrow_double_up" unicode="&#x23eb;"/> from "arrow_double_up"<linebreak/> + <emoji name="arrow_down" unicode="&#x2b07;"/> <emoji name="arrow_down" unicode="&#x2b07;"/> from "arrow_down"<linebreak/> + <emoji name="arrow_down_small" unicode="&#x1f53d;"/> <emoji name="arrow_down_small" unicode="&#x1f53d;"/> from "arrow_down_small"<linebreak/> + <emoji name="arrow_forward" unicode="&#x25b6;"/> <emoji name="arrow_forward" unicode="&#x25b6;"/> from "arrow_forward"<linebreak/> + <emoji name="arrow_heading_down" unicode="&#x2935;"/> <emoji name="arrow_heading_down" unicode="&#x2935;"/> from "arrow_heading_down"<linebreak/> + <emoji name="arrow_heading_up" unicode="&#x2934;"/> <emoji name="arrow_heading_up" unicode="&#x2934;"/> from "arrow_heading_up"<linebreak/> + <emoji name="arrow_left" unicode="&#x2b05;"/> <emoji name="arrow_left" unicode="&#x2b05;"/> from "arrow_left"<linebreak/> + <emoji name="arrow_lower_left" unicode="&#x2199;"/> <emoji name="arrow_lower_left" unicode="&#x2199;"/> from "arrow_lower_left"<linebreak/> + <emoji name="arrow_lower_right" unicode="&#x2198;"/> <emoji name="arrow_lower_right" unicode="&#x2198;"/> from "arrow_lower_right"<linebreak/> + <emoji name="arrow_right" unicode="&#x27a1;"/> <emoji name="arrow_right" unicode="&#x27a1;"/> from "arrow_right"<linebreak/> + <emoji name="arrow_right_hook" unicode="&#x21aa;"/> <emoji name="arrow_right_hook" unicode="&#x21aa;"/> from "arrow_right_hook"<linebreak/> + <emoji name="arrow_up" unicode="&#x2b06;"/> <emoji name="arrow_up" unicode="&#x2b06;"/> from "arrow_up"<linebreak/> + <emoji name="arrow_up_down" unicode="&#x2195;"/> <emoji name="arrow_up_down" unicode="&#x2195;"/> from "arrow_up_down"<linebreak/> + <emoji name="arrow_up_small" unicode="&#x1f53c;"/> <emoji name="arrow_up_small" unicode="&#x1f53c;"/> from "arrow_up_small"<linebreak/> + <emoji name="arrow_upper_left" unicode="&#x2196;"/> <emoji name="arrow_upper_left" unicode="&#x2196;"/> from "arrow_upper_left"<linebreak/> + <emoji name="arrow_upper_right" unicode="&#x2197;"/> <emoji name="arrow_upper_right" unicode="&#x2197;"/> from "arrow_upper_right"<linebreak/> + <emoji name="arrows_clockwise" unicode="&#x1f503;"/> <emoji name="arrows_clockwise" unicode="&#x1f503;"/> from "arrows_clockwise"<linebreak/> + <emoji name="arrows_counterclockwise" unicode="&#x1f504;"/> <emoji name="arrows_counterclockwise" unicode="&#x1f504;"/> from "arrows_counterclockwise"<linebreak/> + <emoji name="art" unicode="&#x1f3a8;"/> <emoji name="art" unicode="&#x1f3a8;"/> from "art"<linebreak/> + <emoji name="articulated_lorry" unicode="&#x1f69b;"/> <emoji name="articulated_lorry" unicode="&#x1f69b;"/> from "articulated_lorry"<linebreak/> + <emoji name="artificial_satellite" unicode="&#x1f6f0;"/> <emoji name="artificial_satellite" unicode="&#x1f6f0;"/> from "artificial_satellite"<linebreak/> + <emoji name="aruba" unicode="&#x1f1e6;&#x1f1fc;"/> <emoji name="aruba" unicode="&#x1f1e6;&#x1f1fc;"/> from "aruba"<linebreak/> + <emoji name="asterisk" unicode="&#x002a;&#x20e3;"/> <emoji name="asterisk" unicode="&#x002a;&#x20e3;"/> from "asterisk"<linebreak/> + <emoji name="astonished" unicode="&#x1f632;"/> <emoji name="astonished" unicode="&#x1f632;"/> from "astonished"<linebreak/> + <emoji name="athletic_shoe" unicode="&#x1f45f;"/> <emoji name="athletic_shoe" unicode="&#x1f45f;"/> from "athletic_shoe"<linebreak/> + <emoji name="atm" unicode="&#x1f3e7;"/> <emoji name="atm" unicode="&#x1f3e7;"/> from "atm"<linebreak/> + <emoji name="atom_symbol" unicode="&#x269b;"/> <emoji name="atom_symbol" unicode="&#x269b;"/> from "atom_symbol"<linebreak/> + <emoji name="australia" unicode="&#x1f1e6;&#x1f1fa;"/> <emoji name="australia" unicode="&#x1f1e6;&#x1f1fa;"/> from "australia"<linebreak/> + <emoji name="austria" unicode="&#x1f1e6;&#x1f1f9;"/> <emoji name="austria" unicode="&#x1f1e6;&#x1f1f9;"/> from "austria"<linebreak/> + <emoji name="avocado" unicode="&#x1f951;"/> <emoji name="avocado" unicode="&#x1f951;"/> from "avocado"<linebreak/> + <emoji name="azerbaijan" unicode="&#x1f1e6;&#x1f1ff;"/> <emoji name="azerbaijan" unicode="&#x1f1e6;&#x1f1ff;"/> from "azerbaijan"<linebreak/> + <emoji name="b" unicode="&#x1f171;"/> <emoji name="b" unicode="&#x1f171;"/> from "b"<linebreak/> + <emoji name="baby" unicode="&#x1f476;"/> <emoji name="baby" unicode="&#x1f476;"/> from "baby"<linebreak/> + <emoji name="baby_bottle" unicode="&#x1f37c;"/> <emoji name="baby_bottle" unicode="&#x1f37c;"/> from "baby_bottle"<linebreak/> + <emoji name="baby_chick" unicode="&#x1f424;"/> <emoji name="baby_chick" unicode="&#x1f424;"/> from "baby_chick"<linebreak/> + <emoji name="baby_symbol" unicode="&#x1f6bc;"/> <emoji name="baby_symbol" unicode="&#x1f6bc;"/> from "baby_symbol"<linebreak/> + <emoji name="back" unicode="&#x1f519;"/> <emoji name="back" unicode="&#x1f519;"/> from "back"<linebreak/> + <emoji name="bacon" unicode="&#x1f953;"/> <emoji name="bacon" unicode="&#x1f953;"/> from "bacon"<linebreak/> + <emoji name="badminton" unicode="&#x1f3f8;"/> <emoji name="badminton" unicode="&#x1f3f8;"/> from "badminton"<linebreak/> + <emoji name="baggage_claim" unicode="&#x1f6c4;"/> <emoji name="baggage_claim" unicode="&#x1f6c4;"/> from "baggage_claim"<linebreak/> + <emoji name="baguette_bread" unicode="&#x1f956;"/> <emoji name="baguette_bread" unicode="&#x1f956;"/> from "baguette_bread"<linebreak/> + <emoji name="bahamas" unicode="&#x1f1e7;&#x1f1f8;"/> <emoji name="bahamas" unicode="&#x1f1e7;&#x1f1f8;"/> from "bahamas"<linebreak/> + <emoji name="bahrain" unicode="&#x1f1e7;&#x1f1ed;"/> <emoji name="bahrain" unicode="&#x1f1e7;&#x1f1ed;"/> from "bahrain"<linebreak/> + <emoji name="balance_scale" unicode="&#x2696;"/> <emoji name="balance_scale" unicode="&#x2696;"/> from "balance_scale"<linebreak/> + <emoji name="balloon" unicode="&#x1f388;"/> <emoji name="balloon" unicode="&#x1f388;"/> from "balloon"<linebreak/> + <emoji name="ballot_box" unicode="&#x1f5f3;"/> <emoji name="ballot_box" unicode="&#x1f5f3;"/> from "ballot_box"<linebreak/> + <emoji name="ballot_box_with_check" unicode="&#x2611;"/> <emoji name="ballot_box_with_check" unicode="&#x2611;"/> from "ballot_box_with_check"<linebreak/> + <emoji name="bamboo" unicode="&#x1f38d;"/> <emoji name="bamboo" unicode="&#x1f38d;"/> from "bamboo"<linebreak/> + <emoji name="banana" unicode="&#x1f34c;"/> <emoji name="banana" unicode="&#x1f34c;"/> from "banana"<linebreak/> + <emoji name="bangbang" unicode="&#x203c;"/> <emoji name="bangbang" unicode="&#x203c;"/> from "bangbang"<linebreak/> + <emoji name="bangladesh" unicode="&#x1f1e7;&#x1f1e9;"/> <emoji name="bangladesh" unicode="&#x1f1e7;&#x1f1e9;"/> from "bangladesh"<linebreak/> + <emoji name="bank" unicode="&#x1f3e6;"/> <emoji name="bank" unicode="&#x1f3e6;"/> from "bank"<linebreak/> + <emoji name="bar_chart" unicode="&#x1f4ca;"/> <emoji name="bar_chart" unicode="&#x1f4ca;"/> from "bar_chart"<linebreak/> + <emoji name="barbados" unicode="&#x1f1e7;&#x1f1e7;"/> <emoji name="barbados" unicode="&#x1f1e7;&#x1f1e7;"/> from "barbados"<linebreak/> + <emoji name="barber" unicode="&#x1f488;"/> <emoji name="barber" unicode="&#x1f488;"/> from "barber"<linebreak/> + <emoji name="baseball" unicode="&#x26be;"/> <emoji name="baseball" unicode="&#x26be;"/> from "baseball"<linebreak/> + <emoji name="basketball" unicode="&#x1f3c0;"/> <emoji name="basketball" unicode="&#x1f3c0;"/> from "basketball"<linebreak/> + <emoji name="basketball_man" unicode="&#x26f9;"/> <emoji name="basketball_man" unicode="&#x26f9;"/> from "basketball_man"<linebreak/> + <emoji name="basketball_woman" unicode="&#x26f9;&#x2640;"/> <emoji name="basketball_woman" unicode="&#x26f9;&#x2640;"/> from "basketball_woman"<linebreak/> + <emoji name="bat" unicode="&#x1f987;"/> <emoji name="bat" unicode="&#x1f987;"/> from "bat"<linebreak/> + <emoji name="bath" unicode="&#x1f6c0;"/> <emoji name="bath" unicode="&#x1f6c0;"/> from "bath"<linebreak/> + <emoji name="bathtub" unicode="&#x1f6c1;"/> <emoji name="bathtub" unicode="&#x1f6c1;"/> from "bathtub"<linebreak/> + <emoji name="battery" unicode="&#x1f50b;"/> <emoji name="battery" unicode="&#x1f50b;"/> from "battery"<linebreak/> + <emoji name="beach_umbrella" unicode="&#x1f3d6;"/> <emoji name="beach_umbrella" unicode="&#x1f3d6;"/> from "beach_umbrella"<linebreak/> + <emoji name="bear" unicode="&#x1f43b;"/> <emoji name="bear" unicode="&#x1f43b;"/> from "bear"<linebreak/> + <emoji name="bed" unicode="&#x1f6cf;"/> <emoji name="bed" unicode="&#x1f6cf;"/> from "bed"<linebreak/> + <emoji name="bee" unicode="&#x1f41d;"/> <emoji name="bee" unicode="&#x1f41d;"/> from "bee"<linebreak/> + <emoji name="beer" unicode="&#x1f37a;"/> <emoji name="beer" unicode="&#x1f37a;"/> from "beer"<linebreak/> + <emoji name="beers" unicode="&#x1f37b;"/> <emoji name="beers" unicode="&#x1f37b;"/> from "beers"<linebreak/> + <emoji name="beetle" unicode="&#x1f41e;"/> <emoji name="beetle" unicode="&#x1f41e;"/> from "beetle"<linebreak/> + <emoji name="beginner" unicode="&#x1f530;"/> <emoji name="beginner" unicode="&#x1f530;"/> from "beginner"<linebreak/> + <emoji name="belarus" unicode="&#x1f1e7;&#x1f1fe;"/> <emoji name="belarus" unicode="&#x1f1e7;&#x1f1fe;"/> from "belarus"<linebreak/> + <emoji name="belgium" unicode="&#x1f1e7;&#x1f1ea;"/> <emoji name="belgium" unicode="&#x1f1e7;&#x1f1ea;"/> from "belgium"<linebreak/> + <emoji name="belize" unicode="&#x1f1e7;&#x1f1ff;"/> <emoji name="belize" unicode="&#x1f1e7;&#x1f1ff;"/> from "belize"<linebreak/> + <emoji name="bell" unicode="&#x1f514;"/> <emoji name="bell" unicode="&#x1f514;"/> from "bell"<linebreak/> + <emoji name="bellhop_bell" unicode="&#x1f6ce;"/> <emoji name="bellhop_bell" unicode="&#x1f6ce;"/> from "bellhop_bell"<linebreak/> + <emoji name="benin" unicode="&#x1f1e7;&#x1f1ef;"/> <emoji name="benin" unicode="&#x1f1e7;&#x1f1ef;"/> from "benin"<linebreak/> + <emoji name="bento" unicode="&#x1f371;"/> <emoji name="bento" unicode="&#x1f371;"/> from "bento"<linebreak/> + <emoji name="bermuda" unicode="&#x1f1e7;&#x1f1f2;"/> <emoji name="bermuda" unicode="&#x1f1e7;&#x1f1f2;"/> from "bermuda"<linebreak/> + <emoji name="bhutan" unicode="&#x1f1e7;&#x1f1f9;"/> <emoji name="bhutan" unicode="&#x1f1e7;&#x1f1f9;"/> from "bhutan"<linebreak/> + <emoji name="bicyclist" unicode="&#x1f6b4;"/> <emoji name="bicyclist" unicode="&#x1f6b4;"/> from "bicyclist"<linebreak/> + <emoji name="bike" unicode="&#x1f6b2;"/> <emoji name="bike" unicode="&#x1f6b2;"/> from "bike"<linebreak/> + <emoji name="biking_man" unicode="&#x1f6b4;"/> <emoji name="biking_man" unicode="&#x1f6b4;"/> from "biking_man"<linebreak/> + <emoji name="biking_woman" unicode="&#x1f6b4;&#x2640;"/> <emoji name="biking_woman" unicode="&#x1f6b4;&#x2640;"/> from "biking_woman"<linebreak/> + <emoji name="bikini" unicode="&#x1f459;"/> <emoji name="bikini" unicode="&#x1f459;"/> from "bikini"<linebreak/> + <emoji name="biohazard" unicode="&#x2623;"/> <emoji name="biohazard" unicode="&#x2623;"/> from "biohazard"<linebreak/> + <emoji name="bird" unicode="&#x1f426;"/> <emoji name="bird" unicode="&#x1f426;"/> from "bird"<linebreak/> + <emoji name="birthday" unicode="&#x1f382;"/> <emoji name="birthday" unicode="&#x1f382;"/> from "birthday"<linebreak/> + <emoji name="black_circle" unicode="&#x26ab;"/> <emoji name="black_circle" unicode="&#x26ab;"/> from "black_circle"<linebreak/> + <emoji name="black_flag" unicode="&#x1f3f4;"/> <emoji name="black_flag" unicode="&#x1f3f4;"/> from "black_flag"<linebreak/> + <emoji name="black_heart" unicode="&#x1f5a4;"/> <emoji name="black_heart" unicode="&#x1f5a4;"/> from "black_heart"<linebreak/> + <emoji name="black_joker" unicode="&#x1f0cf;"/> <emoji name="black_joker" unicode="&#x1f0cf;"/> from "black_joker"<linebreak/> + <emoji name="black_large_square" unicode="&#x2b1b;"/> <emoji name="black_large_square" unicode="&#x2b1b;"/> from "black_large_square"<linebreak/> + <emoji name="black_medium_small_square" unicode="&#x25fe;"/> <emoji name="black_medium_small_square" unicode="&#x25fe;"/> from "black_medium_small_square"<linebreak/> + <emoji name="black_medium_square" unicode="&#x25fc;"/> <emoji name="black_medium_square" unicode="&#x25fc;"/> from "black_medium_square"<linebreak/> + <emoji name="black_nib" unicode="&#x2712;"/> <emoji name="black_nib" unicode="&#x2712;"/> from "black_nib"<linebreak/> + <emoji name="black_small_square" unicode="&#x25aa;"/> <emoji name="black_small_square" unicode="&#x25aa;"/> from "black_small_square"<linebreak/> + <emoji name="black_square_button" unicode="&#x1f532;"/> <emoji name="black_square_button" unicode="&#x1f532;"/> from "black_square_button"<linebreak/> + <emoji name="blonde_man" unicode="&#x1f471;"/> <emoji name="blonde_man" unicode="&#x1f471;"/> from "blonde_man"<linebreak/> + <emoji name="blonde_woman" unicode="&#x1f471;&#x2640;"/> <emoji name="blonde_woman" unicode="&#x1f471;&#x2640;"/> from "blonde_woman"<linebreak/> + <emoji name="blossom" unicode="&#x1f33c;"/> <emoji name="blossom" unicode="&#x1f33c;"/> from "blossom"<linebreak/> + <emoji name="blowfish" unicode="&#x1f421;"/> <emoji name="blowfish" unicode="&#x1f421;"/> from "blowfish"<linebreak/> + <emoji name="blue_book" unicode="&#x1f4d8;"/> <emoji name="blue_book" unicode="&#x1f4d8;"/> from "blue_book"<linebreak/> + <emoji name="blue_car" unicode="&#x1f699;"/> <emoji name="blue_car" unicode="&#x1f699;"/> from "blue_car"<linebreak/> + <emoji name="blue_heart" unicode="&#x1f499;"/> <emoji name="blue_heart" unicode="&#x1f499;"/> from "blue_heart"<linebreak/> + <emoji name="blush" unicode="&#x1f60a;"/> <emoji name="blush" unicode="&#x1f60a;"/> from "blush"<linebreak/> + <emoji name="boar" unicode="&#x1f417;"/> <emoji name="boar" unicode="&#x1f417;"/> from "boar"<linebreak/> + <emoji name="boat" unicode="&#x26f5;"/> <emoji name="boat" unicode="&#x26f5;"/> from "boat"<linebreak/> + <emoji name="bolivia" unicode="&#x1f1e7;&#x1f1f4;"/> <emoji name="bolivia" unicode="&#x1f1e7;&#x1f1f4;"/> from "bolivia"<linebreak/> + <emoji name="bomb" unicode="&#x1f4a3;"/> <emoji name="bomb" unicode="&#x1f4a3;"/> from "bomb"<linebreak/> + <emoji name="book" unicode="&#x1f4d6;"/> <emoji name="book" unicode="&#x1f4d6;"/> from "book"<linebreak/> + <emoji name="bookmark" unicode="&#x1f516;"/> <emoji name="bookmark" unicode="&#x1f516;"/> from "bookmark"<linebreak/> + <emoji name="bookmark_tabs" unicode="&#x1f4d1;"/> <emoji name="bookmark_tabs" unicode="&#x1f4d1;"/> from "bookmark_tabs"<linebreak/> + <emoji name="books" unicode="&#x1f4da;"/> <emoji name="books" unicode="&#x1f4da;"/> from "books"<linebreak/> + <emoji name="boom" unicode="&#x1f4a5;"/> <emoji name="boom" unicode="&#x1f4a5;"/> from "boom"<linebreak/> + <emoji name="boot" unicode="&#x1f462;"/> <emoji name="boot" unicode="&#x1f462;"/> from "boot"<linebreak/> + <emoji name="bosnia_herzegovina" unicode="&#x1f1e7;&#x1f1e6;"/> <emoji name="bosnia_herzegovina" unicode="&#x1f1e7;&#x1f1e6;"/> from "bosnia_herzegovina"<linebreak/> + <emoji name="botswana" unicode="&#x1f1e7;&#x1f1fc;"/> <emoji name="botswana" unicode="&#x1f1e7;&#x1f1fc;"/> from "botswana"<linebreak/> + <emoji name="bouquet" unicode="&#x1f490;"/> <emoji name="bouquet" unicode="&#x1f490;"/> from "bouquet"<linebreak/> + <emoji name="bow" unicode="&#x1f647;"/> <emoji name="bow" unicode="&#x1f647;"/> from "bow"<linebreak/> + <emoji name="bow_and_arrow" unicode="&#x1f3f9;"/> <emoji name="bow_and_arrow" unicode="&#x1f3f9;"/> from "bow_and_arrow"<linebreak/> + <emoji name="bowing_man" unicode="&#x1f647;"/> <emoji name="bowing_man" unicode="&#x1f647;"/> from "bowing_man"<linebreak/> + <emoji name="bowing_woman" unicode="&#x1f647;&#x2640;"/> <emoji name="bowing_woman" unicode="&#x1f647;&#x2640;"/> from "bowing_woman"<linebreak/> + <emoji name="bowling" unicode="&#x1f3b3;"/> <emoji name="bowling" unicode="&#x1f3b3;"/> from "bowling"<linebreak/> + <emoji name="boxing_glove" unicode="&#x1f94a;"/> <emoji name="boxing_glove" unicode="&#x1f94a;"/> from "boxing_glove"<linebreak/> + <emoji name="boy" unicode="&#x1f466;"/> <emoji name="boy" unicode="&#x1f466;"/> from "boy"<linebreak/> + <emoji name="brazil" unicode="&#x1f1e7;&#x1f1f7;"/> <emoji name="brazil" unicode="&#x1f1e7;&#x1f1f7;"/> from "brazil"<linebreak/> + <emoji name="bread" unicode="&#x1f35e;"/> <emoji name="bread" unicode="&#x1f35e;"/> from "bread"<linebreak/> + <emoji name="bride_with_veil" unicode="&#x1f470;"/> <emoji name="bride_with_veil" unicode="&#x1f470;"/> from "bride_with_veil"<linebreak/> + <emoji name="bridge_at_night" unicode="&#x1f309;"/> <emoji name="bridge_at_night" unicode="&#x1f309;"/> from "bridge_at_night"<linebreak/> + <emoji name="briefcase" unicode="&#x1f4bc;"/> <emoji name="briefcase" unicode="&#x1f4bc;"/> from "briefcase"<linebreak/> + <emoji name="british_indian_ocean_territory" unicode="&#x1f1ee;&#x1f1f4;"/> <emoji name="british_indian_ocean_territory" unicode="&#x1f1ee;&#x1f1f4;"/> from "british_indian_ocean_territory"<linebreak/> + <emoji name="british_virgin_islands" unicode="&#x1f1fb;&#x1f1ec;"/> <emoji name="british_virgin_islands" unicode="&#x1f1fb;&#x1f1ec;"/> from "british_virgin_islands"<linebreak/> + <emoji name="broken_heart" unicode="&#x1f494;"/> <emoji name="broken_heart" unicode="&#x1f494;"/> from "broken_heart"<linebreak/> + <emoji name="brunei" unicode="&#x1f1e7;&#x1f1f3;"/> <emoji name="brunei" unicode="&#x1f1e7;&#x1f1f3;"/> from "brunei"<linebreak/> + <emoji name="bug" unicode="&#x1f41b;"/> <emoji name="bug" unicode="&#x1f41b;"/> from "bug"<linebreak/> + <emoji name="building_construction" unicode="&#x1f3d7;"/> <emoji name="building_construction" unicode="&#x1f3d7;"/> from "building_construction"<linebreak/> + <emoji name="bulb" unicode="&#x1f4a1;"/> <emoji name="bulb" unicode="&#x1f4a1;"/> from "bulb"<linebreak/> + <emoji name="bulgaria" unicode="&#x1f1e7;&#x1f1ec;"/> <emoji name="bulgaria" unicode="&#x1f1e7;&#x1f1ec;"/> from "bulgaria"<linebreak/> + <emoji name="bullettrain_front" unicode="&#x1f685;"/> <emoji name="bullettrain_front" unicode="&#x1f685;"/> from "bullettrain_front"<linebreak/> + <emoji name="bullettrain_side" unicode="&#x1f684;"/> <emoji name="bullettrain_side" unicode="&#x1f684;"/> from "bullettrain_side"<linebreak/> + <emoji name="burkina_faso" unicode="&#x1f1e7;&#x1f1eb;"/> <emoji name="burkina_faso" unicode="&#x1f1e7;&#x1f1eb;"/> from "burkina_faso"<linebreak/> + <emoji name="burrito" unicode="&#x1f32f;"/> <emoji name="burrito" unicode="&#x1f32f;"/> from "burrito"<linebreak/> + <emoji name="burundi" unicode="&#x1f1e7;&#x1f1ee;"/> <emoji name="burundi" unicode="&#x1f1e7;&#x1f1ee;"/> from "burundi"<linebreak/> + <emoji name="bus" unicode="&#x1f68c;"/> <emoji name="bus" unicode="&#x1f68c;"/> from "bus"<linebreak/> + <emoji name="business_suit_levitating" unicode="&#x1f574;"/> <emoji name="business_suit_levitating" unicode="&#x1f574;"/> from "business_suit_levitating"<linebreak/> + <emoji name="busstop" unicode="&#x1f68f;"/> <emoji name="busstop" unicode="&#x1f68f;"/> from "busstop"<linebreak/> + <emoji name="bust_in_silhouette" unicode="&#x1f464;"/> <emoji name="bust_in_silhouette" unicode="&#x1f464;"/> from "bust_in_silhouette"<linebreak/> + <emoji name="busts_in_silhouette" unicode="&#x1f465;"/> <emoji name="busts_in_silhouette" unicode="&#x1f465;"/> from "busts_in_silhouette"<linebreak/> + <emoji name="butterfly" unicode="&#x1f98b;"/> <emoji name="butterfly" unicode="&#x1f98b;"/> from "butterfly"<linebreak/> + <emoji name="cactus" unicode="&#x1f335;"/> <emoji name="cactus" unicode="&#x1f335;"/> from "cactus"<linebreak/> + <emoji name="cake" unicode="&#x1f370;"/> <emoji name="cake" unicode="&#x1f370;"/> from "cake"<linebreak/> + <emoji name="calendar" unicode="&#x1f4c6;"/> <emoji name="calendar" unicode="&#x1f4c6;"/> from "calendar"<linebreak/> + <emoji name="call_me_hand" unicode="&#x1f919;"/> <emoji name="call_me_hand" unicode="&#x1f919;"/> from "call_me_hand"<linebreak/> + <emoji name="calling" unicode="&#x1f4f2;"/> <emoji name="calling" unicode="&#x1f4f2;"/> from "calling"<linebreak/> + <emoji name="cambodia" unicode="&#x1f1f0;&#x1f1ed;"/> <emoji name="cambodia" unicode="&#x1f1f0;&#x1f1ed;"/> from "cambodia"<linebreak/> + <emoji name="camel" unicode="&#x1f42b;"/> <emoji name="camel" unicode="&#x1f42b;"/> from "camel"<linebreak/> + <emoji name="camera" unicode="&#x1f4f7;"/> <emoji name="camera" unicode="&#x1f4f7;"/> from "camera"<linebreak/> + <emoji name="camera_flash" unicode="&#x1f4f8;"/> <emoji name="camera_flash" unicode="&#x1f4f8;"/> from "camera_flash"<linebreak/> + <emoji name="cameroon" unicode="&#x1f1e8;&#x1f1f2;"/> <emoji name="cameroon" unicode="&#x1f1e8;&#x1f1f2;"/> from "cameroon"<linebreak/> + <emoji name="camping" unicode="&#x1f3d5;"/> <emoji name="camping" unicode="&#x1f3d5;"/> from "camping"<linebreak/> + <emoji name="canada" unicode="&#x1f1e8;&#x1f1e6;"/> <emoji name="canada" unicode="&#x1f1e8;&#x1f1e6;"/> from "canada"<linebreak/> + <emoji name="canary_islands" unicode="&#x1f1ee;&#x1f1e8;"/> <emoji name="canary_islands" unicode="&#x1f1ee;&#x1f1e8;"/> from "canary_islands"<linebreak/> + <emoji name="cancer" unicode="&#x264b;"/> <emoji name="cancer" unicode="&#x264b;"/> from "cancer"<linebreak/> + <emoji name="candle" unicode="&#x1f56f;"/> <emoji name="candle" unicode="&#x1f56f;"/> from "candle"<linebreak/> + <emoji name="candy" unicode="&#x1f36c;"/> <emoji name="candy" unicode="&#x1f36c;"/> from "candy"<linebreak/> + <emoji name="canoe" unicode="&#x1f6f6;"/> <emoji name="canoe" unicode="&#x1f6f6;"/> from "canoe"<linebreak/> + <emoji name="cape_verde" unicode="&#x1f1e8;&#x1f1fb;"/> <emoji name="cape_verde" unicode="&#x1f1e8;&#x1f1fb;"/> from "cape_verde"<linebreak/> + <emoji name="capital_abcd" unicode="&#x1f520;"/> <emoji name="capital_abcd" unicode="&#x1f520;"/> from "capital_abcd"<linebreak/> + <emoji name="capricorn" unicode="&#x2651;"/> <emoji name="capricorn" unicode="&#x2651;"/> from "capricorn"<linebreak/> + <emoji name="car" unicode="&#x1f697;"/> <emoji name="car" unicode="&#x1f697;"/> from "car"<linebreak/> + <emoji name="card_file_box" unicode="&#x1f5c3;"/> <emoji name="card_file_box" unicode="&#x1f5c3;"/> from "card_file_box"<linebreak/> + <emoji name="card_index" unicode="&#x1f4c7;"/> <emoji name="card_index" unicode="&#x1f4c7;"/> from "card_index"<linebreak/> + <emoji name="card_index_dividers" unicode="&#x1f5c2;"/> <emoji name="card_index_dividers" unicode="&#x1f5c2;"/> from "card_index_dividers"<linebreak/> + <emoji name="caribbean_netherlands" unicode="&#x1f1e7;&#x1f1f6;"/> <emoji name="caribbean_netherlands" unicode="&#x1f1e7;&#x1f1f6;"/> from "caribbean_netherlands"<linebreak/> + <emoji name="carousel_horse" unicode="&#x1f3a0;"/> <emoji name="carousel_horse" unicode="&#x1f3a0;"/> from "carousel_horse"<linebreak/> + <emoji name="carrot" unicode="&#x1f955;"/> <emoji name="carrot" unicode="&#x1f955;"/> from "carrot"<linebreak/> + <emoji name="cat" unicode="&#x1f431;"/> <emoji name="cat" unicode="&#x1f431;"/> from "cat"<linebreak/> + <emoji name="cat2" unicode="&#x1f408;"/> <emoji name="cat2" unicode="&#x1f408;"/> from "cat2"<linebreak/> + <emoji name="cayman_islands" unicode="&#x1f1f0;&#x1f1fe;"/> <emoji name="cayman_islands" unicode="&#x1f1f0;&#x1f1fe;"/> from "cayman_islands"<linebreak/> + <emoji name="cd" unicode="&#x1f4bf;"/> <emoji name="cd" unicode="&#x1f4bf;"/> from "cd"<linebreak/> + <emoji name="central_african_republic" unicode="&#x1f1e8;&#x1f1eb;"/> <emoji name="central_african_republic" unicode="&#x1f1e8;&#x1f1eb;"/> from "central_african_republic"<linebreak/> + <emoji name="chad" unicode="&#x1f1f9;&#x1f1e9;"/> <emoji name="chad" unicode="&#x1f1f9;&#x1f1e9;"/> from "chad"<linebreak/> + <emoji name="chains" unicode="&#x26d3;"/> <emoji name="chains" unicode="&#x26d3;"/> from "chains"<linebreak/> + <emoji name="champagne" unicode="&#x1f37e;"/> <emoji name="champagne" unicode="&#x1f37e;"/> from "champagne"<linebreak/> + <emoji name="chart" unicode="&#x1f4b9;"/> <emoji name="chart" unicode="&#x1f4b9;"/> from "chart"<linebreak/> + <emoji name="chart_with_downwards_trend" unicode="&#x1f4c9;"/> <emoji name="chart_with_downwards_trend" unicode="&#x1f4c9;"/> from "chart_with_downwards_trend"<linebreak/> + <emoji name="chart_with_upwards_trend" unicode="&#x1f4c8;"/> <emoji name="chart_with_upwards_trend" unicode="&#x1f4c8;"/> from "chart_with_upwards_trend"<linebreak/> + <emoji name="checkered_flag" unicode="&#x1f3c1;"/> <emoji name="checkered_flag" unicode="&#x1f3c1;"/> from "checkered_flag"<linebreak/> + <emoji name="cheese" unicode="&#x1f9c0;"/> <emoji name="cheese" unicode="&#x1f9c0;"/> from "cheese"<linebreak/> + <emoji name="cherries" unicode="&#x1f352;"/> <emoji name="cherries" unicode="&#x1f352;"/> from "cherries"<linebreak/> + <emoji name="cherry_blossom" unicode="&#x1f338;"/> <emoji name="cherry_blossom" unicode="&#x1f338;"/> from "cherry_blossom"<linebreak/> + <emoji name="chestnut" unicode="&#x1f330;"/> <emoji name="chestnut" unicode="&#x1f330;"/> from "chestnut"<linebreak/> + <emoji name="chicken" unicode="&#x1f414;"/> <emoji name="chicken" unicode="&#x1f414;"/> from "chicken"<linebreak/> + <emoji name="children_crossing" unicode="&#x1f6b8;"/> <emoji name="children_crossing" unicode="&#x1f6b8;"/> from "children_crossing"<linebreak/> + <emoji name="chile" unicode="&#x1f1e8;&#x1f1f1;"/> <emoji name="chile" unicode="&#x1f1e8;&#x1f1f1;"/> from "chile"<linebreak/> + <emoji name="chipmunk" unicode="&#x1f43f;"/> <emoji name="chipmunk" unicode="&#x1f43f;"/> from "chipmunk"<linebreak/> + <emoji name="chocolate_bar" unicode="&#x1f36b;"/> <emoji name="chocolate_bar" unicode="&#x1f36b;"/> from "chocolate_bar"<linebreak/> + <emoji name="christmas_island" unicode="&#x1f1e8;&#x1f1fd;"/> <emoji name="christmas_island" unicode="&#x1f1e8;&#x1f1fd;"/> from "christmas_island"<linebreak/> + <emoji name="christmas_tree" unicode="&#x1f384;"/> <emoji name="christmas_tree" unicode="&#x1f384;"/> from "christmas_tree"<linebreak/> + <emoji name="church" unicode="&#x26ea;"/> <emoji name="church" unicode="&#x26ea;"/> from "church"<linebreak/> + <emoji name="cinema" unicode="&#x1f3a6;"/> <emoji name="cinema" unicode="&#x1f3a6;"/> from "cinema"<linebreak/> + <emoji name="circus_tent" unicode="&#x1f3aa;"/> <emoji name="circus_tent" unicode="&#x1f3aa;"/> from "circus_tent"<linebreak/> + <emoji name="city_sunrise" unicode="&#x1f307;"/> <emoji name="city_sunrise" unicode="&#x1f307;"/> from "city_sunrise"<linebreak/> + <emoji name="city_sunset" unicode="&#x1f306;"/> <emoji name="city_sunset" unicode="&#x1f306;"/> from "city_sunset"<linebreak/> + <emoji name="cityscape" unicode="&#x1f3d9;"/> <emoji name="cityscape" unicode="&#x1f3d9;"/> from "cityscape"<linebreak/> + <emoji name="cl" unicode="&#x1f191;"/> <emoji name="cl" unicode="&#x1f191;"/> from "cl"<linebreak/> + <emoji name="clamp" unicode="&#x1f5dc;"/> <emoji name="clamp" unicode="&#x1f5dc;"/> from "clamp"<linebreak/> + <emoji name="clap" unicode="&#x1f44f;"/> <emoji name="clap" unicode="&#x1f44f;"/> from "clap"<linebreak/> + <emoji name="clapper" unicode="&#x1f3ac;"/> <emoji name="clapper" unicode="&#x1f3ac;"/> from "clapper"<linebreak/> + <emoji name="classical_building" unicode="&#x1f3db;"/> <emoji name="classical_building" unicode="&#x1f3db;"/> from "classical_building"<linebreak/> + <emoji name="clinking_glasses" unicode="&#x1f942;"/> <emoji name="clinking_glasses" unicode="&#x1f942;"/> from "clinking_glasses"<linebreak/> + <emoji name="clipboard" unicode="&#x1f4cb;"/> <emoji name="clipboard" unicode="&#x1f4cb;"/> from "clipboard"<linebreak/> + <emoji name="clock1" unicode="&#x1f550;"/> <emoji name="clock1" unicode="&#x1f550;"/> from "clock1"<linebreak/> + <emoji name="clock10" unicode="&#x1f559;"/> <emoji name="clock10" unicode="&#x1f559;"/> from "clock10"<linebreak/> + <emoji name="clock1030" unicode="&#x1f565;"/> <emoji name="clock1030" unicode="&#x1f565;"/> from "clock1030"<linebreak/> + <emoji name="clock11" unicode="&#x1f55a;"/> <emoji name="clock11" unicode="&#x1f55a;"/> from "clock11"<linebreak/> + <emoji name="clock1130" unicode="&#x1f566;"/> <emoji name="clock1130" unicode="&#x1f566;"/> from "clock1130"<linebreak/> + <emoji name="clock12" unicode="&#x1f55b;"/> <emoji name="clock12" unicode="&#x1f55b;"/> from "clock12"<linebreak/> + <emoji name="clock1230" unicode="&#x1f567;"/> <emoji name="clock1230" unicode="&#x1f567;"/> from "clock1230"<linebreak/> + <emoji name="clock130" unicode="&#x1f55c;"/> <emoji name="clock130" unicode="&#x1f55c;"/> from "clock130"<linebreak/> + <emoji name="clock2" unicode="&#x1f551;"/> <emoji name="clock2" unicode="&#x1f551;"/> from "clock2"<linebreak/> + <emoji name="clock230" unicode="&#x1f55d;"/> <emoji name="clock230" unicode="&#x1f55d;"/> from "clock230"<linebreak/> + <emoji name="clock3" unicode="&#x1f552;"/> <emoji name="clock3" unicode="&#x1f552;"/> from "clock3"<linebreak/> + <emoji name="clock330" unicode="&#x1f55e;"/> <emoji name="clock330" unicode="&#x1f55e;"/> from "clock330"<linebreak/> + <emoji name="clock4" unicode="&#x1f553;"/> <emoji name="clock4" unicode="&#x1f553;"/> from "clock4"<linebreak/> + <emoji name="clock430" unicode="&#x1f55f;"/> <emoji name="clock430" unicode="&#x1f55f;"/> from "clock430"<linebreak/> + <emoji name="clock5" unicode="&#x1f554;"/> <emoji name="clock5" unicode="&#x1f554;"/> from "clock5"<linebreak/> + <emoji name="clock530" unicode="&#x1f560;"/> <emoji name="clock530" unicode="&#x1f560;"/> from "clock530"<linebreak/> + <emoji name="clock6" unicode="&#x1f555;"/> <emoji name="clock6" unicode="&#x1f555;"/> from "clock6"<linebreak/> + <emoji name="clock630" unicode="&#x1f561;"/> <emoji name="clock630" unicode="&#x1f561;"/> from "clock630"<linebreak/> + <emoji name="clock7" unicode="&#x1f556;"/> <emoji name="clock7" unicode="&#x1f556;"/> from "clock7"<linebreak/> + <emoji name="clock730" unicode="&#x1f562;"/> <emoji name="clock730" unicode="&#x1f562;"/> from "clock730"<linebreak/> + <emoji name="clock8" unicode="&#x1f557;"/> <emoji name="clock8" unicode="&#x1f557;"/> from "clock8"<linebreak/> + <emoji name="clock830" unicode="&#x1f563;"/> <emoji name="clock830" unicode="&#x1f563;"/> from "clock830"<linebreak/> + <emoji name="clock9" unicode="&#x1f558;"/> <emoji name="clock9" unicode="&#x1f558;"/> from "clock9"<linebreak/> + <emoji name="clock930" unicode="&#x1f564;"/> <emoji name="clock930" unicode="&#x1f564;"/> from "clock930"<linebreak/> + <emoji name="closed_book" unicode="&#x1f4d5;"/> <emoji name="closed_book" unicode="&#x1f4d5;"/> from "closed_book"<linebreak/> + <emoji name="closed_lock_with_key" unicode="&#x1f510;"/> <emoji name="closed_lock_with_key" unicode="&#x1f510;"/> from "closed_lock_with_key"<linebreak/> + <emoji name="closed_umbrella" unicode="&#x1f302;"/> <emoji name="closed_umbrella" unicode="&#x1f302;"/> from "closed_umbrella"<linebreak/> + <emoji name="cloud" unicode="&#x2601;"/> <emoji name="cloud" unicode="&#x2601;"/> from "cloud"<linebreak/> + <emoji name="cloud_with_lightning" unicode="&#x1f329;"/> <emoji name="cloud_with_lightning" unicode="&#x1f329;"/> from "cloud_with_lightning"<linebreak/> + <emoji name="cloud_with_lightning_and_rain" unicode="&#x26c8;"/> <emoji name="cloud_with_lightning_and_rain" unicode="&#x26c8;"/> from "cloud_with_lightning_and_rain"<linebreak/> + <emoji name="cloud_with_rain" unicode="&#x1f327;"/> <emoji name="cloud_with_rain" unicode="&#x1f327;"/> from "cloud_with_rain"<linebreak/> + <emoji name="cloud_with_snow" unicode="&#x1f328;"/> <emoji name="cloud_with_snow" unicode="&#x1f328;"/> from "cloud_with_snow"<linebreak/> + <emoji name="clown_face" unicode="&#x1f921;"/> <emoji name="clown_face" unicode="&#x1f921;"/> from "clown_face"<linebreak/> + <emoji name="clubs" unicode="&#x2663;"/> <emoji name="clubs" unicode="&#x2663;"/> from "clubs"<linebreak/> + <emoji name="cn" unicode="&#x1f1e8;&#x1f1f3;"/> <emoji name="cn" unicode="&#x1f1e8;&#x1f1f3;"/> from "cn"<linebreak/> + <emoji name="cocktail" unicode="&#x1f378;"/> <emoji name="cocktail" unicode="&#x1f378;"/> from "cocktail"<linebreak/> + <emoji name="cocos_islands" unicode="&#x1f1e8;&#x1f1e8;"/> <emoji name="cocos_islands" unicode="&#x1f1e8;&#x1f1e8;"/> from "cocos_islands"<linebreak/> + <emoji name="coffee" unicode="&#x2615;"/> <emoji name="coffee" unicode="&#x2615;"/> from "coffee"<linebreak/> + <emoji name="coffin" unicode="&#x26b0;"/> <emoji name="coffin" unicode="&#x26b0;"/> from "coffin"<linebreak/> + <emoji name="cold_sweat" unicode="&#x1f630;"/> <emoji name="cold_sweat" unicode="&#x1f630;"/> from "cold_sweat"<linebreak/> + <emoji name="collision" unicode="&#x1f4a5;"/> <emoji name="collision" unicode="&#x1f4a5;"/> from "collision"<linebreak/> + <emoji name="colombia" unicode="&#x1f1e8;&#x1f1f4;"/> <emoji name="colombia" unicode="&#x1f1e8;&#x1f1f4;"/> from "colombia"<linebreak/> + <emoji name="comet" unicode="&#x2604;"/> <emoji name="comet" unicode="&#x2604;"/> from "comet"<linebreak/> + <emoji name="comoros" unicode="&#x1f1f0;&#x1f1f2;"/> <emoji name="comoros" unicode="&#x1f1f0;&#x1f1f2;"/> from "comoros"<linebreak/> + <emoji name="computer" unicode="&#x1f4bb;"/> <emoji name="computer" unicode="&#x1f4bb;"/> from "computer"<linebreak/> + <emoji name="computer_mouse" unicode="&#x1f5b1;"/> <emoji name="computer_mouse" unicode="&#x1f5b1;"/> from "computer_mouse"<linebreak/> + <emoji name="confetti_ball" unicode="&#x1f38a;"/> <emoji name="confetti_ball" unicode="&#x1f38a;"/> from "confetti_ball"<linebreak/> + <emoji name="confounded" unicode="&#x1f616;"/> <emoji name="confounded" unicode="&#x1f616;"/> from "confounded"<linebreak/> + <emoji name="confused" unicode="&#x1f615;"/> <emoji name="confused" unicode="&#x1f615;"/> from "confused"<linebreak/> + <emoji name="congo_brazzaville" unicode="&#x1f1e8;&#x1f1ec;"/> <emoji name="congo_brazzaville" unicode="&#x1f1e8;&#x1f1ec;"/> from "congo_brazzaville"<linebreak/> + <emoji name="congo_kinshasa" unicode="&#x1f1e8;&#x1f1e9;"/> <emoji name="congo_kinshasa" unicode="&#x1f1e8;&#x1f1e9;"/> from "congo_kinshasa"<linebreak/> + <emoji name="congratulations" unicode="&#x3297;"/> <emoji name="congratulations" unicode="&#x3297;"/> from "congratulations"<linebreak/> + <emoji name="construction" unicode="&#x1f6a7;"/> <emoji name="construction" unicode="&#x1f6a7;"/> from "construction"<linebreak/> + <emoji name="construction_worker" unicode="&#x1f477;"/> <emoji name="construction_worker" unicode="&#x1f477;"/> from "construction_worker"<linebreak/> + <emoji name="construction_worker_man" unicode="&#x1f477;"/> <emoji name="construction_worker_man" unicode="&#x1f477;"/> from "construction_worker_man"<linebreak/> + <emoji name="construction_worker_woman" unicode="&#x1f477;&#x2640;"/> <emoji name="construction_worker_woman" unicode="&#x1f477;&#x2640;"/> from "construction_worker_woman"<linebreak/> + <emoji name="control_knobs" unicode="&#x1f39b;"/> <emoji name="control_knobs" unicode="&#x1f39b;"/> from "control_knobs"<linebreak/> + <emoji name="convenience_store" unicode="&#x1f3ea;"/> <emoji name="convenience_store" unicode="&#x1f3ea;"/> from "convenience_store"<linebreak/> + <emoji name="cook_islands" unicode="&#x1f1e8;&#x1f1f0;"/> <emoji name="cook_islands" unicode="&#x1f1e8;&#x1f1f0;"/> from "cook_islands"<linebreak/> + <emoji name="cookie" unicode="&#x1f36a;"/> <emoji name="cookie" unicode="&#x1f36a;"/> from "cookie"<linebreak/> + <emoji name="cool" unicode="&#x1f192;"/> <emoji name="cool" unicode="&#x1f192;"/> from "cool"<linebreak/> + <emoji name="cop" unicode="&#x1f46e;"/> <emoji name="cop" unicode="&#x1f46e;"/> from "cop"<linebreak/> + <emoji name="copyright" unicode="&#x00a9;"/> <emoji name="copyright" unicode="&#x00a9;"/> from "copyright"<linebreak/> + <emoji name="corn" unicode="&#x1f33d;"/> <emoji name="corn" unicode="&#x1f33d;"/> from "corn"<linebreak/> + <emoji name="costa_rica" unicode="&#x1f1e8;&#x1f1f7;"/> <emoji name="costa_rica" unicode="&#x1f1e8;&#x1f1f7;"/> from "costa_rica"<linebreak/> + <emoji name="cote_divoire" unicode="&#x1f1e8;&#x1f1ee;"/> <emoji name="cote_divoire" unicode="&#x1f1e8;&#x1f1ee;"/> from "cote_divoire"<linebreak/> + <emoji name="couch_and_lamp" unicode="&#x1f6cb;"/> <emoji name="couch_and_lamp" unicode="&#x1f6cb;"/> from "couch_and_lamp"<linebreak/> + <emoji name="couple" unicode="&#x1f46b;"/> <emoji name="couple" unicode="&#x1f46b;"/> from "couple"<linebreak/> + <emoji name="couple_with_heart" unicode="&#x1f491;"/> <emoji name="couple_with_heart" unicode="&#x1f491;"/> from "couple_with_heart"<linebreak/> + <emoji name="couple_with_heart_man_man" unicode="&#x1f468;&#x2764;&#x1f468;"/> <emoji name="couple_with_heart_man_man" unicode="&#x1f468;&#x2764;&#x1f468;"/> from "couple_with_heart_man_man"<linebreak/> + <emoji name="couple_with_heart_woman_man" unicode="&#x1f491;"/> <emoji name="couple_with_heart_woman_man" unicode="&#x1f491;"/> from "couple_with_heart_woman_man"<linebreak/> + <emoji name="couple_with_heart_woman_woman" unicode="&#x1f469;&#x2764;&#x1f469;"/> <emoji name="couple_with_heart_woman_woman" unicode="&#x1f469;&#x2764;&#x1f469;"/> from "couple_with_heart_woman_woman"<linebreak/> + <emoji name="couplekiss_man_man" unicode="&#x1f468;&#x2764;&#x1f48b;&#x1f468;"/> <emoji name="couplekiss_man_man" unicode="&#x1f468;&#x2764;&#x1f48b;&#x1f468;"/> from "couplekiss_man_man"<linebreak/> + <emoji name="couplekiss_man_woman" unicode="&#x1f48f;"/> <emoji name="couplekiss_man_woman" unicode="&#x1f48f;"/> from "couplekiss_man_woman"<linebreak/> + <emoji name="couplekiss_woman_woman" unicode="&#x1f469;&#x2764;&#x1f48b;&#x1f469;"/> <emoji name="couplekiss_woman_woman" unicode="&#x1f469;&#x2764;&#x1f48b;&#x1f469;"/> from "couplekiss_woman_woman"<linebreak/> + <emoji name="cow" unicode="&#x1f42e;"/> <emoji name="cow" unicode="&#x1f42e;"/> from "cow"<linebreak/> + <emoji name="cow2" unicode="&#x1f404;"/> <emoji name="cow2" unicode="&#x1f404;"/> from "cow2"<linebreak/> + <emoji name="cowboy_hat_face" unicode="&#x1f920;"/> <emoji name="cowboy_hat_face" unicode="&#x1f920;"/> from "cowboy_hat_face"<linebreak/> + <emoji name="crab" unicode="&#x1f980;"/> <emoji name="crab" unicode="&#x1f980;"/> from "crab"<linebreak/> + <emoji name="crayon" unicode="&#x1f58d;"/> <emoji name="crayon" unicode="&#x1f58d;"/> from "crayon"<linebreak/> + <emoji name="credit_card" unicode="&#x1f4b3;"/> <emoji name="credit_card" unicode="&#x1f4b3;"/> from "credit_card"<linebreak/> + <emoji name="crescent_moon" unicode="&#x1f319;"/> <emoji name="crescent_moon" unicode="&#x1f319;"/> from "crescent_moon"<linebreak/> + <emoji name="cricket" unicode="&#x1f3cf;"/> <emoji name="cricket" unicode="&#x1f3cf;"/> from "cricket"<linebreak/> + <emoji name="croatia" unicode="&#x1f1ed;&#x1f1f7;"/> <emoji name="croatia" unicode="&#x1f1ed;&#x1f1f7;"/> from "croatia"<linebreak/> + <emoji name="crocodile" unicode="&#x1f40a;"/> <emoji name="crocodile" unicode="&#x1f40a;"/> from "crocodile"<linebreak/> + <emoji name="croissant" unicode="&#x1f950;"/> <emoji name="croissant" unicode="&#x1f950;"/> from "croissant"<linebreak/> + <emoji name="crossed_fingers" unicode="&#x1f91e;"/> <emoji name="crossed_fingers" unicode="&#x1f91e;"/> from "crossed_fingers"<linebreak/> + <emoji name="crossed_flags" unicode="&#x1f38c;"/> <emoji name="crossed_flags" unicode="&#x1f38c;"/> from "crossed_flags"<linebreak/> + <emoji name="crossed_swords" unicode="&#x2694;"/> <emoji name="crossed_swords" unicode="&#x2694;"/> from "crossed_swords"<linebreak/> + <emoji name="crown" unicode="&#x1f451;"/> <emoji name="crown" unicode="&#x1f451;"/> from "crown"<linebreak/> + <emoji name="cry" unicode="&#x1f622;"/> <emoji name="cry" unicode="&#x1f622;"/> from "cry"<linebreak/> + <emoji name="crying_cat_face" unicode="&#x1f63f;"/> <emoji name="crying_cat_face" unicode="&#x1f63f;"/> from "crying_cat_face"<linebreak/> + <emoji name="crystal_ball" unicode="&#x1f52e;"/> <emoji name="crystal_ball" unicode="&#x1f52e;"/> from "crystal_ball"<linebreak/> + <emoji name="cuba" unicode="&#x1f1e8;&#x1f1fa;"/> <emoji name="cuba" unicode="&#x1f1e8;&#x1f1fa;"/> from "cuba"<linebreak/> + <emoji name="cucumber" unicode="&#x1f952;"/> <emoji name="cucumber" unicode="&#x1f952;"/> from "cucumber"<linebreak/> + <emoji name="cupid" unicode="&#x1f498;"/> <emoji name="cupid" unicode="&#x1f498;"/> from "cupid"<linebreak/> + <emoji name="curacao" unicode="&#x1f1e8;&#x1f1fc;"/> <emoji name="curacao" unicode="&#x1f1e8;&#x1f1fc;"/> from "curacao"<linebreak/> + <emoji name="curly_loop" unicode="&#x27b0;"/> <emoji name="curly_loop" unicode="&#x27b0;"/> from "curly_loop"<linebreak/> + <emoji name="currency_exchange" unicode="&#x1f4b1;"/> <emoji name="currency_exchange" unicode="&#x1f4b1;"/> from "currency_exchange"<linebreak/> + <emoji name="curry" unicode="&#x1f35b;"/> <emoji name="curry" unicode="&#x1f35b;"/> from "curry"<linebreak/> + <emoji name="custard" unicode="&#x1f36e;"/> <emoji name="custard" unicode="&#x1f36e;"/> from "custard"<linebreak/> + <emoji name="customs" unicode="&#x1f6c3;"/> <emoji name="customs" unicode="&#x1f6c3;"/> from "customs"<linebreak/> + <emoji name="cyclone" unicode="&#x1f300;"/> <emoji name="cyclone" unicode="&#x1f300;"/> from "cyclone"<linebreak/> + <emoji name="cyprus" unicode="&#x1f1e8;&#x1f1fe;"/> <emoji name="cyprus" unicode="&#x1f1e8;&#x1f1fe;"/> from "cyprus"<linebreak/> + <emoji name="czech_republic" unicode="&#x1f1e8;&#x1f1ff;"/> <emoji name="czech_republic" unicode="&#x1f1e8;&#x1f1ff;"/> from "czech_republic"<linebreak/> + <emoji name="dagger" unicode="&#x1f5e1;"/> <emoji name="dagger" unicode="&#x1f5e1;"/> from "dagger"<linebreak/> + <emoji name="dancer" unicode="&#x1f483;"/> <emoji name="dancer" unicode="&#x1f483;"/> from "dancer"<linebreak/> + <emoji name="dancers" unicode="&#x1f46f;"/> <emoji name="dancers" unicode="&#x1f46f;"/> from "dancers"<linebreak/> + <emoji name="dancing_men" unicode="&#x1f46f;&#x2642;"/> <emoji name="dancing_men" unicode="&#x1f46f;&#x2642;"/> from "dancing_men"<linebreak/> + <emoji name="dancing_women" unicode="&#x1f46f;"/> <emoji name="dancing_women" unicode="&#x1f46f;"/> from "dancing_women"<linebreak/> + <emoji name="dango" unicode="&#x1f361;"/> <emoji name="dango" unicode="&#x1f361;"/> from "dango"<linebreak/> + <emoji name="dark_sunglasses" unicode="&#x1f576;"/> <emoji name="dark_sunglasses" unicode="&#x1f576;"/> from "dark_sunglasses"<linebreak/> + <emoji name="dart" unicode="&#x1f3af;"/> <emoji name="dart" unicode="&#x1f3af;"/> from "dart"<linebreak/> + <emoji name="dash" unicode="&#x1f4a8;"/> <emoji name="dash" unicode="&#x1f4a8;"/> from "dash"<linebreak/> + <emoji name="date" unicode="&#x1f4c5;"/> <emoji name="date" unicode="&#x1f4c5;"/> from "date"<linebreak/> + <emoji name="de" unicode="&#x1f1e9;&#x1f1ea;"/> <emoji name="de" unicode="&#x1f1e9;&#x1f1ea;"/> from "de"<linebreak/> + <emoji name="deciduous_tree" unicode="&#x1f333;"/> <emoji name="deciduous_tree" unicode="&#x1f333;"/> from "deciduous_tree"<linebreak/> + <emoji name="deer" unicode="&#x1f98c;"/> <emoji name="deer" unicode="&#x1f98c;"/> from "deer"<linebreak/> + <emoji name="denmark" unicode="&#x1f1e9;&#x1f1f0;"/> <emoji name="denmark" unicode="&#x1f1e9;&#x1f1f0;"/> from "denmark"<linebreak/> + <emoji name="department_store" unicode="&#x1f3ec;"/> <emoji name="department_store" unicode="&#x1f3ec;"/> from "department_store"<linebreak/> + <emoji name="derelict_house" unicode="&#x1f3da;"/> <emoji name="derelict_house" unicode="&#x1f3da;"/> from "derelict_house"<linebreak/> + <emoji name="desert" unicode="&#x1f3dc;"/> <emoji name="desert" unicode="&#x1f3dc;"/> from "desert"<linebreak/> + <emoji name="desert_island" unicode="&#x1f3dd;"/> <emoji name="desert_island" unicode="&#x1f3dd;"/> from "desert_island"<linebreak/> + <emoji name="desktop_computer" unicode="&#x1f5a5;"/> <emoji name="desktop_computer" unicode="&#x1f5a5;"/> from "desktop_computer"<linebreak/> + <emoji name="detective" unicode="&#x1f575;"/> <emoji name="detective" unicode="&#x1f575;"/> from "detective"<linebreak/> + <emoji name="diamond_shape_with_a_dot_inside" unicode="&#x1f4a0;"/> <emoji name="diamond_shape_with_a_dot_inside" unicode="&#x1f4a0;"/> from "diamond_shape_with_a_dot_inside"<linebreak/> + <emoji name="diamonds" unicode="&#x2666;"/> <emoji name="diamonds" unicode="&#x2666;"/> from "diamonds"<linebreak/> + <emoji name="disappointed" unicode="&#x1f61e;"/> <emoji name="disappointed" unicode="&#x1f61e;"/> from "disappointed"<linebreak/> + <emoji name="disappointed_relieved" unicode="&#x1f625;"/> <emoji name="disappointed_relieved" unicode="&#x1f625;"/> from "disappointed_relieved"<linebreak/> + <emoji name="dizzy" unicode="&#x1f4ab;"/> <emoji name="dizzy" unicode="&#x1f4ab;"/> from "dizzy"<linebreak/> + <emoji name="dizzy_face" unicode="&#x1f635;"/> <emoji name="dizzy_face" unicode="&#x1f635;"/> from "dizzy_face"<linebreak/> + <emoji name="djibouti" unicode="&#x1f1e9;&#x1f1ef;"/> <emoji name="djibouti" unicode="&#x1f1e9;&#x1f1ef;"/> from "djibouti"<linebreak/> + <emoji name="do_not_litter" unicode="&#x1f6af;"/> <emoji name="do_not_litter" unicode="&#x1f6af;"/> from "do_not_litter"<linebreak/> + <emoji name="dog" unicode="&#x1f436;"/> <emoji name="dog" unicode="&#x1f436;"/> from "dog"<linebreak/> + <emoji name="dog2" unicode="&#x1f415;"/> <emoji name="dog2" unicode="&#x1f415;"/> from "dog2"<linebreak/> + <emoji name="dollar" unicode="&#x1f4b5;"/> <emoji name="dollar" unicode="&#x1f4b5;"/> from "dollar"<linebreak/> + <emoji name="dolls" unicode="&#x1f38e;"/> <emoji name="dolls" unicode="&#x1f38e;"/> from "dolls"<linebreak/> + <emoji name="dolphin" unicode="&#x1f42c;"/> <emoji name="dolphin" unicode="&#x1f42c;"/> from "dolphin"<linebreak/> + <emoji name="dominica" unicode="&#x1f1e9;&#x1f1f2;"/> <emoji name="dominica" unicode="&#x1f1e9;&#x1f1f2;"/> from "dominica"<linebreak/> + <emoji name="dominican_republic" unicode="&#x1f1e9;&#x1f1f4;"/> <emoji name="dominican_republic" unicode="&#x1f1e9;&#x1f1f4;"/> from "dominican_republic"<linebreak/> + <emoji name="door" unicode="&#x1f6aa;"/> <emoji name="door" unicode="&#x1f6aa;"/> from "door"<linebreak/> + <emoji name="doughnut" unicode="&#x1f369;"/> <emoji name="doughnut" unicode="&#x1f369;"/> from "doughnut"<linebreak/> + <emoji name="dove" unicode="&#x1f54a;"/> <emoji name="dove" unicode="&#x1f54a;"/> from "dove"<linebreak/> + <emoji name="dragon" unicode="&#x1f409;"/> <emoji name="dragon" unicode="&#x1f409;"/> from "dragon"<linebreak/> + <emoji name="dragon_face" unicode="&#x1f432;"/> <emoji name="dragon_face" unicode="&#x1f432;"/> from "dragon_face"<linebreak/> + <emoji name="dress" unicode="&#x1f457;"/> <emoji name="dress" unicode="&#x1f457;"/> from "dress"<linebreak/> + <emoji name="dromedary_camel" unicode="&#x1f42a;"/> <emoji name="dromedary_camel" unicode="&#x1f42a;"/> from "dromedary_camel"<linebreak/> + <emoji name="drooling_face" unicode="&#x1f924;"/> <emoji name="drooling_face" unicode="&#x1f924;"/> from "drooling_face"<linebreak/> + <emoji name="droplet" unicode="&#x1f4a7;"/> <emoji name="droplet" unicode="&#x1f4a7;"/> from "droplet"<linebreak/> + <emoji name="drum" unicode="&#x1f941;"/> <emoji name="drum" unicode="&#x1f941;"/> from "drum"<linebreak/> + <emoji name="duck" unicode="&#x1f986;"/> <emoji name="duck" unicode="&#x1f986;"/> from "duck"<linebreak/> + <emoji name="dvd" unicode="&#x1f4c0;"/> <emoji name="dvd" unicode="&#x1f4c0;"/> from "dvd"<linebreak/> + <emoji name="e-mail" unicode="&#x1f4e7;"/> <emoji name="e-mail" unicode="&#x1f4e7;"/> from "e-mail"<linebreak/> + <emoji name="eagle" unicode="&#x1f985;"/> <emoji name="eagle" unicode="&#x1f985;"/> from "eagle"<linebreak/> + <emoji name="ear" unicode="&#x1f442;"/> <emoji name="ear" unicode="&#x1f442;"/> from "ear"<linebreak/> + <emoji name="ear_of_rice" unicode="&#x1f33e;"/> <emoji name="ear_of_rice" unicode="&#x1f33e;"/> from "ear_of_rice"<linebreak/> + <emoji name="earth_africa" unicode="&#x1f30d;"/> <emoji name="earth_africa" unicode="&#x1f30d;"/> from "earth_africa"<linebreak/> + <emoji name="earth_americas" unicode="&#x1f30e;"/> <emoji name="earth_americas" unicode="&#x1f30e;"/> from "earth_americas"<linebreak/> + <emoji name="earth_asia" unicode="&#x1f30f;"/> <emoji name="earth_asia" unicode="&#x1f30f;"/> from "earth_asia"<linebreak/> + <emoji name="ecuador" unicode="&#x1f1ea;&#x1f1e8;"/> <emoji name="ecuador" unicode="&#x1f1ea;&#x1f1e8;"/> from "ecuador"<linebreak/> + <emoji name="egg" unicode="&#x1f95a;"/> <emoji name="egg" unicode="&#x1f95a;"/> from "egg"<linebreak/> + <emoji name="eggplant" unicode="&#x1f346;"/> <emoji name="eggplant" unicode="&#x1f346;"/> from "eggplant"<linebreak/> + <emoji name="egypt" unicode="&#x1f1ea;&#x1f1ec;"/> <emoji name="egypt" unicode="&#x1f1ea;&#x1f1ec;"/> from "egypt"<linebreak/> + <emoji name="eight" unicode="&#x0038;&#x20e3;"/> <emoji name="eight" unicode="&#x0038;&#x20e3;"/> from "eight"<linebreak/> + <emoji name="eight_pointed_black_star" unicode="&#x2734;"/> <emoji name="eight_pointed_black_star" unicode="&#x2734;"/> from "eight_pointed_black_star"<linebreak/> + <emoji name="eight_spoked_asterisk" unicode="&#x2733;"/> <emoji name="eight_spoked_asterisk" unicode="&#x2733;"/> from "eight_spoked_asterisk"<linebreak/> + <emoji name="el_salvador" unicode="&#x1f1f8;&#x1f1fb;"/> <emoji name="el_salvador" unicode="&#x1f1f8;&#x1f1fb;"/> from "el_salvador"<linebreak/> + <emoji name="electric_plug" unicode="&#x1f50c;"/> <emoji name="electric_plug" unicode="&#x1f50c;"/> from "electric_plug"<linebreak/> + <emoji name="elephant" unicode="&#x1f418;"/> <emoji name="elephant" unicode="&#x1f418;"/> from "elephant"<linebreak/> + <emoji name="email" unicode="&#x2709;"/> <emoji name="email" unicode="&#x2709;"/> from "email"<linebreak/> + <emoji name="end" unicode="&#x1f51a;"/> <emoji name="end" unicode="&#x1f51a;"/> from "end"<linebreak/> + <emoji name="envelope" unicode="&#x2709;"/> <emoji name="envelope" unicode="&#x2709;"/> from "envelope"<linebreak/> + <emoji name="envelope_with_arrow" unicode="&#x1f4e9;"/> <emoji name="envelope_with_arrow" unicode="&#x1f4e9;"/> from "envelope_with_arrow"<linebreak/> + <emoji name="equatorial_guinea" unicode="&#x1f1ec;&#x1f1f6;"/> <emoji name="equatorial_guinea" unicode="&#x1f1ec;&#x1f1f6;"/> from "equatorial_guinea"<linebreak/> + <emoji name="eritrea" unicode="&#x1f1ea;&#x1f1f7;"/> <emoji name="eritrea" unicode="&#x1f1ea;&#x1f1f7;"/> from "eritrea"<linebreak/> + <emoji name="es" unicode="&#x1f1ea;&#x1f1f8;"/> <emoji name="es" unicode="&#x1f1ea;&#x1f1f8;"/> from "es"<linebreak/> + <emoji name="estonia" unicode="&#x1f1ea;&#x1f1ea;"/> <emoji name="estonia" unicode="&#x1f1ea;&#x1f1ea;"/> from "estonia"<linebreak/> + <emoji name="ethiopia" unicode="&#x1f1ea;&#x1f1f9;"/> <emoji name="ethiopia" unicode="&#x1f1ea;&#x1f1f9;"/> from "ethiopia"<linebreak/> + <emoji name="eu" unicode="&#x1f1ea;&#x1f1fa;"/> <emoji name="eu" unicode="&#x1f1ea;&#x1f1fa;"/> from "eu"<linebreak/> + <emoji name="euro" unicode="&#x1f4b6;"/> <emoji name="euro" unicode="&#x1f4b6;"/> from "euro"<linebreak/> + <emoji name="european_castle" unicode="&#x1f3f0;"/> <emoji name="european_castle" unicode="&#x1f3f0;"/> from "european_castle"<linebreak/> + <emoji name="european_post_office" unicode="&#x1f3e4;"/> <emoji name="european_post_office" unicode="&#x1f3e4;"/> from "european_post_office"<linebreak/> + <emoji name="european_union" unicode="&#x1f1ea;&#x1f1fa;"/> <emoji name="european_union" unicode="&#x1f1ea;&#x1f1fa;"/> from "european_union"<linebreak/> + <emoji name="evergreen_tree" unicode="&#x1f332;"/> <emoji name="evergreen_tree" unicode="&#x1f332;"/> from "evergreen_tree"<linebreak/> + <emoji name="exclamation" unicode="&#x2757;"/> <emoji name="exclamation" unicode="&#x2757;"/> from "exclamation"<linebreak/> + <emoji name="expressionless" unicode="&#x1f611;"/> <emoji name="expressionless" unicode="&#x1f611;"/> from "expressionless"<linebreak/> + <emoji name="eye" unicode="&#x1f441;"/> <emoji name="eye" unicode="&#x1f441;"/> from "eye"<linebreak/> + <emoji name="eye_speech_bubble" unicode="&#x1f441;&#x1f5e8;"/> <emoji name="eye_speech_bubble" unicode="&#x1f441;&#x1f5e8;"/> from "eye_speech_bubble"<linebreak/> + <emoji name="eyeglasses" unicode="&#x1f453;"/> <emoji name="eyeglasses" unicode="&#x1f453;"/> from "eyeglasses"<linebreak/> + <emoji name="eyes" unicode="&#x1f440;"/> <emoji name="eyes" unicode="&#x1f440;"/> from "eyes"<linebreak/> + <emoji name="face_with_head_bandage" unicode="&#x1f915;"/> <emoji name="face_with_head_bandage" unicode="&#x1f915;"/> from "face_with_head_bandage"<linebreak/> + <emoji name="face_with_thermometer" unicode="&#x1f912;"/> <emoji name="face_with_thermometer" unicode="&#x1f912;"/> from "face_with_thermometer"<linebreak/> + <emoji name="facepunch" unicode="&#x1f44a;"/> <emoji name="facepunch" unicode="&#x1f44a;"/> from "facepunch"<linebreak/> + <emoji name="factory" unicode="&#x1f3ed;"/> <emoji name="factory" unicode="&#x1f3ed;"/> from "factory"<linebreak/> + <emoji name="falkland_islands" unicode="&#x1f1eb;&#x1f1f0;"/> <emoji name="falkland_islands" unicode="&#x1f1eb;&#x1f1f0;"/> from "falkland_islands"<linebreak/> + <emoji name="fallen_leaf" unicode="&#x1f342;"/> <emoji name="fallen_leaf" unicode="&#x1f342;"/> from "fallen_leaf"<linebreak/> + <emoji name="family" unicode="&#x1f46a;"/> <emoji name="family" unicode="&#x1f46a;"/> from "family"<linebreak/> + <emoji name="family_man_boy" unicode="&#x1f468;&#x1f466;"/> <emoji name="family_man_boy" unicode="&#x1f468;&#x1f466;"/> from "family_man_boy"<linebreak/> + <emoji name="family_man_boy_boy" unicode="&#x1f468;&#x1f466;&#x1f466;"/> <emoji name="family_man_boy_boy" unicode="&#x1f468;&#x1f466;&#x1f466;"/> from "family_man_boy_boy"<linebreak/> + <emoji name="family_man_girl" unicode="&#x1f468;&#x1f467;"/> <emoji name="family_man_girl" unicode="&#x1f468;&#x1f467;"/> from "family_man_girl"<linebreak/> + <emoji name="family_man_girl_boy" unicode="&#x1f468;&#x1f467;&#x1f466;"/> <emoji name="family_man_girl_boy" unicode="&#x1f468;&#x1f467;&#x1f466;"/> from "family_man_girl_boy"<linebreak/> + <emoji name="family_man_girl_girl" unicode="&#x1f468;&#x1f467;&#x1f467;"/> <emoji name="family_man_girl_girl" unicode="&#x1f468;&#x1f467;&#x1f467;"/> from "family_man_girl_girl"<linebreak/> + <emoji name="family_man_man_boy" unicode="&#x1f468;&#x1f468;&#x1f466;"/> <emoji name="family_man_man_boy" unicode="&#x1f468;&#x1f468;&#x1f466;"/> from "family_man_man_boy"<linebreak/> + <emoji name="family_man_man_boy_boy" unicode="&#x1f468;&#x1f468;&#x1f466;&#x1f466;"/> <emoji name="family_man_man_boy_boy" unicode="&#x1f468;&#x1f468;&#x1f466;&#x1f466;"/> from "family_man_man_boy_boy"<linebreak/> + <emoji name="family_man_man_girl" unicode="&#x1f468;&#x1f468;&#x1f467;"/> <emoji name="family_man_man_girl" unicode="&#x1f468;&#x1f468;&#x1f467;"/> from "family_man_man_girl"<linebreak/> + <emoji name="family_man_man_girl_boy" unicode="&#x1f468;&#x1f468;&#x1f467;&#x1f466;"/> <emoji name="family_man_man_girl_boy" unicode="&#x1f468;&#x1f468;&#x1f467;&#x1f466;"/> from "family_man_man_girl_boy"<linebreak/> + <emoji name="family_man_man_girl_girl" unicode="&#x1f468;&#x1f468;&#x1f467;&#x1f467;"/> <emoji name="family_man_man_girl_girl" unicode="&#x1f468;&#x1f468;&#x1f467;&#x1f467;"/> from "family_man_man_girl_girl"<linebreak/> + <emoji name="family_man_woman_boy" unicode="&#x1f46a;"/> <emoji name="family_man_woman_boy" unicode="&#x1f46a;"/> from "family_man_woman_boy"<linebreak/> + <emoji name="family_man_woman_boy_boy" unicode="&#x1f468;&#x1f469;&#x1f466;&#x1f466;"/> <emoji name="family_man_woman_boy_boy" unicode="&#x1f468;&#x1f469;&#x1f466;&#x1f466;"/> from "family_man_woman_boy_boy"<linebreak/> + <emoji name="family_man_woman_girl" unicode="&#x1f468;&#x1f469;&#x1f467;"/> <emoji name="family_man_woman_girl" unicode="&#x1f468;&#x1f469;&#x1f467;"/> from "family_man_woman_girl"<linebreak/> + <emoji name="family_man_woman_girl_boy" unicode="&#x1f468;&#x1f469;&#x1f467;&#x1f466;"/> <emoji name="family_man_woman_girl_boy" unicode="&#x1f468;&#x1f469;&#x1f467;&#x1f466;"/> from "family_man_woman_girl_boy"<linebreak/> + <emoji name="family_man_woman_girl_girl" unicode="&#x1f468;&#x1f469;&#x1f467;&#x1f467;"/> <emoji name="family_man_woman_girl_girl" unicode="&#x1f468;&#x1f469;&#x1f467;&#x1f467;"/> from "family_man_woman_girl_girl"<linebreak/> + <emoji name="family_woman_boy" unicode="&#x1f469;&#x1f466;"/> <emoji name="family_woman_boy" unicode="&#x1f469;&#x1f466;"/> from "family_woman_boy"<linebreak/> + <emoji name="family_woman_boy_boy" unicode="&#x1f469;&#x1f466;&#x1f466;"/> <emoji name="family_woman_boy_boy" unicode="&#x1f469;&#x1f466;&#x1f466;"/> from "family_woman_boy_boy"<linebreak/> + <emoji name="family_woman_girl" unicode="&#x1f469;&#x1f467;"/> <emoji name="family_woman_girl" unicode="&#x1f469;&#x1f467;"/> from "family_woman_girl"<linebreak/> + <emoji name="family_woman_girl_boy" unicode="&#x1f469;&#x1f467;&#x1f466;"/> <emoji name="family_woman_girl_boy" unicode="&#x1f469;&#x1f467;&#x1f466;"/> from "family_woman_girl_boy"<linebreak/> + <emoji name="family_woman_girl_girl" unicode="&#x1f469;&#x1f467;&#x1f467;"/> <emoji name="family_woman_girl_girl" unicode="&#x1f469;&#x1f467;&#x1f467;"/> from "family_woman_girl_girl"<linebreak/> + <emoji name="family_woman_woman_boy" unicode="&#x1f469;&#x1f469;&#x1f466;"/> <emoji name="family_woman_woman_boy" unicode="&#x1f469;&#x1f469;&#x1f466;"/> from "family_woman_woman_boy"<linebreak/> + <emoji name="family_woman_woman_boy_boy" unicode="&#x1f469;&#x1f469;&#x1f466;&#x1f466;"/> <emoji name="family_woman_woman_boy_boy" unicode="&#x1f469;&#x1f469;&#x1f466;&#x1f466;"/> from "family_woman_woman_boy_boy"<linebreak/> + <emoji name="family_woman_woman_girl" unicode="&#x1f469;&#x1f469;&#x1f467;"/> <emoji name="family_woman_woman_girl" unicode="&#x1f469;&#x1f469;&#x1f467;"/> from "family_woman_woman_girl"<linebreak/> + <emoji name="family_woman_woman_girl_boy" unicode="&#x1f469;&#x1f469;&#x1f467;&#x1f466;"/> <emoji name="family_woman_woman_girl_boy" unicode="&#x1f469;&#x1f469;&#x1f467;&#x1f466;"/> from "family_woman_woman_girl_boy"<linebreak/> + <emoji name="family_woman_woman_girl_girl" unicode="&#x1f469;&#x1f469;&#x1f467;&#x1f467;"/> <emoji name="family_woman_woman_girl_girl" unicode="&#x1f469;&#x1f469;&#x1f467;&#x1f467;"/> from "family_woman_woman_girl_girl"<linebreak/> + <emoji name="faroe_islands" unicode="&#x1f1eb;&#x1f1f4;"/> <emoji name="faroe_islands" unicode="&#x1f1eb;&#x1f1f4;"/> from "faroe_islands"<linebreak/> + <emoji name="fast_forward" unicode="&#x23e9;"/> <emoji name="fast_forward" unicode="&#x23e9;"/> from "fast_forward"<linebreak/> + <emoji name="fax" unicode="&#x1f4e0;"/> <emoji name="fax" unicode="&#x1f4e0;"/> from "fax"<linebreak/> + <emoji name="fearful" unicode="&#x1f628;"/> <emoji name="fearful" unicode="&#x1f628;"/> from "fearful"<linebreak/> + <emoji name="feet" unicode="&#x1f43e;"/> <emoji name="feet" unicode="&#x1f43e;"/> from "feet"<linebreak/> + <emoji name="female_detective" unicode="&#x1f575;&#x2640;"/> <emoji name="female_detective" unicode="&#x1f575;&#x2640;"/> from "female_detective"<linebreak/> + <emoji name="ferris_wheel" unicode="&#x1f3a1;"/> <emoji name="ferris_wheel" unicode="&#x1f3a1;"/> from "ferris_wheel"<linebreak/> + <emoji name="ferry" unicode="&#x26f4;"/> <emoji name="ferry" unicode="&#x26f4;"/> from "ferry"<linebreak/> + <emoji name="field_hockey" unicode="&#x1f3d1;"/> <emoji name="field_hockey" unicode="&#x1f3d1;"/> from "field_hockey"<linebreak/> + <emoji name="fiji" unicode="&#x1f1eb;&#x1f1ef;"/> <emoji name="fiji" unicode="&#x1f1eb;&#x1f1ef;"/> from "fiji"<linebreak/> + <emoji name="file_cabinet" unicode="&#x1f5c4;"/> <emoji name="file_cabinet" unicode="&#x1f5c4;"/> from "file_cabinet"<linebreak/> + <emoji name="file_folder" unicode="&#x1f4c1;"/> <emoji name="file_folder" unicode="&#x1f4c1;"/> from "file_folder"<linebreak/> + <emoji name="film_projector" unicode="&#x1f4fd;"/> <emoji name="film_projector" unicode="&#x1f4fd;"/> from "film_projector"<linebreak/> + <emoji name="film_strip" unicode="&#x1f39e;"/> <emoji name="film_strip" unicode="&#x1f39e;"/> from "film_strip"<linebreak/> + <emoji name="finland" unicode="&#x1f1eb;&#x1f1ee;"/> <emoji name="finland" unicode="&#x1f1eb;&#x1f1ee;"/> from "finland"<linebreak/> + <emoji name="fire" unicode="&#x1f525;"/> <emoji name="fire" unicode="&#x1f525;"/> from "fire"<linebreak/> + <emoji name="fire_engine" unicode="&#x1f692;"/> <emoji name="fire_engine" unicode="&#x1f692;"/> from "fire_engine"<linebreak/> + <emoji name="fireworks" unicode="&#x1f386;"/> <emoji name="fireworks" unicode="&#x1f386;"/> from "fireworks"<linebreak/> + <emoji name="first_quarter_moon" unicode="&#x1f313;"/> <emoji name="first_quarter_moon" unicode="&#x1f313;"/> from "first_quarter_moon"<linebreak/> + <emoji name="first_quarter_moon_with_face" unicode="&#x1f31b;"/> <emoji name="first_quarter_moon_with_face" unicode="&#x1f31b;"/> from "first_quarter_moon_with_face"<linebreak/> + <emoji name="fish" unicode="&#x1f41f;"/> <emoji name="fish" unicode="&#x1f41f;"/> from "fish"<linebreak/> + <emoji name="fish_cake" unicode="&#x1f365;"/> <emoji name="fish_cake" unicode="&#x1f365;"/> from "fish_cake"<linebreak/> + <emoji name="fishing_pole_and_fish" unicode="&#x1f3a3;"/> <emoji name="fishing_pole_and_fish" unicode="&#x1f3a3;"/> from "fishing_pole_and_fish"<linebreak/> + <emoji name="fist" unicode="&#x270a;"/> <emoji name="fist" unicode="&#x270a;"/> from "fist"<linebreak/> + <emoji name="fist_left" unicode="&#x1f91b;"/> <emoji name="fist_left" unicode="&#x1f91b;"/> from "fist_left"<linebreak/> + <emoji name="fist_oncoming" unicode="&#x1f44a;"/> <emoji name="fist_oncoming" unicode="&#x1f44a;"/> from "fist_oncoming"<linebreak/> + <emoji name="fist_raised" unicode="&#x270a;"/> <emoji name="fist_raised" unicode="&#x270a;"/> from "fist_raised"<linebreak/> + <emoji name="fist_right" unicode="&#x1f91c;"/> <emoji name="fist_right" unicode="&#x1f91c;"/> from "fist_right"<linebreak/> + <emoji name="five" unicode="&#x0035;&#x20e3;"/> <emoji name="five" unicode="&#x0035;&#x20e3;"/> from "five"<linebreak/> + <emoji name="flags" unicode="&#x1f38f;"/> <emoji name="flags" unicode="&#x1f38f;"/> from "flags"<linebreak/> + <emoji name="flashlight" unicode="&#x1f526;"/> <emoji name="flashlight" unicode="&#x1f526;"/> from "flashlight"<linebreak/> + <emoji name="fleur_de_lis" unicode="&#x269c;"/> <emoji name="fleur_de_lis" unicode="&#x269c;"/> from "fleur_de_lis"<linebreak/> + <emoji name="flight_arrival" unicode="&#x1f6ec;"/> <emoji name="flight_arrival" unicode="&#x1f6ec;"/> from "flight_arrival"<linebreak/> + <emoji name="flight_departure" unicode="&#x1f6eb;"/> <emoji name="flight_departure" unicode="&#x1f6eb;"/> from "flight_departure"<linebreak/> + <emoji name="flipper" unicode="&#x1f42c;"/> <emoji name="flipper" unicode="&#x1f42c;"/> from "flipper"<linebreak/> + <emoji name="floppy_disk" unicode="&#x1f4be;"/> <emoji name="floppy_disk" unicode="&#x1f4be;"/> from "floppy_disk"<linebreak/> + <emoji name="flower_playing_cards" unicode="&#x1f3b4;"/> <emoji name="flower_playing_cards" unicode="&#x1f3b4;"/> from "flower_playing_cards"<linebreak/> + <emoji name="flushed" unicode="&#x1f633;"/> <emoji name="flushed" unicode="&#x1f633;"/> from "flushed"<linebreak/> + <emoji name="fog" unicode="&#x1f32b;"/> <emoji name="fog" unicode="&#x1f32b;"/> from "fog"<linebreak/> + <emoji name="foggy" unicode="&#x1f301;"/> <emoji name="foggy" unicode="&#x1f301;"/> from "foggy"<linebreak/> + <emoji name="football" unicode="&#x1f3c8;"/> <emoji name="football" unicode="&#x1f3c8;"/> from "football"<linebreak/> + <emoji name="footprints" unicode="&#x1f463;"/> <emoji name="footprints" unicode="&#x1f463;"/> from "footprints"<linebreak/> + <emoji name="fork_and_knife" unicode="&#x1f374;"/> <emoji name="fork_and_knife" unicode="&#x1f374;"/> from "fork_and_knife"<linebreak/> + <emoji name="fountain" unicode="&#x26f2;"/> <emoji name="fountain" unicode="&#x26f2;"/> from "fountain"<linebreak/> + <emoji name="fountain_pen" unicode="&#x1f58b;"/> <emoji name="fountain_pen" unicode="&#x1f58b;"/> from "fountain_pen"<linebreak/> + <emoji name="four" unicode="&#x0034;&#x20e3;"/> <emoji name="four" unicode="&#x0034;&#x20e3;"/> from "four"<linebreak/> + <emoji name="four_leaf_clover" unicode="&#x1f340;"/> <emoji name="four_leaf_clover" unicode="&#x1f340;"/> from "four_leaf_clover"<linebreak/> + <emoji name="fox_face" unicode="&#x1f98a;"/> <emoji name="fox_face" unicode="&#x1f98a;"/> from "fox_face"<linebreak/> + <emoji name="fr" unicode="&#x1f1eb;&#x1f1f7;"/> <emoji name="fr" unicode="&#x1f1eb;&#x1f1f7;"/> from "fr"<linebreak/> + <emoji name="framed_picture" unicode="&#x1f5bc;"/> <emoji name="framed_picture" unicode="&#x1f5bc;"/> from "framed_picture"<linebreak/> + <emoji name="free" unicode="&#x1f193;"/> <emoji name="free" unicode="&#x1f193;"/> from "free"<linebreak/> + <emoji name="french_guiana" unicode="&#x1f1ec;&#x1f1eb;"/> <emoji name="french_guiana" unicode="&#x1f1ec;&#x1f1eb;"/> from "french_guiana"<linebreak/> + <emoji name="french_polynesia" unicode="&#x1f1f5;&#x1f1eb;"/> <emoji name="french_polynesia" unicode="&#x1f1f5;&#x1f1eb;"/> from "french_polynesia"<linebreak/> + <emoji name="french_southern_territories" unicode="&#x1f1f9;&#x1f1eb;"/> <emoji name="french_southern_territories" unicode="&#x1f1f9;&#x1f1eb;"/> from "french_southern_territories"<linebreak/> + <emoji name="fried_egg" unicode="&#x1f373;"/> <emoji name="fried_egg" unicode="&#x1f373;"/> from "fried_egg"<linebreak/> + <emoji name="fried_shrimp" unicode="&#x1f364;"/> <emoji name="fried_shrimp" unicode="&#x1f364;"/> from "fried_shrimp"<linebreak/> + <emoji name="fries" unicode="&#x1f35f;"/> <emoji name="fries" unicode="&#x1f35f;"/> from "fries"<linebreak/> + <emoji name="frog" unicode="&#x1f438;"/> <emoji name="frog" unicode="&#x1f438;"/> from "frog"<linebreak/> + <emoji name="frowning" unicode="&#x1f626;"/> <emoji name="frowning" unicode="&#x1f626;"/> from "frowning"<linebreak/> + <emoji name="frowning_face" unicode="&#x2639;"/> <emoji name="frowning_face" unicode="&#x2639;"/> from "frowning_face"<linebreak/> + <emoji name="frowning_man" unicode="&#x1f64d;&#x2642;"/> <emoji name="frowning_man" unicode="&#x1f64d;&#x2642;"/> from "frowning_man"<linebreak/> + <emoji name="frowning_woman" unicode="&#x1f64d;"/> <emoji name="frowning_woman" unicode="&#x1f64d;"/> from "frowning_woman"<linebreak/> + <emoji name="fu" unicode="&#x1f595;"/> <emoji name="fu" unicode="&#x1f595;"/> from "fu"<linebreak/> + <emoji name="fuelpump" unicode="&#x26fd;"/> <emoji name="fuelpump" unicode="&#x26fd;"/> from "fuelpump"<linebreak/> + <emoji name="full_moon" unicode="&#x1f315;"/> <emoji name="full_moon" unicode="&#x1f315;"/> from "full_moon"<linebreak/> + <emoji name="full_moon_with_face" unicode="&#x1f31d;"/> <emoji name="full_moon_with_face" unicode="&#x1f31d;"/> from "full_moon_with_face"<linebreak/> + <emoji name="funeral_urn" unicode="&#x26b1;"/> <emoji name="funeral_urn" unicode="&#x26b1;"/> from "funeral_urn"<linebreak/> + <emoji name="gabon" unicode="&#x1f1ec;&#x1f1e6;"/> <emoji name="gabon" unicode="&#x1f1ec;&#x1f1e6;"/> from "gabon"<linebreak/> + <emoji name="gambia" unicode="&#x1f1ec;&#x1f1f2;"/> <emoji name="gambia" unicode="&#x1f1ec;&#x1f1f2;"/> from "gambia"<linebreak/> + <emoji name="game_die" unicode="&#x1f3b2;"/> <emoji name="game_die" unicode="&#x1f3b2;"/> from "game_die"<linebreak/> + <emoji name="gb" unicode="&#x1f1ec;&#x1f1e7;"/> <emoji name="gb" unicode="&#x1f1ec;&#x1f1e7;"/> from "gb"<linebreak/> + <emoji name="gear" unicode="&#x2699;"/> <emoji name="gear" unicode="&#x2699;"/> from "gear"<linebreak/> + <emoji name="gem" unicode="&#x1f48e;"/> <emoji name="gem" unicode="&#x1f48e;"/> from "gem"<linebreak/> + <emoji name="gemini" unicode="&#x264a;"/> <emoji name="gemini" unicode="&#x264a;"/> from "gemini"<linebreak/> + <emoji name="georgia" unicode="&#x1f1ec;&#x1f1ea;"/> <emoji name="georgia" unicode="&#x1f1ec;&#x1f1ea;"/> from "georgia"<linebreak/> + <emoji name="ghana" unicode="&#x1f1ec;&#x1f1ed;"/> <emoji name="ghana" unicode="&#x1f1ec;&#x1f1ed;"/> from "ghana"<linebreak/> + <emoji name="ghost" unicode="&#x1f47b;"/> <emoji name="ghost" unicode="&#x1f47b;"/> from "ghost"<linebreak/> + <emoji name="gibraltar" unicode="&#x1f1ec;&#x1f1ee;"/> <emoji name="gibraltar" unicode="&#x1f1ec;&#x1f1ee;"/> from "gibraltar"<linebreak/> + <emoji name="gift" unicode="&#x1f381;"/> <emoji name="gift" unicode="&#x1f381;"/> from "gift"<linebreak/> + <emoji name="gift_heart" unicode="&#x1f49d;"/> <emoji name="gift_heart" unicode="&#x1f49d;"/> from "gift_heart"<linebreak/> + <emoji name="girl" unicode="&#x1f467;"/> <emoji name="girl" unicode="&#x1f467;"/> from "girl"<linebreak/> + <emoji name="globe_with_meridians" unicode="&#x1f310;"/> <emoji name="globe_with_meridians" unicode="&#x1f310;"/> from "globe_with_meridians"<linebreak/> + <emoji name="goal_net" unicode="&#x1f945;"/> <emoji name="goal_net" unicode="&#x1f945;"/> from "goal_net"<linebreak/> + <emoji name="goat" unicode="&#x1f410;"/> <emoji name="goat" unicode="&#x1f410;"/> from "goat"<linebreak/> + <emoji name="golf" unicode="&#x26f3;"/> <emoji name="golf" unicode="&#x26f3;"/> from "golf"<linebreak/> + <emoji name="golfing_man" unicode="&#x1f3cc;"/> <emoji name="golfing_man" unicode="&#x1f3cc;"/> from "golfing_man"<linebreak/> + <emoji name="golfing_woman" unicode="&#x1f3cc;&#x2640;"/> <emoji name="golfing_woman" unicode="&#x1f3cc;&#x2640;"/> from "golfing_woman"<linebreak/> + <emoji name="gorilla" unicode="&#x1f98d;"/> <emoji name="gorilla" unicode="&#x1f98d;"/> from "gorilla"<linebreak/> + <emoji name="grapes" unicode="&#x1f347;"/> <emoji name="grapes" unicode="&#x1f347;"/> from "grapes"<linebreak/> + <emoji name="greece" unicode="&#x1f1ec;&#x1f1f7;"/> <emoji name="greece" unicode="&#x1f1ec;&#x1f1f7;"/> from "greece"<linebreak/> + <emoji name="green_apple" unicode="&#x1f34f;"/> <emoji name="green_apple" unicode="&#x1f34f;"/> from "green_apple"<linebreak/> + <emoji name="green_book" unicode="&#x1f4d7;"/> <emoji name="green_book" unicode="&#x1f4d7;"/> from "green_book"<linebreak/> + <emoji name="green_heart" unicode="&#x1f49a;"/> <emoji name="green_heart" unicode="&#x1f49a;"/> from "green_heart"<linebreak/> + <emoji name="green_salad" unicode="&#x1f957;"/> <emoji name="green_salad" unicode="&#x1f957;"/> from "green_salad"<linebreak/> + <emoji name="greenland" unicode="&#x1f1ec;&#x1f1f1;"/> <emoji name="greenland" unicode="&#x1f1ec;&#x1f1f1;"/> from "greenland"<linebreak/> + <emoji name="grenada" unicode="&#x1f1ec;&#x1f1e9;"/> <emoji name="grenada" unicode="&#x1f1ec;&#x1f1e9;"/> from "grenada"<linebreak/> + <emoji name="grey_exclamation" unicode="&#x2755;"/> <emoji name="grey_exclamation" unicode="&#x2755;"/> from "grey_exclamation"<linebreak/> + <emoji name="grey_question" unicode="&#x2754;"/> <emoji name="grey_question" unicode="&#x2754;"/> from "grey_question"<linebreak/> + <emoji name="grimacing" unicode="&#x1f62c;"/> <emoji name="grimacing" unicode="&#x1f62c;"/> from "grimacing"<linebreak/> + <emoji name="grin" unicode="&#x1f601;"/> <emoji name="grin" unicode="&#x1f601;"/> from "grin"<linebreak/> + <emoji name="grinning" unicode="&#x1f600;"/> <emoji name="grinning" unicode="&#x1f600;"/> from "grinning"<linebreak/> + <emoji name="guadeloupe" unicode="&#x1f1ec;&#x1f1f5;"/> <emoji name="guadeloupe" unicode="&#x1f1ec;&#x1f1f5;"/> from "guadeloupe"<linebreak/> + <emoji name="guam" unicode="&#x1f1ec;&#x1f1fa;"/> <emoji name="guam" unicode="&#x1f1ec;&#x1f1fa;"/> from "guam"<linebreak/> + <emoji name="guardsman" unicode="&#x1f482;"/> <emoji name="guardsman" unicode="&#x1f482;"/> from "guardsman"<linebreak/> + <emoji name="guardswoman" unicode="&#x1f482;&#x2640;"/> <emoji name="guardswoman" unicode="&#x1f482;&#x2640;"/> from "guardswoman"<linebreak/> + <emoji name="guatemala" unicode="&#x1f1ec;&#x1f1f9;"/> <emoji name="guatemala" unicode="&#x1f1ec;&#x1f1f9;"/> from "guatemala"<linebreak/> + <emoji name="guernsey" unicode="&#x1f1ec;&#x1f1ec;"/> <emoji name="guernsey" unicode="&#x1f1ec;&#x1f1ec;"/> from "guernsey"<linebreak/> + <emoji name="guinea" unicode="&#x1f1ec;&#x1f1f3;"/> <emoji name="guinea" unicode="&#x1f1ec;&#x1f1f3;"/> from "guinea"<linebreak/> + <emoji name="guinea_bissau" unicode="&#x1f1ec;&#x1f1fc;"/> <emoji name="guinea_bissau" unicode="&#x1f1ec;&#x1f1fc;"/> from "guinea_bissau"<linebreak/> + <emoji name="guitar" unicode="&#x1f3b8;"/> <emoji name="guitar" unicode="&#x1f3b8;"/> from "guitar"<linebreak/> + <emoji name="gun" unicode="&#x1f52b;"/> <emoji name="gun" unicode="&#x1f52b;"/> from "gun"<linebreak/> + <emoji name="guyana" unicode="&#x1f1ec;&#x1f1fe;"/> <emoji name="guyana" unicode="&#x1f1ec;&#x1f1fe;"/> from "guyana"<linebreak/> + <emoji name="haircut" unicode="&#x1f487;"/> <emoji name="haircut" unicode="&#x1f487;"/> from "haircut"<linebreak/> + <emoji name="haircut_man" unicode="&#x1f487;&#x2642;"/> <emoji name="haircut_man" unicode="&#x1f487;&#x2642;"/> from "haircut_man"<linebreak/> + <emoji name="haircut_woman" unicode="&#x1f487;"/> <emoji name="haircut_woman" unicode="&#x1f487;"/> from "haircut_woman"<linebreak/> + <emoji name="haiti" unicode="&#x1f1ed;&#x1f1f9;"/> <emoji name="haiti" unicode="&#x1f1ed;&#x1f1f9;"/> from "haiti"<linebreak/> + <emoji name="hamburger" unicode="&#x1f354;"/> <emoji name="hamburger" unicode="&#x1f354;"/> from "hamburger"<linebreak/> + <emoji name="hammer" unicode="&#x1f528;"/> <emoji name="hammer" unicode="&#x1f528;"/> from "hammer"<linebreak/> + <emoji name="hammer_and_pick" unicode="&#x2692;"/> <emoji name="hammer_and_pick" unicode="&#x2692;"/> from "hammer_and_pick"<linebreak/> + <emoji name="hammer_and_wrench" unicode="&#x1f6e0;"/> <emoji name="hammer_and_wrench" unicode="&#x1f6e0;"/> from "hammer_and_wrench"<linebreak/> + <emoji name="hamster" unicode="&#x1f439;"/> <emoji name="hamster" unicode="&#x1f439;"/> from "hamster"<linebreak/> + <emoji name="hand" unicode="&#x270b;"/> <emoji name="hand" unicode="&#x270b;"/> from "hand"<linebreak/> + <emoji name="handbag" unicode="&#x1f45c;"/> <emoji name="handbag" unicode="&#x1f45c;"/> from "handbag"<linebreak/> + <emoji name="handshake" unicode="&#x1f91d;"/> <emoji name="handshake" unicode="&#x1f91d;"/> from "handshake"<linebreak/> + <emoji name="hankey" unicode="&#x1f4a9;"/> <emoji name="hankey" unicode="&#x1f4a9;"/> from "hankey"<linebreak/> + <emoji name="hash" unicode="&#x0023;&#x20e3;"/> <emoji name="hash" unicode="&#x0023;&#x20e3;"/> from "hash"<linebreak/> + <emoji name="hatched_chick" unicode="&#x1f425;"/> <emoji name="hatched_chick" unicode="&#x1f425;"/> from "hatched_chick"<linebreak/> + <emoji name="hatching_chick" unicode="&#x1f423;"/> <emoji name="hatching_chick" unicode="&#x1f423;"/> from "hatching_chick"<linebreak/> + <emoji name="headphones" unicode="&#x1f3a7;"/> <emoji name="headphones" unicode="&#x1f3a7;"/> from "headphones"<linebreak/> + <emoji name="hear_no_evil" unicode="&#x1f649;"/> <emoji name="hear_no_evil" unicode="&#x1f649;"/> from "hear_no_evil"<linebreak/> + <emoji name="heart" unicode="&#x2764;"/> <emoji name="heart" unicode="&#x2764;"/> from "heart"<linebreak/> + <emoji name="heart_decoration" unicode="&#x1f49f;"/> <emoji name="heart_decoration" unicode="&#x1f49f;"/> from "heart_decoration"<linebreak/> + <emoji name="heart_eyes" unicode="&#x1f60d;"/> <emoji name="heart_eyes" unicode="&#x1f60d;"/> from "heart_eyes"<linebreak/> + <emoji name="heart_eyes_cat" unicode="&#x1f63b;"/> <emoji name="heart_eyes_cat" unicode="&#x1f63b;"/> from "heart_eyes_cat"<linebreak/> + <emoji name="heartbeat" unicode="&#x1f493;"/> <emoji name="heartbeat" unicode="&#x1f493;"/> from "heartbeat"<linebreak/> + <emoji name="heartpulse" unicode="&#x1f497;"/> <emoji name="heartpulse" unicode="&#x1f497;"/> from "heartpulse"<linebreak/> + <emoji name="hearts" unicode="&#x2665;"/> <emoji name="hearts" unicode="&#x2665;"/> from "hearts"<linebreak/> + <emoji name="heavy_check_mark" unicode="&#x2714;"/> <emoji name="heavy_check_mark" unicode="&#x2714;"/> from "heavy_check_mark"<linebreak/> + <emoji name="heavy_division_sign" unicode="&#x2797;"/> <emoji name="heavy_division_sign" unicode="&#x2797;"/> from "heavy_division_sign"<linebreak/> + <emoji name="heavy_dollar_sign" unicode="&#x1f4b2;"/> <emoji name="heavy_dollar_sign" unicode="&#x1f4b2;"/> from "heavy_dollar_sign"<linebreak/> + <emoji name="heavy_exclamation_mark" unicode="&#x2757;"/> <emoji name="heavy_exclamation_mark" unicode="&#x2757;"/> from "heavy_exclamation_mark"<linebreak/> + <emoji name="heavy_heart_exclamation" unicode="&#x2763;"/> <emoji name="heavy_heart_exclamation" unicode="&#x2763;"/> from "heavy_heart_exclamation"<linebreak/> + <emoji name="heavy_minus_sign" unicode="&#x2796;"/> <emoji name="heavy_minus_sign" unicode="&#x2796;"/> from "heavy_minus_sign"<linebreak/> + <emoji name="heavy_multiplication_x" unicode="&#x2716;"/> <emoji name="heavy_multiplication_x" unicode="&#x2716;"/> from "heavy_multiplication_x"<linebreak/> + <emoji name="heavy_plus_sign" unicode="&#x2795;"/> <emoji name="heavy_plus_sign" unicode="&#x2795;"/> from "heavy_plus_sign"<linebreak/> + <emoji name="helicopter" unicode="&#x1f681;"/> <emoji name="helicopter" unicode="&#x1f681;"/> from "helicopter"<linebreak/> + <emoji name="herb" unicode="&#x1f33f;"/> <emoji name="herb" unicode="&#x1f33f;"/> from "herb"<linebreak/> + <emoji name="hibiscus" unicode="&#x1f33a;"/> <emoji name="hibiscus" unicode="&#x1f33a;"/> from "hibiscus"<linebreak/> + <emoji name="high_brightness" unicode="&#x1f506;"/> <emoji name="high_brightness" unicode="&#x1f506;"/> from "high_brightness"<linebreak/> + <emoji name="high_heel" unicode="&#x1f460;"/> <emoji name="high_heel" unicode="&#x1f460;"/> from "high_heel"<linebreak/> + <emoji name="hocho" unicode="&#x1f52a;"/> <emoji name="hocho" unicode="&#x1f52a;"/> from "hocho"<linebreak/> + <emoji name="hole" unicode="&#x1f573;"/> <emoji name="hole" unicode="&#x1f573;"/> from "hole"<linebreak/> + <emoji name="honduras" unicode="&#x1f1ed;&#x1f1f3;"/> <emoji name="honduras" unicode="&#x1f1ed;&#x1f1f3;"/> from "honduras"<linebreak/> + <emoji name="honey_pot" unicode="&#x1f36f;"/> <emoji name="honey_pot" unicode="&#x1f36f;"/> from "honey_pot"<linebreak/> + <emoji name="honeybee" unicode="&#x1f41d;"/> <emoji name="honeybee" unicode="&#x1f41d;"/> from "honeybee"<linebreak/> + <emoji name="hong_kong" unicode="&#x1f1ed;&#x1f1f0;"/> <emoji name="hong_kong" unicode="&#x1f1ed;&#x1f1f0;"/> from "hong_kong"<linebreak/> + <emoji name="horse" unicode="&#x1f434;"/> <emoji name="horse" unicode="&#x1f434;"/> from "horse"<linebreak/> + <emoji name="horse_racing" unicode="&#x1f3c7;"/> <emoji name="horse_racing" unicode="&#x1f3c7;"/> from "horse_racing"<linebreak/> + <emoji name="hospital" unicode="&#x1f3e5;"/> <emoji name="hospital" unicode="&#x1f3e5;"/> from "hospital"<linebreak/> + <emoji name="hot_pepper" unicode="&#x1f336;"/> <emoji name="hot_pepper" unicode="&#x1f336;"/> from "hot_pepper"<linebreak/> + <emoji name="hotdog" unicode="&#x1f32d;"/> <emoji name="hotdog" unicode="&#x1f32d;"/> from "hotdog"<linebreak/> + <emoji name="hotel" unicode="&#x1f3e8;"/> <emoji name="hotel" unicode="&#x1f3e8;"/> from "hotel"<linebreak/> + <emoji name="hotsprings" unicode="&#x2668;"/> <emoji name="hotsprings" unicode="&#x2668;"/> from "hotsprings"<linebreak/> + <emoji name="hourglass" unicode="&#x231b;"/> <emoji name="hourglass" unicode="&#x231b;"/> from "hourglass"<linebreak/> + <emoji name="hourglass_flowing_sand" unicode="&#x23f3;"/> <emoji name="hourglass_flowing_sand" unicode="&#x23f3;"/> from "hourglass_flowing_sand"<linebreak/> + <emoji name="house" unicode="&#x1f3e0;"/> <emoji name="house" unicode="&#x1f3e0;"/> from "house"<linebreak/> + <emoji name="house_with_garden" unicode="&#x1f3e1;"/> <emoji name="house_with_garden" unicode="&#x1f3e1;"/> from "house_with_garden"<linebreak/> + <emoji name="houses" unicode="&#x1f3d8;"/> <emoji name="houses" unicode="&#x1f3d8;"/> from "houses"<linebreak/> + <emoji name="hugs" unicode="&#x1f917;"/> <emoji name="hugs" unicode="&#x1f917;"/> from "hugs"<linebreak/> + <emoji name="hungary" unicode="&#x1f1ed;&#x1f1fa;"/> <emoji name="hungary" unicode="&#x1f1ed;&#x1f1fa;"/> from "hungary"<linebreak/> + <emoji name="hushed" unicode="&#x1f62f;"/> <emoji name="hushed" unicode="&#x1f62f;"/> from "hushed"<linebreak/> + <emoji name="ice_cream" unicode="&#x1f368;"/> <emoji name="ice_cream" unicode="&#x1f368;"/> from "ice_cream"<linebreak/> + <emoji name="ice_hockey" unicode="&#x1f3d2;"/> <emoji name="ice_hockey" unicode="&#x1f3d2;"/> from "ice_hockey"<linebreak/> + <emoji name="ice_skate" unicode="&#x26f8;"/> <emoji name="ice_skate" unicode="&#x26f8;"/> from "ice_skate"<linebreak/> + <emoji name="icecream" unicode="&#x1f366;"/> <emoji name="icecream" unicode="&#x1f366;"/> from "icecream"<linebreak/> + <emoji name="iceland" unicode="&#x1f1ee;&#x1f1f8;"/> <emoji name="iceland" unicode="&#x1f1ee;&#x1f1f8;"/> from "iceland"<linebreak/> + <emoji name="id" unicode="&#x1f194;"/> <emoji name="id" unicode="&#x1f194;"/> from "id"<linebreak/> + <emoji name="ideograph_advantage" unicode="&#x1f250;"/> <emoji name="ideograph_advantage" unicode="&#x1f250;"/> from "ideograph_advantage"<linebreak/> + <emoji name="imp" unicode="&#x1f47f;"/> <emoji name="imp" unicode="&#x1f47f;"/> from "imp"<linebreak/> + <emoji name="inbox_tray" unicode="&#x1f4e5;"/> <emoji name="inbox_tray" unicode="&#x1f4e5;"/> from "inbox_tray"<linebreak/> + <emoji name="incoming_envelope" unicode="&#x1f4e8;"/> <emoji name="incoming_envelope" unicode="&#x1f4e8;"/> from "incoming_envelope"<linebreak/> + <emoji name="india" unicode="&#x1f1ee;&#x1f1f3;"/> <emoji name="india" unicode="&#x1f1ee;&#x1f1f3;"/> from "india"<linebreak/> + <emoji name="indonesia" unicode="&#x1f1ee;&#x1f1e9;"/> <emoji name="indonesia" unicode="&#x1f1ee;&#x1f1e9;"/> from "indonesia"<linebreak/> + <emoji name="information_desk_person" unicode="&#x1f481;"/> <emoji name="information_desk_person" unicode="&#x1f481;"/> from "information_desk_person"<linebreak/> + <emoji name="information_source" unicode="&#x2139;"/> <emoji name="information_source" unicode="&#x2139;"/> from "information_source"<linebreak/> + <emoji name="innocent" unicode="&#x1f607;"/> <emoji name="innocent" unicode="&#x1f607;"/> from "innocent"<linebreak/> + <emoji name="interrobang" unicode="&#x2049;"/> <emoji name="interrobang" unicode="&#x2049;"/> from "interrobang"<linebreak/> + <emoji name="iphone" unicode="&#x1f4f1;"/> <emoji name="iphone" unicode="&#x1f4f1;"/> from "iphone"<linebreak/> + <emoji name="iran" unicode="&#x1f1ee;&#x1f1f7;"/> <emoji name="iran" unicode="&#x1f1ee;&#x1f1f7;"/> from "iran"<linebreak/> + <emoji name="iraq" unicode="&#x1f1ee;&#x1f1f6;"/> <emoji name="iraq" unicode="&#x1f1ee;&#x1f1f6;"/> from "iraq"<linebreak/> + <emoji name="ireland" unicode="&#x1f1ee;&#x1f1ea;"/> <emoji name="ireland" unicode="&#x1f1ee;&#x1f1ea;"/> from "ireland"<linebreak/> + <emoji name="isle_of_man" unicode="&#x1f1ee;&#x1f1f2;"/> <emoji name="isle_of_man" unicode="&#x1f1ee;&#x1f1f2;"/> from "isle_of_man"<linebreak/> + <emoji name="israel" unicode="&#x1f1ee;&#x1f1f1;"/> <emoji name="israel" unicode="&#x1f1ee;&#x1f1f1;"/> from "israel"<linebreak/> + <emoji name="it" unicode="&#x1f1ee;&#x1f1f9;"/> <emoji name="it" unicode="&#x1f1ee;&#x1f1f9;"/> from "it"<linebreak/> + <emoji name="izakaya_lantern" unicode="&#x1f3ee;"/> <emoji name="izakaya_lantern" unicode="&#x1f3ee;"/> from "izakaya_lantern"<linebreak/> + <emoji name="jack_o_lantern" unicode="&#x1f383;"/> <emoji name="jack_o_lantern" unicode="&#x1f383;"/> from "jack_o_lantern"<linebreak/> + <emoji name="jamaica" unicode="&#x1f1ef;&#x1f1f2;"/> <emoji name="jamaica" unicode="&#x1f1ef;&#x1f1f2;"/> from "jamaica"<linebreak/> + <emoji name="japan" unicode="&#x1f5fe;"/> <emoji name="japan" unicode="&#x1f5fe;"/> from "japan"<linebreak/> + <emoji name="japanese_castle" unicode="&#x1f3ef;"/> <emoji name="japanese_castle" unicode="&#x1f3ef;"/> from "japanese_castle"<linebreak/> + <emoji name="japanese_goblin" unicode="&#x1f47a;"/> <emoji name="japanese_goblin" unicode="&#x1f47a;"/> from "japanese_goblin"<linebreak/> + <emoji name="japanese_ogre" unicode="&#x1f479;"/> <emoji name="japanese_ogre" unicode="&#x1f479;"/> from "japanese_ogre"<linebreak/> + <emoji name="jeans" unicode="&#x1f456;"/> <emoji name="jeans" unicode="&#x1f456;"/> from "jeans"<linebreak/> + <emoji name="jersey" unicode="&#x1f1ef;&#x1f1ea;"/> <emoji name="jersey" unicode="&#x1f1ef;&#x1f1ea;"/> from "jersey"<linebreak/> + <emoji name="jordan" unicode="&#x1f1ef;&#x1f1f4;"/> <emoji name="jordan" unicode="&#x1f1ef;&#x1f1f4;"/> from "jordan"<linebreak/> + <emoji name="joy" unicode="&#x1f602;"/> <emoji name="joy" unicode="&#x1f602;"/> from "joy"<linebreak/> + <emoji name="joy_cat" unicode="&#x1f639;"/> <emoji name="joy_cat" unicode="&#x1f639;"/> from "joy_cat"<linebreak/> + <emoji name="joystick" unicode="&#x1f579;"/> <emoji name="joystick" unicode="&#x1f579;"/> from "joystick"<linebreak/> + <emoji name="jp" unicode="&#x1f1ef;&#x1f1f5;"/> <emoji name="jp" unicode="&#x1f1ef;&#x1f1f5;"/> from "jp"<linebreak/> + <emoji name="kaaba" unicode="&#x1f54b;"/> <emoji name="kaaba" unicode="&#x1f54b;"/> from "kaaba"<linebreak/> + <emoji name="kazakhstan" unicode="&#x1f1f0;&#x1f1ff;"/> <emoji name="kazakhstan" unicode="&#x1f1f0;&#x1f1ff;"/> from "kazakhstan"<linebreak/> + <emoji name="kenya" unicode="&#x1f1f0;&#x1f1ea;"/> <emoji name="kenya" unicode="&#x1f1f0;&#x1f1ea;"/> from "kenya"<linebreak/> + <emoji name="key" unicode="&#x1f511;"/> <emoji name="key" unicode="&#x1f511;"/> from "key"<linebreak/> + <emoji name="keyboard" unicode="&#x2328;"/> <emoji name="keyboard" unicode="&#x2328;"/> from "keyboard"<linebreak/> + <emoji name="keycap_ten" unicode="&#x1f51f;"/> <emoji name="keycap_ten" unicode="&#x1f51f;"/> from "keycap_ten"<linebreak/> + <emoji name="kick_scooter" unicode="&#x1f6f4;"/> <emoji name="kick_scooter" unicode="&#x1f6f4;"/> from "kick_scooter"<linebreak/> + <emoji name="kimono" unicode="&#x1f458;"/> <emoji name="kimono" unicode="&#x1f458;"/> from "kimono"<linebreak/> + <emoji name="kiribati" unicode="&#x1f1f0;&#x1f1ee;"/> <emoji name="kiribati" unicode="&#x1f1f0;&#x1f1ee;"/> from "kiribati"<linebreak/> + <emoji name="kiss" unicode="&#x1f48b;"/> <emoji name="kiss" unicode="&#x1f48b;"/> from "kiss"<linebreak/> + <emoji name="kissing" unicode="&#x1f617;"/> <emoji name="kissing" unicode="&#x1f617;"/> from "kissing"<linebreak/> + <emoji name="kissing_cat" unicode="&#x1f63d;"/> <emoji name="kissing_cat" unicode="&#x1f63d;"/> from "kissing_cat"<linebreak/> + <emoji name="kissing_closed_eyes" unicode="&#x1f61a;"/> <emoji name="kissing_closed_eyes" unicode="&#x1f61a;"/> from "kissing_closed_eyes"<linebreak/> + <emoji name="kissing_heart" unicode="&#x1f618;"/> <emoji name="kissing_heart" unicode="&#x1f618;"/> from "kissing_heart"<linebreak/> + <emoji name="kissing_smiling_eyes" unicode="&#x1f619;"/> <emoji name="kissing_smiling_eyes" unicode="&#x1f619;"/> from "kissing_smiling_eyes"<linebreak/> + <emoji name="kiwi_fruit" unicode="&#x1f95d;"/> <emoji name="kiwi_fruit" unicode="&#x1f95d;"/> from "kiwi_fruit"<linebreak/> + <emoji name="knife" unicode="&#x1f52a;"/> <emoji name="knife" unicode="&#x1f52a;"/> from "knife"<linebreak/> + <emoji name="koala" unicode="&#x1f428;"/> <emoji name="koala" unicode="&#x1f428;"/> from "koala"<linebreak/> + <emoji name="koko" unicode="&#x1f201;"/> <emoji name="koko" unicode="&#x1f201;"/> from "koko"<linebreak/> + <emoji name="kosovo" unicode="&#x1f1fd;&#x1f1f0;"/> <emoji name="kosovo" unicode="&#x1f1fd;&#x1f1f0;"/> from "kosovo"<linebreak/> + <emoji name="kr" unicode="&#x1f1f0;&#x1f1f7;"/> <emoji name="kr" unicode="&#x1f1f0;&#x1f1f7;"/> from "kr"<linebreak/> + <emoji name="kuwait" unicode="&#x1f1f0;&#x1f1fc;"/> <emoji name="kuwait" unicode="&#x1f1f0;&#x1f1fc;"/> from "kuwait"<linebreak/> + <emoji name="kyrgyzstan" unicode="&#x1f1f0;&#x1f1ec;"/> <emoji name="kyrgyzstan" unicode="&#x1f1f0;&#x1f1ec;"/> from "kyrgyzstan"<linebreak/> + <emoji name="label" unicode="&#x1f3f7;"/> <emoji name="label" unicode="&#x1f3f7;"/> from "label"<linebreak/> + <emoji name="lantern" unicode="&#x1f3ee;"/> <emoji name="lantern" unicode="&#x1f3ee;"/> from "lantern"<linebreak/> + <emoji name="laos" unicode="&#x1f1f1;&#x1f1e6;"/> <emoji name="laos" unicode="&#x1f1f1;&#x1f1e6;"/> from "laos"<linebreak/> + <emoji name="large_blue_circle" unicode="&#x1f535;"/> <emoji name="large_blue_circle" unicode="&#x1f535;"/> from "large_blue_circle"<linebreak/> + <emoji name="large_blue_diamond" unicode="&#x1f537;"/> <emoji name="large_blue_diamond" unicode="&#x1f537;"/> from "large_blue_diamond"<linebreak/> + <emoji name="large_orange_diamond" unicode="&#x1f536;"/> <emoji name="large_orange_diamond" unicode="&#x1f536;"/> from "large_orange_diamond"<linebreak/> + <emoji name="last_quarter_moon" unicode="&#x1f317;"/> <emoji name="last_quarter_moon" unicode="&#x1f317;"/> from "last_quarter_moon"<linebreak/> + <emoji name="last_quarter_moon_with_face" unicode="&#x1f31c;"/> <emoji name="last_quarter_moon_with_face" unicode="&#x1f31c;"/> from "last_quarter_moon_with_face"<linebreak/> + <emoji name="latin_cross" unicode="&#x271d;"/> <emoji name="latin_cross" unicode="&#x271d;"/> from "latin_cross"<linebreak/> + <emoji name="latvia" unicode="&#x1f1f1;&#x1f1fb;"/> <emoji name="latvia" unicode="&#x1f1f1;&#x1f1fb;"/> from "latvia"<linebreak/> + <emoji name="laughing" unicode="&#x1f606;"/> <emoji name="laughing" unicode="&#x1f606;"/> from "laughing"<linebreak/> + <emoji name="leaves" unicode="&#x1f343;"/> <emoji name="leaves" unicode="&#x1f343;"/> from "leaves"<linebreak/> + <emoji name="lebanon" unicode="&#x1f1f1;&#x1f1e7;"/> <emoji name="lebanon" unicode="&#x1f1f1;&#x1f1e7;"/> from "lebanon"<linebreak/> + <emoji name="ledger" unicode="&#x1f4d2;"/> <emoji name="ledger" unicode="&#x1f4d2;"/> from "ledger"<linebreak/> + <emoji name="left_luggage" unicode="&#x1f6c5;"/> <emoji name="left_luggage" unicode="&#x1f6c5;"/> from "left_luggage"<linebreak/> + <emoji name="left_right_arrow" unicode="&#x2194;"/> <emoji name="left_right_arrow" unicode="&#x2194;"/> from "left_right_arrow"<linebreak/> + <emoji name="leftwards_arrow_with_hook" unicode="&#x21a9;"/> <emoji name="leftwards_arrow_with_hook" unicode="&#x21a9;"/> from "leftwards_arrow_with_hook"<linebreak/> + <emoji name="lemon" unicode="&#x1f34b;"/> <emoji name="lemon" unicode="&#x1f34b;"/> from "lemon"<linebreak/> + <emoji name="leo" unicode="&#x264c;"/> <emoji name="leo" unicode="&#x264c;"/> from "leo"<linebreak/> + <emoji name="leopard" unicode="&#x1f406;"/> <emoji name="leopard" unicode="&#x1f406;"/> from "leopard"<linebreak/> + <emoji name="lesotho" unicode="&#x1f1f1;&#x1f1f8;"/> <emoji name="lesotho" unicode="&#x1f1f1;&#x1f1f8;"/> from "lesotho"<linebreak/> + <emoji name="level_slider" unicode="&#x1f39a;"/> <emoji name="level_slider" unicode="&#x1f39a;"/> from "level_slider"<linebreak/> + <emoji name="liberia" unicode="&#x1f1f1;&#x1f1f7;"/> <emoji name="liberia" unicode="&#x1f1f1;&#x1f1f7;"/> from "liberia"<linebreak/> + <emoji name="libra" unicode="&#x264e;"/> <emoji name="libra" unicode="&#x264e;"/> from "libra"<linebreak/> + <emoji name="libya" unicode="&#x1f1f1;&#x1f1fe;"/> <emoji name="libya" unicode="&#x1f1f1;&#x1f1fe;"/> from "libya"<linebreak/> + <emoji name="liechtenstein" unicode="&#x1f1f1;&#x1f1ee;"/> <emoji name="liechtenstein" unicode="&#x1f1f1;&#x1f1ee;"/> from "liechtenstein"<linebreak/> + <emoji name="light_rail" unicode="&#x1f688;"/> <emoji name="light_rail" unicode="&#x1f688;"/> from "light_rail"<linebreak/> + <emoji name="link" unicode="&#x1f517;"/> <emoji name="link" unicode="&#x1f517;"/> from "link"<linebreak/> + <emoji name="lion" unicode="&#x1f981;"/> <emoji name="lion" unicode="&#x1f981;"/> from "lion"<linebreak/> + <emoji name="lips" unicode="&#x1f444;"/> <emoji name="lips" unicode="&#x1f444;"/> from "lips"<linebreak/> + <emoji name="lipstick" unicode="&#x1f484;"/> <emoji name="lipstick" unicode="&#x1f484;"/> from "lipstick"<linebreak/> + <emoji name="lithuania" unicode="&#x1f1f1;&#x1f1f9;"/> <emoji name="lithuania" unicode="&#x1f1f1;&#x1f1f9;"/> from "lithuania"<linebreak/> + <emoji name="lizard" unicode="&#x1f98e;"/> <emoji name="lizard" unicode="&#x1f98e;"/> from "lizard"<linebreak/> + <emoji name="lock" unicode="&#x1f512;"/> <emoji name="lock" unicode="&#x1f512;"/> from "lock"<linebreak/> + <emoji name="lock_with_ink_pen" unicode="&#x1f50f;"/> <emoji name="lock_with_ink_pen" unicode="&#x1f50f;"/> from "lock_with_ink_pen"<linebreak/> + <emoji name="lollipop" unicode="&#x1f36d;"/> <emoji name="lollipop" unicode="&#x1f36d;"/> from "lollipop"<linebreak/> + <emoji name="loop" unicode="&#x27bf;"/> <emoji name="loop" unicode="&#x27bf;"/> from "loop"<linebreak/> + <emoji name="loud_sound" unicode="&#x1f50a;"/> <emoji name="loud_sound" unicode="&#x1f50a;"/> from "loud_sound"<linebreak/> + <emoji name="loudspeaker" unicode="&#x1f4e2;"/> <emoji name="loudspeaker" unicode="&#x1f4e2;"/> from "loudspeaker"<linebreak/> + <emoji name="love_hotel" unicode="&#x1f3e9;"/> <emoji name="love_hotel" unicode="&#x1f3e9;"/> from "love_hotel"<linebreak/> + <emoji name="love_letter" unicode="&#x1f48c;"/> <emoji name="love_letter" unicode="&#x1f48c;"/> from "love_letter"<linebreak/> + <emoji name="low_brightness" unicode="&#x1f505;"/> <emoji name="low_brightness" unicode="&#x1f505;"/> from "low_brightness"<linebreak/> + <emoji name="luxembourg" unicode="&#x1f1f1;&#x1f1fa;"/> <emoji name="luxembourg" unicode="&#x1f1f1;&#x1f1fa;"/> from "luxembourg"<linebreak/> + <emoji name="lying_face" unicode="&#x1f925;"/> <emoji name="lying_face" unicode="&#x1f925;"/> from "lying_face"<linebreak/> + <emoji name="m" unicode="&#x24c2;"/> <emoji name="m" unicode="&#x24c2;"/> from "m"<linebreak/> + <emoji name="macau" unicode="&#x1f1f2;&#x1f1f4;"/> <emoji name="macau" unicode="&#x1f1f2;&#x1f1f4;"/> from "macau"<linebreak/> + <emoji name="macedonia" unicode="&#x1f1f2;&#x1f1f0;"/> <emoji name="macedonia" unicode="&#x1f1f2;&#x1f1f0;"/> from "macedonia"<linebreak/> + <emoji name="madagascar" unicode="&#x1f1f2;&#x1f1ec;"/> <emoji name="madagascar" unicode="&#x1f1f2;&#x1f1ec;"/> from "madagascar"<linebreak/> + <emoji name="mag" unicode="&#x1f50d;"/> <emoji name="mag" unicode="&#x1f50d;"/> from "mag"<linebreak/> + <emoji name="mag_right" unicode="&#x1f50e;"/> <emoji name="mag_right" unicode="&#x1f50e;"/> from "mag_right"<linebreak/> + <emoji name="mahjong" unicode="&#x1f004;"/> <emoji name="mahjong" unicode="&#x1f004;"/> from "mahjong"<linebreak/> + <emoji name="mailbox" unicode="&#x1f4eb;"/> <emoji name="mailbox" unicode="&#x1f4eb;"/> from "mailbox"<linebreak/> + <emoji name="mailbox_closed" unicode="&#x1f4ea;"/> <emoji name="mailbox_closed" unicode="&#x1f4ea;"/> from "mailbox_closed"<linebreak/> + <emoji name="mailbox_with_mail" unicode="&#x1f4ec;"/> <emoji name="mailbox_with_mail" unicode="&#x1f4ec;"/> from "mailbox_with_mail"<linebreak/> + <emoji name="mailbox_with_no_mail" unicode="&#x1f4ed;"/> <emoji name="mailbox_with_no_mail" unicode="&#x1f4ed;"/> from "mailbox_with_no_mail"<linebreak/> + <emoji name="malawi" unicode="&#x1f1f2;&#x1f1fc;"/> <emoji name="malawi" unicode="&#x1f1f2;&#x1f1fc;"/> from "malawi"<linebreak/> + <emoji name="malaysia" unicode="&#x1f1f2;&#x1f1fe;"/> <emoji name="malaysia" unicode="&#x1f1f2;&#x1f1fe;"/> from "malaysia"<linebreak/> + <emoji name="maldives" unicode="&#x1f1f2;&#x1f1fb;"/> <emoji name="maldives" unicode="&#x1f1f2;&#x1f1fb;"/> from "maldives"<linebreak/> + <emoji name="male_detective" unicode="&#x1f575;"/> <emoji name="male_detective" unicode="&#x1f575;"/> from "male_detective"<linebreak/> + <emoji name="mali" unicode="&#x1f1f2;&#x1f1f1;"/> <emoji name="mali" unicode="&#x1f1f2;&#x1f1f1;"/> from "mali"<linebreak/> + <emoji name="malta" unicode="&#x1f1f2;&#x1f1f9;"/> <emoji name="malta" unicode="&#x1f1f2;&#x1f1f9;"/> from "malta"<linebreak/> + <emoji name="man" unicode="&#x1f468;"/> <emoji name="man" unicode="&#x1f468;"/> from "man"<linebreak/> + <emoji name="man_artist" unicode="&#x1f468;&#x1f3a8;"/> <emoji name="man_artist" unicode="&#x1f468;&#x1f3a8;"/> from "man_artist"<linebreak/> + <emoji name="man_astronaut" unicode="&#x1f468;&#x1f680;"/> <emoji name="man_astronaut" unicode="&#x1f468;&#x1f680;"/> from "man_astronaut"<linebreak/> + <emoji name="man_cartwheeling" unicode="&#x1f938;&#x2642;"/> <emoji name="man_cartwheeling" unicode="&#x1f938;&#x2642;"/> from "man_cartwheeling"<linebreak/> + <emoji name="man_cook" unicode="&#x1f468;&#x1f373;"/> <emoji name="man_cook" unicode="&#x1f468;&#x1f373;"/> from "man_cook"<linebreak/> + <emoji name="man_dancing" unicode="&#x1f57a;"/> <emoji name="man_dancing" unicode="&#x1f57a;"/> from "man_dancing"<linebreak/> + <emoji name="man_facepalming" unicode="&#x1f926;&#x2642;"/> <emoji name="man_facepalming" unicode="&#x1f926;&#x2642;"/> from "man_facepalming"<linebreak/> + <emoji name="man_factory_worker" unicode="&#x1f468;&#x1f3ed;"/> <emoji name="man_factory_worker" unicode="&#x1f468;&#x1f3ed;"/> from "man_factory_worker"<linebreak/> + <emoji name="man_farmer" unicode="&#x1f468;&#x1f33e;"/> <emoji name="man_farmer" unicode="&#x1f468;&#x1f33e;"/> from "man_farmer"<linebreak/> + <emoji name="man_firefighter" unicode="&#x1f468;&#x1f692;"/> <emoji name="man_firefighter" unicode="&#x1f468;&#x1f692;"/> from "man_firefighter"<linebreak/> + <emoji name="man_health_worker" unicode="&#x1f468;&#x2695;"/> <emoji name="man_health_worker" unicode="&#x1f468;&#x2695;"/> from "man_health_worker"<linebreak/> + <emoji name="man_in_tuxedo" unicode="&#x1f935;"/> <emoji name="man_in_tuxedo" unicode="&#x1f935;"/> from "man_in_tuxedo"<linebreak/> + <emoji name="man_judge" unicode="&#x1f468;&#x2696;"/> <emoji name="man_judge" unicode="&#x1f468;&#x2696;"/> from "man_judge"<linebreak/> + <emoji name="man_juggling" unicode="&#x1f939;&#x2642;"/> <emoji name="man_juggling" unicode="&#x1f939;&#x2642;"/> from "man_juggling"<linebreak/> + <emoji name="man_mechanic" unicode="&#x1f468;&#x1f527;"/> <emoji name="man_mechanic" unicode="&#x1f468;&#x1f527;"/> from "man_mechanic"<linebreak/> + <emoji name="man_office_worker" unicode="&#x1f468;&#x1f4bc;"/> <emoji name="man_office_worker" unicode="&#x1f468;&#x1f4bc;"/> from "man_office_worker"<linebreak/> + <emoji name="man_pilot" unicode="&#x1f468;&#x2708;"/> <emoji name="man_pilot" unicode="&#x1f468;&#x2708;"/> from "man_pilot"<linebreak/> + <emoji name="man_playing_handball" unicode="&#x1f93e;&#x2642;"/> <emoji name="man_playing_handball" unicode="&#x1f93e;&#x2642;"/> from "man_playing_handball"<linebreak/> + <emoji name="man_playing_water_polo" unicode="&#x1f93d;&#x2642;"/> <emoji name="man_playing_water_polo" unicode="&#x1f93d;&#x2642;"/> from "man_playing_water_polo"<linebreak/> + <emoji name="man_scientist" unicode="&#x1f468;&#x1f52c;"/> <emoji name="man_scientist" unicode="&#x1f468;&#x1f52c;"/> from "man_scientist"<linebreak/> + <emoji name="man_shrugging" unicode="&#x1f937;&#x2642;"/> <emoji name="man_shrugging" unicode="&#x1f937;&#x2642;"/> from "man_shrugging"<linebreak/> + <emoji name="man_singer" unicode="&#x1f468;&#x1f3a4;"/> <emoji name="man_singer" unicode="&#x1f468;&#x1f3a4;"/> from "man_singer"<linebreak/> + <emoji name="man_student" unicode="&#x1f468;&#x1f393;"/> <emoji name="man_student" unicode="&#x1f468;&#x1f393;"/> from "man_student"<linebreak/> + <emoji name="man_teacher" unicode="&#x1f468;&#x1f3eb;"/> <emoji name="man_teacher" unicode="&#x1f468;&#x1f3eb;"/> from "man_teacher"<linebreak/> + <emoji name="man_technologist" unicode="&#x1f468;&#x1f4bb;"/> <emoji name="man_technologist" unicode="&#x1f468;&#x1f4bb;"/> from "man_technologist"<linebreak/> + <emoji name="man_with_gua_pi_mao" unicode="&#x1f472;"/> <emoji name="man_with_gua_pi_mao" unicode="&#x1f472;"/> from "man_with_gua_pi_mao"<linebreak/> + <emoji name="man_with_turban" unicode="&#x1f473;"/> <emoji name="man_with_turban" unicode="&#x1f473;"/> from "man_with_turban"<linebreak/> + <emoji name="mandarin" unicode="&#x1f34a;"/> <emoji name="mandarin" unicode="&#x1f34a;"/> from "mandarin"<linebreak/> + <emoji name="mans_shoe" unicode="&#x1f45e;"/> <emoji name="mans_shoe" unicode="&#x1f45e;"/> from "mans_shoe"<linebreak/> + <emoji name="mantelpiece_clock" unicode="&#x1f570;"/> <emoji name="mantelpiece_clock" unicode="&#x1f570;"/> from "mantelpiece_clock"<linebreak/> + <emoji name="maple_leaf" unicode="&#x1f341;"/> <emoji name="maple_leaf" unicode="&#x1f341;"/> from "maple_leaf"<linebreak/> + <emoji name="marshall_islands" unicode="&#x1f1f2;&#x1f1ed;"/> <emoji name="marshall_islands" unicode="&#x1f1f2;&#x1f1ed;"/> from "marshall_islands"<linebreak/> + <emoji name="martial_arts_uniform" unicode="&#x1f94b;"/> <emoji name="martial_arts_uniform" unicode="&#x1f94b;"/> from "martial_arts_uniform"<linebreak/> + <emoji name="martinique" unicode="&#x1f1f2;&#x1f1f6;"/> <emoji name="martinique" unicode="&#x1f1f2;&#x1f1f6;"/> from "martinique"<linebreak/> + <emoji name="mask" unicode="&#x1f637;"/> <emoji name="mask" unicode="&#x1f637;"/> from "mask"<linebreak/> + <emoji name="massage" unicode="&#x1f486;"/> <emoji name="massage" unicode="&#x1f486;"/> from "massage"<linebreak/> + <emoji name="massage_man" unicode="&#x1f486;&#x2642;"/> <emoji name="massage_man" unicode="&#x1f486;&#x2642;"/> from "massage_man"<linebreak/> + <emoji name="massage_woman" unicode="&#x1f486;"/> <emoji name="massage_woman" unicode="&#x1f486;"/> from "massage_woman"<linebreak/> + <emoji name="mauritania" unicode="&#x1f1f2;&#x1f1f7;"/> <emoji name="mauritania" unicode="&#x1f1f2;&#x1f1f7;"/> from "mauritania"<linebreak/> + <emoji name="mauritius" unicode="&#x1f1f2;&#x1f1fa;"/> <emoji name="mauritius" unicode="&#x1f1f2;&#x1f1fa;"/> from "mauritius"<linebreak/> + <emoji name="mayotte" unicode="&#x1f1fe;&#x1f1f9;"/> <emoji name="mayotte" unicode="&#x1f1fe;&#x1f1f9;"/> from "mayotte"<linebreak/> + <emoji name="meat_on_bone" unicode="&#x1f356;"/> <emoji name="meat_on_bone" unicode="&#x1f356;"/> from "meat_on_bone"<linebreak/> + <emoji name="medal_military" unicode="&#x1f396;"/> <emoji name="medal_military" unicode="&#x1f396;"/> from "medal_military"<linebreak/> + <emoji name="medal_sports" unicode="&#x1f3c5;"/> <emoji name="medal_sports" unicode="&#x1f3c5;"/> from "medal_sports"<linebreak/> + <emoji name="mega" unicode="&#x1f4e3;"/> <emoji name="mega" unicode="&#x1f4e3;"/> from "mega"<linebreak/> + <emoji name="melon" unicode="&#x1f348;"/> <emoji name="melon" unicode="&#x1f348;"/> from "melon"<linebreak/> + <emoji name="memo" unicode="&#x1f4dd;"/> <emoji name="memo" unicode="&#x1f4dd;"/> from "memo"<linebreak/> + <emoji name="men_wrestling" unicode="&#x1f93c;&#x2642;"/> <emoji name="men_wrestling" unicode="&#x1f93c;&#x2642;"/> from "men_wrestling"<linebreak/> + <emoji name="menorah" unicode="&#x1f54e;"/> <emoji name="menorah" unicode="&#x1f54e;"/> from "menorah"<linebreak/> + <emoji name="mens" unicode="&#x1f6b9;"/> <emoji name="mens" unicode="&#x1f6b9;"/> from "mens"<linebreak/> + <emoji name="metal" unicode="&#x1f918;"/> <emoji name="metal" unicode="&#x1f918;"/> from "metal"<linebreak/> + <emoji name="metro" unicode="&#x1f687;"/> <emoji name="metro" unicode="&#x1f687;"/> from "metro"<linebreak/> + <emoji name="mexico" unicode="&#x1f1f2;&#x1f1fd;"/> <emoji name="mexico" unicode="&#x1f1f2;&#x1f1fd;"/> from "mexico"<linebreak/> + <emoji name="micronesia" unicode="&#x1f1eb;&#x1f1f2;"/> <emoji name="micronesia" unicode="&#x1f1eb;&#x1f1f2;"/> from "micronesia"<linebreak/> + <emoji name="microphone" unicode="&#x1f3a4;"/> <emoji name="microphone" unicode="&#x1f3a4;"/> from "microphone"<linebreak/> + <emoji name="microscope" unicode="&#x1f52c;"/> <emoji name="microscope" unicode="&#x1f52c;"/> from "microscope"<linebreak/> + <emoji name="middle_finger" unicode="&#x1f595;"/> <emoji name="middle_finger" unicode="&#x1f595;"/> from "middle_finger"<linebreak/> + <emoji name="milk_glass" unicode="&#x1f95b;"/> <emoji name="milk_glass" unicode="&#x1f95b;"/> from "milk_glass"<linebreak/> + <emoji name="milky_way" unicode="&#x1f30c;"/> <emoji name="milky_way" unicode="&#x1f30c;"/> from "milky_way"<linebreak/> + <emoji name="minibus" unicode="&#x1f690;"/> <emoji name="minibus" unicode="&#x1f690;"/> from "minibus"<linebreak/> + <emoji name="minidisc" unicode="&#x1f4bd;"/> <emoji name="minidisc" unicode="&#x1f4bd;"/> from "minidisc"<linebreak/> + <emoji name="mobile_phone_off" unicode="&#x1f4f4;"/> <emoji name="mobile_phone_off" unicode="&#x1f4f4;"/> from "mobile_phone_off"<linebreak/> + <emoji name="moldova" unicode="&#x1f1f2;&#x1f1e9;"/> <emoji name="moldova" unicode="&#x1f1f2;&#x1f1e9;"/> from "moldova"<linebreak/> + <emoji name="monaco" unicode="&#x1f1f2;&#x1f1e8;"/> <emoji name="monaco" unicode="&#x1f1f2;&#x1f1e8;"/> from "monaco"<linebreak/> + <emoji name="money_mouth_face" unicode="&#x1f911;"/> <emoji name="money_mouth_face" unicode="&#x1f911;"/> from "money_mouth_face"<linebreak/> + <emoji name="money_with_wings" unicode="&#x1f4b8;"/> <emoji name="money_with_wings" unicode="&#x1f4b8;"/> from "money_with_wings"<linebreak/> + <emoji name="moneybag" unicode="&#x1f4b0;"/> <emoji name="moneybag" unicode="&#x1f4b0;"/> from "moneybag"<linebreak/> + <emoji name="mongolia" unicode="&#x1f1f2;&#x1f1f3;"/> <emoji name="mongolia" unicode="&#x1f1f2;&#x1f1f3;"/> from "mongolia"<linebreak/> + <emoji name="monkey" unicode="&#x1f412;"/> <emoji name="monkey" unicode="&#x1f412;"/> from "monkey"<linebreak/> + <emoji name="monkey_face" unicode="&#x1f435;"/> <emoji name="monkey_face" unicode="&#x1f435;"/> from "monkey_face"<linebreak/> + <emoji name="monorail" unicode="&#x1f69d;"/> <emoji name="monorail" unicode="&#x1f69d;"/> from "monorail"<linebreak/> + <emoji name="montenegro" unicode="&#x1f1f2;&#x1f1ea;"/> <emoji name="montenegro" unicode="&#x1f1f2;&#x1f1ea;"/> from "montenegro"<linebreak/> + <emoji name="montserrat" unicode="&#x1f1f2;&#x1f1f8;"/> <emoji name="montserrat" unicode="&#x1f1f2;&#x1f1f8;"/> from "montserrat"<linebreak/> + <emoji name="moon" unicode="&#x1f314;"/> <emoji name="moon" unicode="&#x1f314;"/> from "moon"<linebreak/> + <emoji name="morocco" unicode="&#x1f1f2;&#x1f1e6;"/> <emoji name="morocco" unicode="&#x1f1f2;&#x1f1e6;"/> from "morocco"<linebreak/> + <emoji name="mortar_board" unicode="&#x1f393;"/> <emoji name="mortar_board" unicode="&#x1f393;"/> from "mortar_board"<linebreak/> + <emoji name="mosque" unicode="&#x1f54c;"/> <emoji name="mosque" unicode="&#x1f54c;"/> from "mosque"<linebreak/> + <emoji name="motor_boat" unicode="&#x1f6e5;"/> <emoji name="motor_boat" unicode="&#x1f6e5;"/> from "motor_boat"<linebreak/> + <emoji name="motor_scooter" unicode="&#x1f6f5;"/> <emoji name="motor_scooter" unicode="&#x1f6f5;"/> from "motor_scooter"<linebreak/> + <emoji name="motorcycle" unicode="&#x1f3cd;"/> <emoji name="motorcycle" unicode="&#x1f3cd;"/> from "motorcycle"<linebreak/> + <emoji name="motorway" unicode="&#x1f6e3;"/> <emoji name="motorway" unicode="&#x1f6e3;"/> from "motorway"<linebreak/> + <emoji name="mount_fuji" unicode="&#x1f5fb;"/> <emoji name="mount_fuji" unicode="&#x1f5fb;"/> from "mount_fuji"<linebreak/> + <emoji name="mountain" unicode="&#x26f0;"/> <emoji name="mountain" unicode="&#x26f0;"/> from "mountain"<linebreak/> + <emoji name="mountain_bicyclist" unicode="&#x1f6b5;"/> <emoji name="mountain_bicyclist" unicode="&#x1f6b5;"/> from "mountain_bicyclist"<linebreak/> + <emoji name="mountain_biking_man" unicode="&#x1f6b5;"/> <emoji name="mountain_biking_man" unicode="&#x1f6b5;"/> from "mountain_biking_man"<linebreak/> + <emoji name="mountain_biking_woman" unicode="&#x1f6b5;&#x2640;"/> <emoji name="mountain_biking_woman" unicode="&#x1f6b5;&#x2640;"/> from "mountain_biking_woman"<linebreak/> + <emoji name="mountain_cableway" unicode="&#x1f6a0;"/> <emoji name="mountain_cableway" unicode="&#x1f6a0;"/> from "mountain_cableway"<linebreak/> + <emoji name="mountain_railway" unicode="&#x1f69e;"/> <emoji name="mountain_railway" unicode="&#x1f69e;"/> from "mountain_railway"<linebreak/> + <emoji name="mountain_snow" unicode="&#x1f3d4;"/> <emoji name="mountain_snow" unicode="&#x1f3d4;"/> from "mountain_snow"<linebreak/> + <emoji name="mouse" unicode="&#x1f42d;"/> <emoji name="mouse" unicode="&#x1f42d;"/> from "mouse"<linebreak/> + <emoji name="mouse2" unicode="&#x1f401;"/> <emoji name="mouse2" unicode="&#x1f401;"/> from "mouse2"<linebreak/> + <emoji name="movie_camera" unicode="&#x1f3a5;"/> <emoji name="movie_camera" unicode="&#x1f3a5;"/> from "movie_camera"<linebreak/> + <emoji name="moyai" unicode="&#x1f5ff;"/> <emoji name="moyai" unicode="&#x1f5ff;"/> from "moyai"<linebreak/> + <emoji name="mozambique" unicode="&#x1f1f2;&#x1f1ff;"/> <emoji name="mozambique" unicode="&#x1f1f2;&#x1f1ff;"/> from "mozambique"<linebreak/> + <emoji name="mrs_claus" unicode="&#x1f936;"/> <emoji name="mrs_claus" unicode="&#x1f936;"/> from "mrs_claus"<linebreak/> + <emoji name="muscle" unicode="&#x1f4aa;"/> <emoji name="muscle" unicode="&#x1f4aa;"/> from "muscle"<linebreak/> + <emoji name="mushroom" unicode="&#x1f344;"/> <emoji name="mushroom" unicode="&#x1f344;"/> from "mushroom"<linebreak/> + <emoji name="musical_keyboard" unicode="&#x1f3b9;"/> <emoji name="musical_keyboard" unicode="&#x1f3b9;"/> from "musical_keyboard"<linebreak/> + <emoji name="musical_note" unicode="&#x1f3b5;"/> <emoji name="musical_note" unicode="&#x1f3b5;"/> from "musical_note"<linebreak/> + <emoji name="musical_score" unicode="&#x1f3bc;"/> <emoji name="musical_score" unicode="&#x1f3bc;"/> from "musical_score"<linebreak/> + <emoji name="mute" unicode="&#x1f507;"/> <emoji name="mute" unicode="&#x1f507;"/> from "mute"<linebreak/> + <emoji name="myanmar" unicode="&#x1f1f2;&#x1f1f2;"/> <emoji name="myanmar" unicode="&#x1f1f2;&#x1f1f2;"/> from "myanmar"<linebreak/> + <emoji name="nail_care" unicode="&#x1f485;"/> <emoji name="nail_care" unicode="&#x1f485;"/> from "nail_care"<linebreak/> + <emoji name="name_badge" unicode="&#x1f4db;"/> <emoji name="name_badge" unicode="&#x1f4db;"/> from "name_badge"<linebreak/> + <emoji name="namibia" unicode="&#x1f1f3;&#x1f1e6;"/> <emoji name="namibia" unicode="&#x1f1f3;&#x1f1e6;"/> from "namibia"<linebreak/> + <emoji name="national_park" unicode="&#x1f3de;"/> <emoji name="national_park" unicode="&#x1f3de;"/> from "national_park"<linebreak/> + <emoji name="nauru" unicode="&#x1f1f3;&#x1f1f7;"/> <emoji name="nauru" unicode="&#x1f1f3;&#x1f1f7;"/> from "nauru"<linebreak/> + <emoji name="nauseated_face" unicode="&#x1f922;"/> <emoji name="nauseated_face" unicode="&#x1f922;"/> from "nauseated_face"<linebreak/> + <emoji name="necktie" unicode="&#x1f454;"/> <emoji name="necktie" unicode="&#x1f454;"/> from "necktie"<linebreak/> + <emoji name="negative_squared_cross_mark" unicode="&#x274e;"/> <emoji name="negative_squared_cross_mark" unicode="&#x274e;"/> from "negative_squared_cross_mark"<linebreak/> + <emoji name="nepal" unicode="&#x1f1f3;&#x1f1f5;"/> <emoji name="nepal" unicode="&#x1f1f3;&#x1f1f5;"/> from "nepal"<linebreak/> + <emoji name="nerd_face" unicode="&#x1f913;"/> <emoji name="nerd_face" unicode="&#x1f913;"/> from "nerd_face"<linebreak/> + <emoji name="netherlands" unicode="&#x1f1f3;&#x1f1f1;"/> <emoji name="netherlands" unicode="&#x1f1f3;&#x1f1f1;"/> from "netherlands"<linebreak/> + <emoji name="neutral_face" unicode="&#x1f610;"/> <emoji name="neutral_face" unicode="&#x1f610;"/> from "neutral_face"<linebreak/> + <emoji name="new" unicode="&#x1f195;"/> <emoji name="new" unicode="&#x1f195;"/> from "new"<linebreak/> + <emoji name="new_caledonia" unicode="&#x1f1f3;&#x1f1e8;"/> <emoji name="new_caledonia" unicode="&#x1f1f3;&#x1f1e8;"/> from "new_caledonia"<linebreak/> + <emoji name="new_moon" unicode="&#x1f311;"/> <emoji name="new_moon" unicode="&#x1f311;"/> from "new_moon"<linebreak/> + <emoji name="new_moon_with_face" unicode="&#x1f31a;"/> <emoji name="new_moon_with_face" unicode="&#x1f31a;"/> from "new_moon_with_face"<linebreak/> + <emoji name="new_zealand" unicode="&#x1f1f3;&#x1f1ff;"/> <emoji name="new_zealand" unicode="&#x1f1f3;&#x1f1ff;"/> from "new_zealand"<linebreak/> + <emoji name="newspaper" unicode="&#x1f4f0;"/> <emoji name="newspaper" unicode="&#x1f4f0;"/> from "newspaper"<linebreak/> + <emoji name="newspaper_roll" unicode="&#x1f5de;"/> <emoji name="newspaper_roll" unicode="&#x1f5de;"/> from "newspaper_roll"<linebreak/> + <emoji name="next_track_button" unicode="&#x23ed;"/> <emoji name="next_track_button" unicode="&#x23ed;"/> from "next_track_button"<linebreak/> + <emoji name="ng" unicode="&#x1f196;"/> <emoji name="ng" unicode="&#x1f196;"/> from "ng"<linebreak/> + <emoji name="ng_man" unicode="&#x1f645;&#x2642;"/> <emoji name="ng_man" unicode="&#x1f645;&#x2642;"/> from "ng_man"<linebreak/> + <emoji name="ng_woman" unicode="&#x1f645;"/> <emoji name="ng_woman" unicode="&#x1f645;"/> from "ng_woman"<linebreak/> + <emoji name="nicaragua" unicode="&#x1f1f3;&#x1f1ee;"/> <emoji name="nicaragua" unicode="&#x1f1f3;&#x1f1ee;"/> from "nicaragua"<linebreak/> + <emoji name="niger" unicode="&#x1f1f3;&#x1f1ea;"/> <emoji name="niger" unicode="&#x1f1f3;&#x1f1ea;"/> from "niger"<linebreak/> + <emoji name="nigeria" unicode="&#x1f1f3;&#x1f1ec;"/> <emoji name="nigeria" unicode="&#x1f1f3;&#x1f1ec;"/> from "nigeria"<linebreak/> + <emoji name="night_with_stars" unicode="&#x1f303;"/> <emoji name="night_with_stars" unicode="&#x1f303;"/> from "night_with_stars"<linebreak/> + <emoji name="nine" unicode="&#x0039;&#x20e3;"/> <emoji name="nine" unicode="&#x0039;&#x20e3;"/> from "nine"<linebreak/> + <emoji name="niue" unicode="&#x1f1f3;&#x1f1fa;"/> <emoji name="niue" unicode="&#x1f1f3;&#x1f1fa;"/> from "niue"<linebreak/> + <emoji name="no_bell" unicode="&#x1f515;"/> <emoji name="no_bell" unicode="&#x1f515;"/> from "no_bell"<linebreak/> + <emoji name="no_bicycles" unicode="&#x1f6b3;"/> <emoji name="no_bicycles" unicode="&#x1f6b3;"/> from "no_bicycles"<linebreak/> + <emoji name="no_entry" unicode="&#x26d4;"/> <emoji name="no_entry" unicode="&#x26d4;"/> from "no_entry"<linebreak/> + <emoji name="no_entry_sign" unicode="&#x1f6ab;"/> <emoji name="no_entry_sign" unicode="&#x1f6ab;"/> from "no_entry_sign"<linebreak/> + <emoji name="no_good" unicode="&#x1f645;"/> <emoji name="no_good" unicode="&#x1f645;"/> from "no_good"<linebreak/> + <emoji name="no_good_man" unicode="&#x1f645;&#x2642;"/> <emoji name="no_good_man" unicode="&#x1f645;&#x2642;"/> from "no_good_man"<linebreak/> + <emoji name="no_good_woman" unicode="&#x1f645;"/> <emoji name="no_good_woman" unicode="&#x1f645;"/> from "no_good_woman"<linebreak/> + <emoji name="no_mobile_phones" unicode="&#x1f4f5;"/> <emoji name="no_mobile_phones" unicode="&#x1f4f5;"/> from "no_mobile_phones"<linebreak/> + <emoji name="no_mouth" unicode="&#x1f636;"/> <emoji name="no_mouth" unicode="&#x1f636;"/> from "no_mouth"<linebreak/> + <emoji name="no_pedestrians" unicode="&#x1f6b7;"/> <emoji name="no_pedestrians" unicode="&#x1f6b7;"/> from "no_pedestrians"<linebreak/> + <emoji name="no_smoking" unicode="&#x1f6ad;"/> <emoji name="no_smoking" unicode="&#x1f6ad;"/> from "no_smoking"<linebreak/> + <emoji name="non-potable_water" unicode="&#x1f6b1;"/> <emoji name="non-potable_water" unicode="&#x1f6b1;"/> from "non-potable_water"<linebreak/> + <emoji name="norfolk_island" unicode="&#x1f1f3;&#x1f1eb;"/> <emoji name="norfolk_island" unicode="&#x1f1f3;&#x1f1eb;"/> from "norfolk_island"<linebreak/> + <emoji name="north_korea" unicode="&#x1f1f0;&#x1f1f5;"/> <emoji name="north_korea" unicode="&#x1f1f0;&#x1f1f5;"/> from "north_korea"<linebreak/> + <emoji name="northern_mariana_islands" unicode="&#x1f1f2;&#x1f1f5;"/> <emoji name="northern_mariana_islands" unicode="&#x1f1f2;&#x1f1f5;"/> from "northern_mariana_islands"<linebreak/> + <emoji name="norway" unicode="&#x1f1f3;&#x1f1f4;"/> <emoji name="norway" unicode="&#x1f1f3;&#x1f1f4;"/> from "norway"<linebreak/> + <emoji name="nose" unicode="&#x1f443;"/> <emoji name="nose" unicode="&#x1f443;"/> from "nose"<linebreak/> + <emoji name="notebook" unicode="&#x1f4d3;"/> <emoji name="notebook" unicode="&#x1f4d3;"/> from "notebook"<linebreak/> + <emoji name="notebook_with_decorative_cover" unicode="&#x1f4d4;"/> <emoji name="notebook_with_decorative_cover" unicode="&#x1f4d4;"/> from "notebook_with_decorative_cover"<linebreak/> + <emoji name="notes" unicode="&#x1f3b6;"/> <emoji name="notes" unicode="&#x1f3b6;"/> from "notes"<linebreak/> + <emoji name="nut_and_bolt" unicode="&#x1f529;"/> <emoji name="nut_and_bolt" unicode="&#x1f529;"/> from "nut_and_bolt"<linebreak/> + <emoji name="o" unicode="&#x2b55;"/> <emoji name="o" unicode="&#x2b55;"/> from "o"<linebreak/> + <emoji name="o2" unicode="&#x1f17e;"/> <emoji name="o2" unicode="&#x1f17e;"/> from "o2"<linebreak/> + <emoji name="ocean" unicode="&#x1f30a;"/> <emoji name="ocean" unicode="&#x1f30a;"/> from "ocean"<linebreak/> + <emoji name="octopus" unicode="&#x1f419;"/> <emoji name="octopus" unicode="&#x1f419;"/> from "octopus"<linebreak/> + <emoji name="oden" unicode="&#x1f362;"/> <emoji name="oden" unicode="&#x1f362;"/> from "oden"<linebreak/> + <emoji name="office" unicode="&#x1f3e2;"/> <emoji name="office" unicode="&#x1f3e2;"/> from "office"<linebreak/> + <emoji name="oil_drum" unicode="&#x1f6e2;"/> <emoji name="oil_drum" unicode="&#x1f6e2;"/> from "oil_drum"<linebreak/> + <emoji name="ok" unicode="&#x1f197;"/> <emoji name="ok" unicode="&#x1f197;"/> from "ok"<linebreak/> + <emoji name="ok_hand" unicode="&#x1f44c;"/> <emoji name="ok_hand" unicode="&#x1f44c;"/> from "ok_hand"<linebreak/> + <emoji name="ok_man" unicode="&#x1f646;&#x2642;"/> <emoji name="ok_man" unicode="&#x1f646;&#x2642;"/> from "ok_man"<linebreak/> + <emoji name="ok_woman" unicode="&#x1f646;"/> <emoji name="ok_woman" unicode="&#x1f646;"/> from "ok_woman"<linebreak/> + <emoji name="old_key" unicode="&#x1f5dd;"/> <emoji name="old_key" unicode="&#x1f5dd;"/> from "old_key"<linebreak/> + <emoji name="older_man" unicode="&#x1f474;"/> <emoji name="older_man" unicode="&#x1f474;"/> from "older_man"<linebreak/> + <emoji name="older_woman" unicode="&#x1f475;"/> <emoji name="older_woman" unicode="&#x1f475;"/> from "older_woman"<linebreak/> + <emoji name="om" unicode="&#x1f549;"/> <emoji name="om" unicode="&#x1f549;"/> from "om"<linebreak/> + <emoji name="oman" unicode="&#x1f1f4;&#x1f1f2;"/> <emoji name="oman" unicode="&#x1f1f4;&#x1f1f2;"/> from "oman"<linebreak/> + <emoji name="on" unicode="&#x1f51b;"/> <emoji name="on" unicode="&#x1f51b;"/> from "on"<linebreak/> + <emoji name="oncoming_automobile" unicode="&#x1f698;"/> <emoji name="oncoming_automobile" unicode="&#x1f698;"/> from "oncoming_automobile"<linebreak/> + <emoji name="oncoming_bus" unicode="&#x1f68d;"/> <emoji name="oncoming_bus" unicode="&#x1f68d;"/> from "oncoming_bus"<linebreak/> + <emoji name="oncoming_police_car" unicode="&#x1f694;"/> <emoji name="oncoming_police_car" unicode="&#x1f694;"/> from "oncoming_police_car"<linebreak/> + <emoji name="oncoming_taxi" unicode="&#x1f696;"/> <emoji name="oncoming_taxi" unicode="&#x1f696;"/> from "oncoming_taxi"<linebreak/> + <emoji name="one" unicode="&#x0031;&#x20e3;"/> <emoji name="one" unicode="&#x0031;&#x20e3;"/> from "one"<linebreak/> + <emoji name="open_book" unicode="&#x1f4d6;"/> <emoji name="open_book" unicode="&#x1f4d6;"/> from "open_book"<linebreak/> + <emoji name="open_file_folder" unicode="&#x1f4c2;"/> <emoji name="open_file_folder" unicode="&#x1f4c2;"/> from "open_file_folder"<linebreak/> + <emoji name="open_hands" unicode="&#x1f450;"/> <emoji name="open_hands" unicode="&#x1f450;"/> from "open_hands"<linebreak/> + <emoji name="open_mouth" unicode="&#x1f62e;"/> <emoji name="open_mouth" unicode="&#x1f62e;"/> from "open_mouth"<linebreak/> + <emoji name="open_umbrella" unicode="&#x2602;"/> <emoji name="open_umbrella" unicode="&#x2602;"/> from "open_umbrella"<linebreak/> + <emoji name="ophiuchus" unicode="&#x26ce;"/> <emoji name="ophiuchus" unicode="&#x26ce;"/> from "ophiuchus"<linebreak/> + <emoji name="orange" unicode="&#x1f34a;"/> <emoji name="orange" unicode="&#x1f34a;"/> from "orange"<linebreak/> + <emoji name="orange_book" unicode="&#x1f4d9;"/> <emoji name="orange_book" unicode="&#x1f4d9;"/> from "orange_book"<linebreak/> + <emoji name="orthodox_cross" unicode="&#x2626;"/> <emoji name="orthodox_cross" unicode="&#x2626;"/> from "orthodox_cross"<linebreak/> + <emoji name="outbox_tray" unicode="&#x1f4e4;"/> <emoji name="outbox_tray" unicode="&#x1f4e4;"/> from "outbox_tray"<linebreak/> + <emoji name="owl" unicode="&#x1f989;"/> <emoji name="owl" unicode="&#x1f989;"/> from "owl"<linebreak/> + <emoji name="ox" unicode="&#x1f402;"/> <emoji name="ox" unicode="&#x1f402;"/> from "ox"<linebreak/> + <emoji name="package" unicode="&#x1f4e6;"/> <emoji name="package" unicode="&#x1f4e6;"/> from "package"<linebreak/> + <emoji name="page_facing_up" unicode="&#x1f4c4;"/> <emoji name="page_facing_up" unicode="&#x1f4c4;"/> from "page_facing_up"<linebreak/> + <emoji name="page_with_curl" unicode="&#x1f4c3;"/> <emoji name="page_with_curl" unicode="&#x1f4c3;"/> from "page_with_curl"<linebreak/> + <emoji name="pager" unicode="&#x1f4df;"/> <emoji name="pager" unicode="&#x1f4df;"/> from "pager"<linebreak/> + <emoji name="paintbrush" unicode="&#x1f58c;"/> <emoji name="paintbrush" unicode="&#x1f58c;"/> from "paintbrush"<linebreak/> + <emoji name="pakistan" unicode="&#x1f1f5;&#x1f1f0;"/> <emoji name="pakistan" unicode="&#x1f1f5;&#x1f1f0;"/> from "pakistan"<linebreak/> + <emoji name="palau" unicode="&#x1f1f5;&#x1f1fc;"/> <emoji name="palau" unicode="&#x1f1f5;&#x1f1fc;"/> from "palau"<linebreak/> + <emoji name="palestinian_territories" unicode="&#x1f1f5;&#x1f1f8;"/> <emoji name="palestinian_territories" unicode="&#x1f1f5;&#x1f1f8;"/> from "palestinian_territories"<linebreak/> + <emoji name="palm_tree" unicode="&#x1f334;"/> <emoji name="palm_tree" unicode="&#x1f334;"/> from "palm_tree"<linebreak/> + <emoji name="panama" unicode="&#x1f1f5;&#x1f1e6;"/> <emoji name="panama" unicode="&#x1f1f5;&#x1f1e6;"/> from "panama"<linebreak/> + <emoji name="pancakes" unicode="&#x1f95e;"/> <emoji name="pancakes" unicode="&#x1f95e;"/> from "pancakes"<linebreak/> + <emoji name="panda_face" unicode="&#x1f43c;"/> <emoji name="panda_face" unicode="&#x1f43c;"/> from "panda_face"<linebreak/> + <emoji name="paperclip" unicode="&#x1f4ce;"/> <emoji name="paperclip" unicode="&#x1f4ce;"/> from "paperclip"<linebreak/> + <emoji name="paperclips" unicode="&#x1f587;"/> <emoji name="paperclips" unicode="&#x1f587;"/> from "paperclips"<linebreak/> + <emoji name="papua_new_guinea" unicode="&#x1f1f5;&#x1f1ec;"/> <emoji name="papua_new_guinea" unicode="&#x1f1f5;&#x1f1ec;"/> from "papua_new_guinea"<linebreak/> + <emoji name="paraguay" unicode="&#x1f1f5;&#x1f1fe;"/> <emoji name="paraguay" unicode="&#x1f1f5;&#x1f1fe;"/> from "paraguay"<linebreak/> + <emoji name="parasol_on_ground" unicode="&#x26f1;"/> <emoji name="parasol_on_ground" unicode="&#x26f1;"/> from "parasol_on_ground"<linebreak/> + <emoji name="parking" unicode="&#x1f17f;"/> <emoji name="parking" unicode="&#x1f17f;"/> from "parking"<linebreak/> + <emoji name="part_alternation_mark" unicode="&#x303d;"/> <emoji name="part_alternation_mark" unicode="&#x303d;"/> from "part_alternation_mark"<linebreak/> + <emoji name="partly_sunny" unicode="&#x26c5;"/> <emoji name="partly_sunny" unicode="&#x26c5;"/> from "partly_sunny"<linebreak/> + <emoji name="passenger_ship" unicode="&#x1f6f3;"/> <emoji name="passenger_ship" unicode="&#x1f6f3;"/> from "passenger_ship"<linebreak/> + <emoji name="passport_control" unicode="&#x1f6c2;"/> <emoji name="passport_control" unicode="&#x1f6c2;"/> from "passport_control"<linebreak/> + <emoji name="pause_button" unicode="&#x23f8;"/> <emoji name="pause_button" unicode="&#x23f8;"/> from "pause_button"<linebreak/> + <emoji name="paw_prints" unicode="&#x1f43e;"/> <emoji name="paw_prints" unicode="&#x1f43e;"/> from "paw_prints"<linebreak/> + <emoji name="peace_symbol" unicode="&#x262e;"/> <emoji name="peace_symbol" unicode="&#x262e;"/> from "peace_symbol"<linebreak/> + <emoji name="peach" unicode="&#x1f351;"/> <emoji name="peach" unicode="&#x1f351;"/> from "peach"<linebreak/> + <emoji name="peanuts" unicode="&#x1f95c;"/> <emoji name="peanuts" unicode="&#x1f95c;"/> from "peanuts"<linebreak/> + <emoji name="pear" unicode="&#x1f350;"/> <emoji name="pear" unicode="&#x1f350;"/> from "pear"<linebreak/> + <emoji name="pen" unicode="&#x1f58a;"/> <emoji name="pen" unicode="&#x1f58a;"/> from "pen"<linebreak/> + <emoji name="pencil" unicode="&#x1f4dd;"/> <emoji name="pencil" unicode="&#x1f4dd;"/> from "pencil"<linebreak/> + <emoji name="pencil2" unicode="&#x270f;"/> <emoji name="pencil2" unicode="&#x270f;"/> from "pencil2"<linebreak/> + <emoji name="penguin" unicode="&#x1f427;"/> <emoji name="penguin" unicode="&#x1f427;"/> from "penguin"<linebreak/> + <emoji name="pensive" unicode="&#x1f614;"/> <emoji name="pensive" unicode="&#x1f614;"/> from "pensive"<linebreak/> + <emoji name="performing_arts" unicode="&#x1f3ad;"/> <emoji name="performing_arts" unicode="&#x1f3ad;"/> from "performing_arts"<linebreak/> + <emoji name="persevere" unicode="&#x1f623;"/> <emoji name="persevere" unicode="&#x1f623;"/> from "persevere"<linebreak/> + <emoji name="person_fencing" unicode="&#x1f93a;"/> <emoji name="person_fencing" unicode="&#x1f93a;"/> from "person_fencing"<linebreak/> + <emoji name="person_frowning" unicode="&#x1f64d;"/> <emoji name="person_frowning" unicode="&#x1f64d;"/> from "person_frowning"<linebreak/> + <emoji name="person_with_blond_hair" unicode="&#x1f471;"/> <emoji name="person_with_blond_hair" unicode="&#x1f471;"/> from "person_with_blond_hair"<linebreak/> + <emoji name="person_with_pouting_face" unicode="&#x1f64e;"/> <emoji name="person_with_pouting_face" unicode="&#x1f64e;"/> from "person_with_pouting_face"<linebreak/> + <emoji name="peru" unicode="&#x1f1f5;&#x1f1ea;"/> <emoji name="peru" unicode="&#x1f1f5;&#x1f1ea;"/> from "peru"<linebreak/> + <emoji name="philippines" unicode="&#x1f1f5;&#x1f1ed;"/> <emoji name="philippines" unicode="&#x1f1f5;&#x1f1ed;"/> from "philippines"<linebreak/> + <emoji name="phone" unicode="&#x260e;"/> <emoji name="phone" unicode="&#x260e;"/> from "phone"<linebreak/> + <emoji name="pick" unicode="&#x26cf;"/> <emoji name="pick" unicode="&#x26cf;"/> from "pick"<linebreak/> + <emoji name="pig" unicode="&#x1f437;"/> <emoji name="pig" unicode="&#x1f437;"/> from "pig"<linebreak/> + <emoji name="pig2" unicode="&#x1f416;"/> <emoji name="pig2" unicode="&#x1f416;"/> from "pig2"<linebreak/> + <emoji name="pig_nose" unicode="&#x1f43d;"/> <emoji name="pig_nose" unicode="&#x1f43d;"/> from "pig_nose"<linebreak/> + <emoji name="pill" unicode="&#x1f48a;"/> <emoji name="pill" unicode="&#x1f48a;"/> from "pill"<linebreak/> + <emoji name="pineapple" unicode="&#x1f34d;"/> <emoji name="pineapple" unicode="&#x1f34d;"/> from "pineapple"<linebreak/> + <emoji name="ping_pong" unicode="&#x1f3d3;"/> <emoji name="ping_pong" unicode="&#x1f3d3;"/> from "ping_pong"<linebreak/> + <emoji name="pisces" unicode="&#x2653;"/> <emoji name="pisces" unicode="&#x2653;"/> from "pisces"<linebreak/> + <emoji name="pitcairn_islands" unicode="&#x1f1f5;&#x1f1f3;"/> <emoji name="pitcairn_islands" unicode="&#x1f1f5;&#x1f1f3;"/> from "pitcairn_islands"<linebreak/> + <emoji name="pizza" unicode="&#x1f355;"/> <emoji name="pizza" unicode="&#x1f355;"/> from "pizza"<linebreak/> + <emoji name="place_of_worship" unicode="&#x1f6d0;"/> <emoji name="place_of_worship" unicode="&#x1f6d0;"/> from "place_of_worship"<linebreak/> + <emoji name="plate_with_cutlery" unicode="&#x1f37d;"/> <emoji name="plate_with_cutlery" unicode="&#x1f37d;"/> from "plate_with_cutlery"<linebreak/> + <emoji name="play_or_pause_button" unicode="&#x23ef;"/> <emoji name="play_or_pause_button" unicode="&#x23ef;"/> from "play_or_pause_button"<linebreak/> + <emoji name="point_down" unicode="&#x1f447;"/> <emoji name="point_down" unicode="&#x1f447;"/> from "point_down"<linebreak/> + <emoji name="point_left" unicode="&#x1f448;"/> <emoji name="point_left" unicode="&#x1f448;"/> from "point_left"<linebreak/> + <emoji name="point_right" unicode="&#x1f449;"/> <emoji name="point_right" unicode="&#x1f449;"/> from "point_right"<linebreak/> + <emoji name="point_up" unicode="&#x261d;"/> <emoji name="point_up" unicode="&#x261d;"/> from "point_up"<linebreak/> + <emoji name="point_up_2" unicode="&#x1f446;"/> <emoji name="point_up_2" unicode="&#x1f446;"/> from "point_up_2"<linebreak/> + <emoji name="poland" unicode="&#x1f1f5;&#x1f1f1;"/> <emoji name="poland" unicode="&#x1f1f5;&#x1f1f1;"/> from "poland"<linebreak/> + <emoji name="police_car" unicode="&#x1f693;"/> <emoji name="police_car" unicode="&#x1f693;"/> from "police_car"<linebreak/> + <emoji name="policeman" unicode="&#x1f46e;"/> <emoji name="policeman" unicode="&#x1f46e;"/> from "policeman"<linebreak/> + <emoji name="policewoman" unicode="&#x1f46e;&#x2640;"/> <emoji name="policewoman" unicode="&#x1f46e;&#x2640;"/> from "policewoman"<linebreak/> + <emoji name="poodle" unicode="&#x1f429;"/> <emoji name="poodle" unicode="&#x1f429;"/> from "poodle"<linebreak/> + <emoji name="poop" unicode="&#x1f4a9;"/> <emoji name="poop" unicode="&#x1f4a9;"/> from "poop"<linebreak/> + <emoji name="popcorn" unicode="&#x1f37f;"/> <emoji name="popcorn" unicode="&#x1f37f;"/> from "popcorn"<linebreak/> + <emoji name="portugal" unicode="&#x1f1f5;&#x1f1f9;"/> <emoji name="portugal" unicode="&#x1f1f5;&#x1f1f9;"/> from "portugal"<linebreak/> + <emoji name="post_office" unicode="&#x1f3e3;"/> <emoji name="post_office" unicode="&#x1f3e3;"/> from "post_office"<linebreak/> + <emoji name="postal_horn" unicode="&#x1f4ef;"/> <emoji name="postal_horn" unicode="&#x1f4ef;"/> from "postal_horn"<linebreak/> + <emoji name="postbox" unicode="&#x1f4ee;"/> <emoji name="postbox" unicode="&#x1f4ee;"/> from "postbox"<linebreak/> + <emoji name="potable_water" unicode="&#x1f6b0;"/> <emoji name="potable_water" unicode="&#x1f6b0;"/> from "potable_water"<linebreak/> + <emoji name="potato" unicode="&#x1f954;"/> <emoji name="potato" unicode="&#x1f954;"/> from "potato"<linebreak/> + <emoji name="pouch" unicode="&#x1f45d;"/> <emoji name="pouch" unicode="&#x1f45d;"/> from "pouch"<linebreak/> + <emoji name="poultry_leg" unicode="&#x1f357;"/> <emoji name="poultry_leg" unicode="&#x1f357;"/> from "poultry_leg"<linebreak/> + <emoji name="pound" unicode="&#x1f4b7;"/> <emoji name="pound" unicode="&#x1f4b7;"/> from "pound"<linebreak/> + <emoji name="pout" unicode="&#x1f621;"/> <emoji name="pout" unicode="&#x1f621;"/> from "pout"<linebreak/> + <emoji name="pouting_cat" unicode="&#x1f63e;"/> <emoji name="pouting_cat" unicode="&#x1f63e;"/> from "pouting_cat"<linebreak/> + <emoji name="pouting_man" unicode="&#x1f64e;&#x2642;"/> <emoji name="pouting_man" unicode="&#x1f64e;&#x2642;"/> from "pouting_man"<linebreak/> + <emoji name="pouting_woman" unicode="&#x1f64e;"/> <emoji name="pouting_woman" unicode="&#x1f64e;"/> from "pouting_woman"<linebreak/> + <emoji name="pray" unicode="&#x1f64f;"/> <emoji name="pray" unicode="&#x1f64f;"/> from "pray"<linebreak/> + <emoji name="prayer_beads" unicode="&#x1f4ff;"/> <emoji name="prayer_beads" unicode="&#x1f4ff;"/> from "prayer_beads"<linebreak/> + <emoji name="pregnant_woman" unicode="&#x1f930;"/> <emoji name="pregnant_woman" unicode="&#x1f930;"/> from "pregnant_woman"<linebreak/> + <emoji name="previous_track_button" unicode="&#x23ee;"/> <emoji name="previous_track_button" unicode="&#x23ee;"/> from "previous_track_button"<linebreak/> + <emoji name="prince" unicode="&#x1f934;"/> <emoji name="prince" unicode="&#x1f934;"/> from "prince"<linebreak/> + <emoji name="princess" unicode="&#x1f478;"/> <emoji name="princess" unicode="&#x1f478;"/> from "princess"<linebreak/> + <emoji name="printer" unicode="&#x1f5a8;"/> <emoji name="printer" unicode="&#x1f5a8;"/> from "printer"<linebreak/> + <emoji name="puerto_rico" unicode="&#x1f1f5;&#x1f1f7;"/> <emoji name="puerto_rico" unicode="&#x1f1f5;&#x1f1f7;"/> from "puerto_rico"<linebreak/> + <emoji name="punch" unicode="&#x1f44a;"/> <emoji name="punch" unicode="&#x1f44a;"/> from "punch"<linebreak/> + <emoji name="purple_heart" unicode="&#x1f49c;"/> <emoji name="purple_heart" unicode="&#x1f49c;"/> from "purple_heart"<linebreak/> + <emoji name="purse" unicode="&#x1f45b;"/> <emoji name="purse" unicode="&#x1f45b;"/> from "purse"<linebreak/> + <emoji name="pushpin" unicode="&#x1f4cc;"/> <emoji name="pushpin" unicode="&#x1f4cc;"/> from "pushpin"<linebreak/> + <emoji name="put_litter_in_its_place" unicode="&#x1f6ae;"/> <emoji name="put_litter_in_its_place" unicode="&#x1f6ae;"/> from "put_litter_in_its_place"<linebreak/> + <emoji name="qatar" unicode="&#x1f1f6;&#x1f1e6;"/> <emoji name="qatar" unicode="&#x1f1f6;&#x1f1e6;"/> from "qatar"<linebreak/> + <emoji name="question" unicode="&#x2753;"/> <emoji name="question" unicode="&#x2753;"/> from "question"<linebreak/> + <emoji name="rabbit" unicode="&#x1f430;"/> <emoji name="rabbit" unicode="&#x1f430;"/> from "rabbit"<linebreak/> + <emoji name="rabbit2" unicode="&#x1f407;"/> <emoji name="rabbit2" unicode="&#x1f407;"/> from "rabbit2"<linebreak/> + <emoji name="racehorse" unicode="&#x1f40e;"/> <emoji name="racehorse" unicode="&#x1f40e;"/> from "racehorse"<linebreak/> + <emoji name="racing_car" unicode="&#x1f3ce;"/> <emoji name="racing_car" unicode="&#x1f3ce;"/> from "racing_car"<linebreak/> + <emoji name="radio" unicode="&#x1f4fb;"/> <emoji name="radio" unicode="&#x1f4fb;"/> from "radio"<linebreak/> + <emoji name="radio_button" unicode="&#x1f518;"/> <emoji name="radio_button" unicode="&#x1f518;"/> from "radio_button"<linebreak/> + <emoji name="radioactive" unicode="&#x2622;"/> <emoji name="radioactive" unicode="&#x2622;"/> from "radioactive"<linebreak/> + <emoji name="rage" unicode="&#x1f621;"/> <emoji name="rage" unicode="&#x1f621;"/> from "rage"<linebreak/> + <emoji name="railway_car" unicode="&#x1f683;"/> <emoji name="railway_car" unicode="&#x1f683;"/> from "railway_car"<linebreak/> + <emoji name="railway_track" unicode="&#x1f6e4;"/> <emoji name="railway_track" unicode="&#x1f6e4;"/> from "railway_track"<linebreak/> + <emoji name="rainbow" unicode="&#x1f308;"/> <emoji name="rainbow" unicode="&#x1f308;"/> from "rainbow"<linebreak/> + <emoji name="rainbow_flag" unicode="&#x1f3f3;&#x1f308;"/> <emoji name="rainbow_flag" unicode="&#x1f3f3;&#x1f308;"/> from "rainbow_flag"<linebreak/> + <emoji name="raised_back_of_hand" unicode="&#x1f91a;"/> <emoji name="raised_back_of_hand" unicode="&#x1f91a;"/> from "raised_back_of_hand"<linebreak/> + <emoji name="raised_hand" unicode="&#x270b;"/> <emoji name="raised_hand" unicode="&#x270b;"/> from "raised_hand"<linebreak/> + <emoji name="raised_hand_with_fingers_splayed" unicode="&#x1f590;"/> <emoji name="raised_hand_with_fingers_splayed" unicode="&#x1f590;"/> from "raised_hand_with_fingers_splayed"<linebreak/> + <emoji name="raised_hands" unicode="&#x1f64c;"/> <emoji name="raised_hands" unicode="&#x1f64c;"/> from "raised_hands"<linebreak/> + <emoji name="raising_hand" unicode="&#x1f64b;"/> <emoji name="raising_hand" unicode="&#x1f64b;"/> from "raising_hand"<linebreak/> + <emoji name="raising_hand_man" unicode="&#x1f64b;&#x2642;"/> <emoji name="raising_hand_man" unicode="&#x1f64b;&#x2642;"/> from "raising_hand_man"<linebreak/> + <emoji name="raising_hand_woman" unicode="&#x1f64b;"/> <emoji name="raising_hand_woman" unicode="&#x1f64b;"/> from "raising_hand_woman"<linebreak/> + <emoji name="ram" unicode="&#x1f40f;"/> <emoji name="ram" unicode="&#x1f40f;"/> from "ram"<linebreak/> + <emoji name="ramen" unicode="&#x1f35c;"/> <emoji name="ramen" unicode="&#x1f35c;"/> from "ramen"<linebreak/> + <emoji name="rat" unicode="&#x1f400;"/> <emoji name="rat" unicode="&#x1f400;"/> from "rat"<linebreak/> + <emoji name="record_button" unicode="&#x23fa;"/> <emoji name="record_button" unicode="&#x23fa;"/> from "record_button"<linebreak/> + <emoji name="recycle" unicode="&#x267b;"/> <emoji name="recycle" unicode="&#x267b;"/> from "recycle"<linebreak/> + <emoji name="red_car" unicode="&#x1f697;"/> <emoji name="red_car" unicode="&#x1f697;"/> from "red_car"<linebreak/> + <emoji name="red_circle" unicode="&#x1f534;"/> <emoji name="red_circle" unicode="&#x1f534;"/> from "red_circle"<linebreak/> + <emoji name="registered" unicode="&#x00ae;"/> <emoji name="registered" unicode="&#x00ae;"/> from "registered"<linebreak/> + <emoji name="relaxed" unicode="&#x263a;"/> <emoji name="relaxed" unicode="&#x263a;"/> from "relaxed"<linebreak/> + <emoji name="relieved" unicode="&#x1f60c;"/> <emoji name="relieved" unicode="&#x1f60c;"/> from "relieved"<linebreak/> + <emoji name="reminder_ribbon" unicode="&#x1f397;"/> <emoji name="reminder_ribbon" unicode="&#x1f397;"/> from "reminder_ribbon"<linebreak/> + <emoji name="repeat" unicode="&#x1f501;"/> <emoji name="repeat" unicode="&#x1f501;"/> from "repeat"<linebreak/> + <emoji name="repeat_one" unicode="&#x1f502;"/> <emoji name="repeat_one" unicode="&#x1f502;"/> from "repeat_one"<linebreak/> + <emoji name="rescue_worker_helmet" unicode="&#x26d1;"/> <emoji name="rescue_worker_helmet" unicode="&#x26d1;"/> from "rescue_worker_helmet"<linebreak/> + <emoji name="restroom" unicode="&#x1f6bb;"/> <emoji name="restroom" unicode="&#x1f6bb;"/> from "restroom"<linebreak/> + <emoji name="reunion" unicode="&#x1f1f7;&#x1f1ea;"/> <emoji name="reunion" unicode="&#x1f1f7;&#x1f1ea;"/> from "reunion"<linebreak/> + <emoji name="revolving_hearts" unicode="&#x1f49e;"/> <emoji name="revolving_hearts" unicode="&#x1f49e;"/> from "revolving_hearts"<linebreak/> + <emoji name="rewind" unicode="&#x23ea;"/> <emoji name="rewind" unicode="&#x23ea;"/> from "rewind"<linebreak/> + <emoji name="rhinoceros" unicode="&#x1f98f;"/> <emoji name="rhinoceros" unicode="&#x1f98f;"/> from "rhinoceros"<linebreak/> + <emoji name="ribbon" unicode="&#x1f380;"/> <emoji name="ribbon" unicode="&#x1f380;"/> from "ribbon"<linebreak/> + <emoji name="rice" unicode="&#x1f35a;"/> <emoji name="rice" unicode="&#x1f35a;"/> from "rice"<linebreak/> + <emoji name="rice_ball" unicode="&#x1f359;"/> <emoji name="rice_ball" unicode="&#x1f359;"/> from "rice_ball"<linebreak/> + <emoji name="rice_cracker" unicode="&#x1f358;"/> <emoji name="rice_cracker" unicode="&#x1f358;"/> from "rice_cracker"<linebreak/> + <emoji name="rice_scene" unicode="&#x1f391;"/> <emoji name="rice_scene" unicode="&#x1f391;"/> from "rice_scene"<linebreak/> + <emoji name="right_anger_bubble" unicode="&#x1f5ef;"/> <emoji name="right_anger_bubble" unicode="&#x1f5ef;"/> from "right_anger_bubble"<linebreak/> + <emoji name="ring" unicode="&#x1f48d;"/> <emoji name="ring" unicode="&#x1f48d;"/> from "ring"<linebreak/> + <emoji name="robot" unicode="&#x1f916;"/> <emoji name="robot" unicode="&#x1f916;"/> from "robot"<linebreak/> + <emoji name="rocket" unicode="&#x1f680;"/> <emoji name="rocket" unicode="&#x1f680;"/> from "rocket"<linebreak/> + <emoji name="rofl" unicode="&#x1f923;"/> <emoji name="rofl" unicode="&#x1f923;"/> from "rofl"<linebreak/> + <emoji name="roll_eyes" unicode="&#x1f644;"/> <emoji name="roll_eyes" unicode="&#x1f644;"/> from "roll_eyes"<linebreak/> + <emoji name="roller_coaster" unicode="&#x1f3a2;"/> <emoji name="roller_coaster" unicode="&#x1f3a2;"/> from "roller_coaster"<linebreak/> + <emoji name="romania" unicode="&#x1f1f7;&#x1f1f4;"/> <emoji name="romania" unicode="&#x1f1f7;&#x1f1f4;"/> from "romania"<linebreak/> + <emoji name="rooster" unicode="&#x1f413;"/> <emoji name="rooster" unicode="&#x1f413;"/> from "rooster"<linebreak/> + <emoji name="rose" unicode="&#x1f339;"/> <emoji name="rose" unicode="&#x1f339;"/> from "rose"<linebreak/> + <emoji name="rosette" unicode="&#x1f3f5;"/> <emoji name="rosette" unicode="&#x1f3f5;"/> from "rosette"<linebreak/> + <emoji name="rotating_light" unicode="&#x1f6a8;"/> <emoji name="rotating_light" unicode="&#x1f6a8;"/> from "rotating_light"<linebreak/> + <emoji name="round_pushpin" unicode="&#x1f4cd;"/> <emoji name="round_pushpin" unicode="&#x1f4cd;"/> from "round_pushpin"<linebreak/> + <emoji name="rowboat" unicode="&#x1f6a3;"/> <emoji name="rowboat" unicode="&#x1f6a3;"/> from "rowboat"<linebreak/> + <emoji name="rowing_man" unicode="&#x1f6a3;"/> <emoji name="rowing_man" unicode="&#x1f6a3;"/> from "rowing_man"<linebreak/> + <emoji name="rowing_woman" unicode="&#x1f6a3;&#x2640;"/> <emoji name="rowing_woman" unicode="&#x1f6a3;&#x2640;"/> from "rowing_woman"<linebreak/> + <emoji name="ru" unicode="&#x1f1f7;&#x1f1fa;"/> <emoji name="ru" unicode="&#x1f1f7;&#x1f1fa;"/> from "ru"<linebreak/> + <emoji name="rugby_football" unicode="&#x1f3c9;"/> <emoji name="rugby_football" unicode="&#x1f3c9;"/> from "rugby_football"<linebreak/> + <emoji name="runner" unicode="&#x1f3c3;"/> <emoji name="runner" unicode="&#x1f3c3;"/> from "runner"<linebreak/> + <emoji name="running" unicode="&#x1f3c3;"/> <emoji name="running" unicode="&#x1f3c3;"/> from "running"<linebreak/> + <emoji name="running_man" unicode="&#x1f3c3;"/> <emoji name="running_man" unicode="&#x1f3c3;"/> from "running_man"<linebreak/> + <emoji name="running_shirt_with_sash" unicode="&#x1f3bd;"/> <emoji name="running_shirt_with_sash" unicode="&#x1f3bd;"/> from "running_shirt_with_sash"<linebreak/> + <emoji name="running_woman" unicode="&#x1f3c3;&#x2640;"/> <emoji name="running_woman" unicode="&#x1f3c3;&#x2640;"/> from "running_woman"<linebreak/> + <emoji name="rwanda" unicode="&#x1f1f7;&#x1f1fc;"/> <emoji name="rwanda" unicode="&#x1f1f7;&#x1f1fc;"/> from "rwanda"<linebreak/> + <emoji name="sa" unicode="&#x1f202;"/> <emoji name="sa" unicode="&#x1f202;"/> from "sa"<linebreak/> + <emoji name="sagittarius" unicode="&#x2650;"/> <emoji name="sagittarius" unicode="&#x2650;"/> from "sagittarius"<linebreak/> + <emoji name="sailboat" unicode="&#x26f5;"/> <emoji name="sailboat" unicode="&#x26f5;"/> from "sailboat"<linebreak/> + <emoji name="sake" unicode="&#x1f376;"/> <emoji name="sake" unicode="&#x1f376;"/> from "sake"<linebreak/> + <emoji name="samoa" unicode="&#x1f1fc;&#x1f1f8;"/> <emoji name="samoa" unicode="&#x1f1fc;&#x1f1f8;"/> from "samoa"<linebreak/> + <emoji name="san_marino" unicode="&#x1f1f8;&#x1f1f2;"/> <emoji name="san_marino" unicode="&#x1f1f8;&#x1f1f2;"/> from "san_marino"<linebreak/> + <emoji name="sandal" unicode="&#x1f461;"/> <emoji name="sandal" unicode="&#x1f461;"/> from "sandal"<linebreak/> + <emoji name="santa" unicode="&#x1f385;"/> <emoji name="santa" unicode="&#x1f385;"/> from "santa"<linebreak/> + <emoji name="sao_tome_principe" unicode="&#x1f1f8;&#x1f1f9;"/> <emoji name="sao_tome_principe" unicode="&#x1f1f8;&#x1f1f9;"/> from "sao_tome_principe"<linebreak/> + <emoji name="satellite" unicode="&#x1f4e1;"/> <emoji name="satellite" unicode="&#x1f4e1;"/> from "satellite"<linebreak/> + <emoji name="satisfied" unicode="&#x1f606;"/> <emoji name="satisfied" unicode="&#x1f606;"/> from "satisfied"<linebreak/> + <emoji name="saudi_arabia" unicode="&#x1f1f8;&#x1f1e6;"/> <emoji name="saudi_arabia" unicode="&#x1f1f8;&#x1f1e6;"/> from "saudi_arabia"<linebreak/> + <emoji name="saxophone" unicode="&#x1f3b7;"/> <emoji name="saxophone" unicode="&#x1f3b7;"/> from "saxophone"<linebreak/> + <emoji name="school" unicode="&#x1f3eb;"/> <emoji name="school" unicode="&#x1f3eb;"/> from "school"<linebreak/> + <emoji name="school_satchel" unicode="&#x1f392;"/> <emoji name="school_satchel" unicode="&#x1f392;"/> from "school_satchel"<linebreak/> + <emoji name="scissors" unicode="&#x2702;"/> <emoji name="scissors" unicode="&#x2702;"/> from "scissors"<linebreak/> + <emoji name="scorpion" unicode="&#x1f982;"/> <emoji name="scorpion" unicode="&#x1f982;"/> from "scorpion"<linebreak/> + <emoji name="scorpius" unicode="&#x264f;"/> <emoji name="scorpius" unicode="&#x264f;"/> from "scorpius"<linebreak/> + <emoji name="scream" unicode="&#x1f631;"/> <emoji name="scream" unicode="&#x1f631;"/> from "scream"<linebreak/> + <emoji name="scream_cat" unicode="&#x1f640;"/> <emoji name="scream_cat" unicode="&#x1f640;"/> from "scream_cat"<linebreak/> + <emoji name="scroll" unicode="&#x1f4dc;"/> <emoji name="scroll" unicode="&#x1f4dc;"/> from "scroll"<linebreak/> + <emoji name="seat" unicode="&#x1f4ba;"/> <emoji name="seat" unicode="&#x1f4ba;"/> from "seat"<linebreak/> + <emoji name="secret" unicode="&#x3299;"/> <emoji name="secret" unicode="&#x3299;"/> from "secret"<linebreak/> + <emoji name="see_no_evil" unicode="&#x1f648;"/> <emoji name="see_no_evil" unicode="&#x1f648;"/> from "see_no_evil"<linebreak/> + <emoji name="seedling" unicode="&#x1f331;"/> <emoji name="seedling" unicode="&#x1f331;"/> from "seedling"<linebreak/> + <emoji name="selfie" unicode="&#x1f933;"/> <emoji name="selfie" unicode="&#x1f933;"/> from "selfie"<linebreak/> + <emoji name="senegal" unicode="&#x1f1f8;&#x1f1f3;"/> <emoji name="senegal" unicode="&#x1f1f8;&#x1f1f3;"/> from "senegal"<linebreak/> + <emoji name="serbia" unicode="&#x1f1f7;&#x1f1f8;"/> <emoji name="serbia" unicode="&#x1f1f7;&#x1f1f8;"/> from "serbia"<linebreak/> + <emoji name="seven" unicode="&#x0037;&#x20e3;"/> <emoji name="seven" unicode="&#x0037;&#x20e3;"/> from "seven"<linebreak/> + <emoji name="seychelles" unicode="&#x1f1f8;&#x1f1e8;"/> <emoji name="seychelles" unicode="&#x1f1f8;&#x1f1e8;"/> from "seychelles"<linebreak/> + <emoji name="shallow_pan_of_food" unicode="&#x1f958;"/> <emoji name="shallow_pan_of_food" unicode="&#x1f958;"/> from "shallow_pan_of_food"<linebreak/> + <emoji name="shamrock" unicode="&#x2618;"/> <emoji name="shamrock" unicode="&#x2618;"/> from "shamrock"<linebreak/> + <emoji name="shark" unicode="&#x1f988;"/> <emoji name="shark" unicode="&#x1f988;"/> from "shark"<linebreak/> + <emoji name="shaved_ice" unicode="&#x1f367;"/> <emoji name="shaved_ice" unicode="&#x1f367;"/> from "shaved_ice"<linebreak/> + <emoji name="sheep" unicode="&#x1f411;"/> <emoji name="sheep" unicode="&#x1f411;"/> from "sheep"<linebreak/> + <emoji name="shell" unicode="&#x1f41a;"/> <emoji name="shell" unicode="&#x1f41a;"/> from "shell"<linebreak/> + <emoji name="shield" unicode="&#x1f6e1;"/> <emoji name="shield" unicode="&#x1f6e1;"/> from "shield"<linebreak/> + <emoji name="shinto_shrine" unicode="&#x26e9;"/> <emoji name="shinto_shrine" unicode="&#x26e9;"/> from "shinto_shrine"<linebreak/> + <emoji name="ship" unicode="&#x1f6a2;"/> <emoji name="ship" unicode="&#x1f6a2;"/> from "ship"<linebreak/> + <emoji name="shirt" unicode="&#x1f455;"/> <emoji name="shirt" unicode="&#x1f455;"/> from "shirt"<linebreak/> + <emoji name="shit" unicode="&#x1f4a9;"/> <emoji name="shit" unicode="&#x1f4a9;"/> from "shit"<linebreak/> + <emoji name="shoe" unicode="&#x1f45e;"/> <emoji name="shoe" unicode="&#x1f45e;"/> from "shoe"<linebreak/> + <emoji name="shopping" unicode="&#x1f6cd;"/> <emoji name="shopping" unicode="&#x1f6cd;"/> from "shopping"<linebreak/> + <emoji name="shopping_cart" unicode="&#x1f6d2;"/> <emoji name="shopping_cart" unicode="&#x1f6d2;"/> from "shopping_cart"<linebreak/> + <emoji name="shower" unicode="&#x1f6bf;"/> <emoji name="shower" unicode="&#x1f6bf;"/> from "shower"<linebreak/> + <emoji name="shrimp" unicode="&#x1f990;"/> <emoji name="shrimp" unicode="&#x1f990;"/> from "shrimp"<linebreak/> + <emoji name="sierra_leone" unicode="&#x1f1f8;&#x1f1f1;"/> <emoji name="sierra_leone" unicode="&#x1f1f8;&#x1f1f1;"/> from "sierra_leone"<linebreak/> + <emoji name="signal_strength" unicode="&#x1f4f6;"/> <emoji name="signal_strength" unicode="&#x1f4f6;"/> from "signal_strength"<linebreak/> + <emoji name="singapore" unicode="&#x1f1f8;&#x1f1ec;"/> <emoji name="singapore" unicode="&#x1f1f8;&#x1f1ec;"/> from "singapore"<linebreak/> + <emoji name="sint_maarten" unicode="&#x1f1f8;&#x1f1fd;"/> <emoji name="sint_maarten" unicode="&#x1f1f8;&#x1f1fd;"/> from "sint_maarten"<linebreak/> + <emoji name="six" unicode="&#x0036;&#x20e3;"/> <emoji name="six" unicode="&#x0036;&#x20e3;"/> from "six"<linebreak/> + <emoji name="six_pointed_star" unicode="&#x1f52f;"/> <emoji name="six_pointed_star" unicode="&#x1f52f;"/> from "six_pointed_star"<linebreak/> + <emoji name="ski" unicode="&#x1f3bf;"/> <emoji name="ski" unicode="&#x1f3bf;"/> from "ski"<linebreak/> + <emoji name="skier" unicode="&#x26f7;"/> <emoji name="skier" unicode="&#x26f7;"/> from "skier"<linebreak/> + <emoji name="skull" unicode="&#x1f480;"/> <emoji name="skull" unicode="&#x1f480;"/> from "skull"<linebreak/> + <emoji name="skull_and_crossbones" unicode="&#x2620;"/> <emoji name="skull_and_crossbones" unicode="&#x2620;"/> from "skull_and_crossbones"<linebreak/> + <emoji name="sleeping" unicode="&#x1f634;"/> <emoji name="sleeping" unicode="&#x1f634;"/> from "sleeping"<linebreak/> + <emoji name="sleeping_bed" unicode="&#x1f6cc;"/> <emoji name="sleeping_bed" unicode="&#x1f6cc;"/> from "sleeping_bed"<linebreak/> + <emoji name="sleepy" unicode="&#x1f62a;"/> <emoji name="sleepy" unicode="&#x1f62a;"/> from "sleepy"<linebreak/> + <emoji name="slightly_frowning_face" unicode="&#x1f641;"/> <emoji name="slightly_frowning_face" unicode="&#x1f641;"/> from "slightly_frowning_face"<linebreak/> + <emoji name="slightly_smiling_face" unicode="&#x1f642;"/> <emoji name="slightly_smiling_face" unicode="&#x1f642;"/> from "slightly_smiling_face"<linebreak/> + <emoji name="slot_machine" unicode="&#x1f3b0;"/> <emoji name="slot_machine" unicode="&#x1f3b0;"/> from "slot_machine"<linebreak/> + <emoji name="slovakia" unicode="&#x1f1f8;&#x1f1f0;"/> <emoji name="slovakia" unicode="&#x1f1f8;&#x1f1f0;"/> from "slovakia"<linebreak/> + <emoji name="slovenia" unicode="&#x1f1f8;&#x1f1ee;"/> <emoji name="slovenia" unicode="&#x1f1f8;&#x1f1ee;"/> from "slovenia"<linebreak/> + <emoji name="small_airplane" unicode="&#x1f6e9;"/> <emoji name="small_airplane" unicode="&#x1f6e9;"/> from "small_airplane"<linebreak/> + <emoji name="small_blue_diamond" unicode="&#x1f539;"/> <emoji name="small_blue_diamond" unicode="&#x1f539;"/> from "small_blue_diamond"<linebreak/> + <emoji name="small_orange_diamond" unicode="&#x1f538;"/> <emoji name="small_orange_diamond" unicode="&#x1f538;"/> from "small_orange_diamond"<linebreak/> + <emoji name="small_red_triangle" unicode="&#x1f53a;"/> <emoji name="small_red_triangle" unicode="&#x1f53a;"/> from "small_red_triangle"<linebreak/> + <emoji name="small_red_triangle_down" unicode="&#x1f53b;"/> <emoji name="small_red_triangle_down" unicode="&#x1f53b;"/> from "small_red_triangle_down"<linebreak/> + <emoji name="smile" unicode="&#x1f604;"/> <emoji name="smile" unicode="&#x1f604;"/> from "smile"<linebreak/> + <emoji name="smile_cat" unicode="&#x1f638;"/> <emoji name="smile_cat" unicode="&#x1f638;"/> from "smile_cat"<linebreak/> + <emoji name="smiley" unicode="&#x1f603;"/> <emoji name="smiley" unicode="&#x1f603;"/> from "smiley"<linebreak/> + <emoji name="smiley_cat" unicode="&#x1f63a;"/> <emoji name="smiley_cat" unicode="&#x1f63a;"/> from "smiley_cat"<linebreak/> + <emoji name="smiling_imp" unicode="&#x1f608;"/> <emoji name="smiling_imp" unicode="&#x1f608;"/> from "smiling_imp"<linebreak/> + <emoji name="smirk" unicode="&#x1f60f;"/> <emoji name="smirk" unicode="&#x1f60f;"/> from "smirk"<linebreak/> + <emoji name="smirk_cat" unicode="&#x1f63c;"/> <emoji name="smirk_cat" unicode="&#x1f63c;"/> from "smirk_cat"<linebreak/> + <emoji name="smoking" unicode="&#x1f6ac;"/> <emoji name="smoking" unicode="&#x1f6ac;"/> from "smoking"<linebreak/> + <emoji name="snail" unicode="&#x1f40c;"/> <emoji name="snail" unicode="&#x1f40c;"/> from "snail"<linebreak/> + <emoji name="snake" unicode="&#x1f40d;"/> <emoji name="snake" unicode="&#x1f40d;"/> from "snake"<linebreak/> + <emoji name="sneezing_face" unicode="&#x1f927;"/> <emoji name="sneezing_face" unicode="&#x1f927;"/> from "sneezing_face"<linebreak/> + <emoji name="snowboarder" unicode="&#x1f3c2;"/> <emoji name="snowboarder" unicode="&#x1f3c2;"/> from "snowboarder"<linebreak/> + <emoji name="snowflake" unicode="&#x2744;"/> <emoji name="snowflake" unicode="&#x2744;"/> from "snowflake"<linebreak/> + <emoji name="snowman" unicode="&#x26c4;"/> <emoji name="snowman" unicode="&#x26c4;"/> from "snowman"<linebreak/> + <emoji name="snowman_with_snow" unicode="&#x2603;"/> <emoji name="snowman_with_snow" unicode="&#x2603;"/> from "snowman_with_snow"<linebreak/> + <emoji name="sob" unicode="&#x1f62d;"/> <emoji name="sob" unicode="&#x1f62d;"/> from "sob"<linebreak/> + <emoji name="soccer" unicode="&#x26bd;"/> <emoji name="soccer" unicode="&#x26bd;"/> from "soccer"<linebreak/> + <emoji name="solomon_islands" unicode="&#x1f1f8;&#x1f1e7;"/> <emoji name="solomon_islands" unicode="&#x1f1f8;&#x1f1e7;"/> from "solomon_islands"<linebreak/> + <emoji name="somalia" unicode="&#x1f1f8;&#x1f1f4;"/> <emoji name="somalia" unicode="&#x1f1f8;&#x1f1f4;"/> from "somalia"<linebreak/> + <emoji name="soon" unicode="&#x1f51c;"/> <emoji name="soon" unicode="&#x1f51c;"/> from "soon"<linebreak/> + <emoji name="sos" unicode="&#x1f198;"/> <emoji name="sos" unicode="&#x1f198;"/> from "sos"<linebreak/> + <emoji name="sound" unicode="&#x1f509;"/> <emoji name="sound" unicode="&#x1f509;"/> from "sound"<linebreak/> + <emoji name="south_africa" unicode="&#x1f1ff;&#x1f1e6;"/> <emoji name="south_africa" unicode="&#x1f1ff;&#x1f1e6;"/> from "south_africa"<linebreak/> + <emoji name="south_georgia_south_sandwich_islands" unicode="&#x1f1ec;&#x1f1f8;"/> <emoji name="south_georgia_south_sandwich_islands" unicode="&#x1f1ec;&#x1f1f8;"/> from "south_georgia_south_sandwich_islands"<linebreak/> + <emoji name="south_sudan" unicode="&#x1f1f8;&#x1f1f8;"/> <emoji name="south_sudan" unicode="&#x1f1f8;&#x1f1f8;"/> from "south_sudan"<linebreak/> + <emoji name="space_invader" unicode="&#x1f47e;"/> <emoji name="space_invader" unicode="&#x1f47e;"/> from "space_invader"<linebreak/> + <emoji name="spades" unicode="&#x2660;"/> <emoji name="spades" unicode="&#x2660;"/> from "spades"<linebreak/> + <emoji name="spaghetti" unicode="&#x1f35d;"/> <emoji name="spaghetti" unicode="&#x1f35d;"/> from "spaghetti"<linebreak/> + <emoji name="sparkle" unicode="&#x2747;"/> <emoji name="sparkle" unicode="&#x2747;"/> from "sparkle"<linebreak/> + <emoji name="sparkler" unicode="&#x1f387;"/> <emoji name="sparkler" unicode="&#x1f387;"/> from "sparkler"<linebreak/> + <emoji name="sparkles" unicode="&#x2728;"/> <emoji name="sparkles" unicode="&#x2728;"/> from "sparkles"<linebreak/> + <emoji name="sparkling_heart" unicode="&#x1f496;"/> <emoji name="sparkling_heart" unicode="&#x1f496;"/> from "sparkling_heart"<linebreak/> + <emoji name="speak_no_evil" unicode="&#x1f64a;"/> <emoji name="speak_no_evil" unicode="&#x1f64a;"/> from "speak_no_evil"<linebreak/> + <emoji name="speaker" unicode="&#x1f508;"/> <emoji name="speaker" unicode="&#x1f508;"/> from "speaker"<linebreak/> + <emoji name="speaking_head" unicode="&#x1f5e3;"/> <emoji name="speaking_head" unicode="&#x1f5e3;"/> from "speaking_head"<linebreak/> + <emoji name="speech_balloon" unicode="&#x1f4ac;"/> <emoji name="speech_balloon" unicode="&#x1f4ac;"/> from "speech_balloon"<linebreak/> + <emoji name="speedboat" unicode="&#x1f6a4;"/> <emoji name="speedboat" unicode="&#x1f6a4;"/> from "speedboat"<linebreak/> + <emoji name="spider" unicode="&#x1f577;"/> <emoji name="spider" unicode="&#x1f577;"/> from "spider"<linebreak/> + <emoji name="spider_web" unicode="&#x1f578;"/> <emoji name="spider_web" unicode="&#x1f578;"/> from "spider_web"<linebreak/> + <emoji name="spiral_calendar" unicode="&#x1f5d3;"/> <emoji name="spiral_calendar" unicode="&#x1f5d3;"/> from "spiral_calendar"<linebreak/> + <emoji name="spiral_notepad" unicode="&#x1f5d2;"/> <emoji name="spiral_notepad" unicode="&#x1f5d2;"/> from "spiral_notepad"<linebreak/> + <emoji name="spoon" unicode="&#x1f944;"/> <emoji name="spoon" unicode="&#x1f944;"/> from "spoon"<linebreak/> + <emoji name="squid" unicode="&#x1f991;"/> <emoji name="squid" unicode="&#x1f991;"/> from "squid"<linebreak/> + <emoji name="sri_lanka" unicode="&#x1f1f1;&#x1f1f0;"/> <emoji name="sri_lanka" unicode="&#x1f1f1;&#x1f1f0;"/> from "sri_lanka"<linebreak/> + <emoji name="st_barthelemy" unicode="&#x1f1e7;&#x1f1f1;"/> <emoji name="st_barthelemy" unicode="&#x1f1e7;&#x1f1f1;"/> from "st_barthelemy"<linebreak/> + <emoji name="st_helena" unicode="&#x1f1f8;&#x1f1ed;"/> <emoji name="st_helena" unicode="&#x1f1f8;&#x1f1ed;"/> from "st_helena"<linebreak/> + <emoji name="st_kitts_nevis" unicode="&#x1f1f0;&#x1f1f3;"/> <emoji name="st_kitts_nevis" unicode="&#x1f1f0;&#x1f1f3;"/> from "st_kitts_nevis"<linebreak/> + <emoji name="st_lucia" unicode="&#x1f1f1;&#x1f1e8;"/> <emoji name="st_lucia" unicode="&#x1f1f1;&#x1f1e8;"/> from "st_lucia"<linebreak/> + <emoji name="st_pierre_miquelon" unicode="&#x1f1f5;&#x1f1f2;"/> <emoji name="st_pierre_miquelon" unicode="&#x1f1f5;&#x1f1f2;"/> from "st_pierre_miquelon"<linebreak/> + <emoji name="st_vincent_grenadines" unicode="&#x1f1fb;&#x1f1e8;"/> <emoji name="st_vincent_grenadines" unicode="&#x1f1fb;&#x1f1e8;"/> from "st_vincent_grenadines"<linebreak/> + <emoji name="stadium" unicode="&#x1f3df;"/> <emoji name="stadium" unicode="&#x1f3df;"/> from "stadium"<linebreak/> + <emoji name="star" unicode="&#x2b50;"/> <emoji name="star" unicode="&#x2b50;"/> from "star"<linebreak/> + <emoji name="star2" unicode="&#x1f31f;"/> <emoji name="star2" unicode="&#x1f31f;"/> from "star2"<linebreak/> + <emoji name="star_and_crescent" unicode="&#x262a;"/> <emoji name="star_and_crescent" unicode="&#x262a;"/> from "star_and_crescent"<linebreak/> + <emoji name="star_of_david" unicode="&#x2721;"/> <emoji name="star_of_david" unicode="&#x2721;"/> from "star_of_david"<linebreak/> + <emoji name="stars" unicode="&#x1f320;"/> <emoji name="stars" unicode="&#x1f320;"/> from "stars"<linebreak/> + <emoji name="station" unicode="&#x1f689;"/> <emoji name="station" unicode="&#x1f689;"/> from "station"<linebreak/> + <emoji name="statue_of_liberty" unicode="&#x1f5fd;"/> <emoji name="statue_of_liberty" unicode="&#x1f5fd;"/> from "statue_of_liberty"<linebreak/> + <emoji name="steam_locomotive" unicode="&#x1f682;"/> <emoji name="steam_locomotive" unicode="&#x1f682;"/> from "steam_locomotive"<linebreak/> + <emoji name="stew" unicode="&#x1f372;"/> <emoji name="stew" unicode="&#x1f372;"/> from "stew"<linebreak/> + <emoji name="stop_button" unicode="&#x23f9;"/> <emoji name="stop_button" unicode="&#x23f9;"/> from "stop_button"<linebreak/> + <emoji name="stop_sign" unicode="&#x1f6d1;"/> <emoji name="stop_sign" unicode="&#x1f6d1;"/> from "stop_sign"<linebreak/> + <emoji name="stopwatch" unicode="&#x23f1;"/> <emoji name="stopwatch" unicode="&#x23f1;"/> from "stopwatch"<linebreak/> + <emoji name="straight_ruler" unicode="&#x1f4cf;"/> <emoji name="straight_ruler" unicode="&#x1f4cf;"/> from "straight_ruler"<linebreak/> + <emoji name="strawberry" unicode="&#x1f353;"/> <emoji name="strawberry" unicode="&#x1f353;"/> from "strawberry"<linebreak/> + <emoji name="stuck_out_tongue" unicode="&#x1f61b;"/> <emoji name="stuck_out_tongue" unicode="&#x1f61b;"/> from "stuck_out_tongue"<linebreak/> + <emoji name="stuck_out_tongue_closed_eyes" unicode="&#x1f61d;"/> <emoji name="stuck_out_tongue_closed_eyes" unicode="&#x1f61d;"/> from "stuck_out_tongue_closed_eyes"<linebreak/> + <emoji name="stuck_out_tongue_winking_eye" unicode="&#x1f61c;"/> <emoji name="stuck_out_tongue_winking_eye" unicode="&#x1f61c;"/> from "stuck_out_tongue_winking_eye"<linebreak/> + <emoji name="studio_microphone" unicode="&#x1f399;"/> <emoji name="studio_microphone" unicode="&#x1f399;"/> from "studio_microphone"<linebreak/> + <emoji name="stuffed_flatbread" unicode="&#x1f959;"/> <emoji name="stuffed_flatbread" unicode="&#x1f959;"/> from "stuffed_flatbread"<linebreak/> + <emoji name="sudan" unicode="&#x1f1f8;&#x1f1e9;"/> <emoji name="sudan" unicode="&#x1f1f8;&#x1f1e9;"/> from "sudan"<linebreak/> + <emoji name="sun_behind_large_cloud" unicode="&#x1f325;"/> <emoji name="sun_behind_large_cloud" unicode="&#x1f325;"/> from "sun_behind_large_cloud"<linebreak/> + <emoji name="sun_behind_rain_cloud" unicode="&#x1f326;"/> <emoji name="sun_behind_rain_cloud" unicode="&#x1f326;"/> from "sun_behind_rain_cloud"<linebreak/> + <emoji name="sun_behind_small_cloud" unicode="&#x1f324;"/> <emoji name="sun_behind_small_cloud" unicode="&#x1f324;"/> from "sun_behind_small_cloud"<linebreak/> + <emoji name="sun_with_face" unicode="&#x1f31e;"/> <emoji name="sun_with_face" unicode="&#x1f31e;"/> from "sun_with_face"<linebreak/> + <emoji name="sunflower" unicode="&#x1f33b;"/> <emoji name="sunflower" unicode="&#x1f33b;"/> from "sunflower"<linebreak/> + <emoji name="sunglasses" unicode="&#x1f60e;"/> <emoji name="sunglasses" unicode="&#x1f60e;"/> from "sunglasses"<linebreak/> + <emoji name="sunny" unicode="&#x2600;"/> <emoji name="sunny" unicode="&#x2600;"/> from "sunny"<linebreak/> + <emoji name="sunrise" unicode="&#x1f305;"/> <emoji name="sunrise" unicode="&#x1f305;"/> from "sunrise"<linebreak/> + <emoji name="sunrise_over_mountains" unicode="&#x1f304;"/> <emoji name="sunrise_over_mountains" unicode="&#x1f304;"/> from "sunrise_over_mountains"<linebreak/> + <emoji name="surfer" unicode="&#x1f3c4;"/> <emoji name="surfer" unicode="&#x1f3c4;"/> from "surfer"<linebreak/> + <emoji name="surfing_man" unicode="&#x1f3c4;"/> <emoji name="surfing_man" unicode="&#x1f3c4;"/> from "surfing_man"<linebreak/> + <emoji name="surfing_woman" unicode="&#x1f3c4;&#x2640;"/> <emoji name="surfing_woman" unicode="&#x1f3c4;&#x2640;"/> from "surfing_woman"<linebreak/> + <emoji name="suriname" unicode="&#x1f1f8;&#x1f1f7;"/> <emoji name="suriname" unicode="&#x1f1f8;&#x1f1f7;"/> from "suriname"<linebreak/> + <emoji name="sushi" unicode="&#x1f363;"/> <emoji name="sushi" unicode="&#x1f363;"/> from "sushi"<linebreak/> + <emoji name="suspension_railway" unicode="&#x1f69f;"/> <emoji name="suspension_railway" unicode="&#x1f69f;"/> from "suspension_railway"<linebreak/> + <emoji name="swaziland" unicode="&#x1f1f8;&#x1f1ff;"/> <emoji name="swaziland" unicode="&#x1f1f8;&#x1f1ff;"/> from "swaziland"<linebreak/> + <emoji name="sweat" unicode="&#x1f613;"/> <emoji name="sweat" unicode="&#x1f613;"/> from "sweat"<linebreak/> + <emoji name="sweat_drops" unicode="&#x1f4a6;"/> <emoji name="sweat_drops" unicode="&#x1f4a6;"/> from "sweat_drops"<linebreak/> + <emoji name="sweat_smile" unicode="&#x1f605;"/> <emoji name="sweat_smile" unicode="&#x1f605;"/> from "sweat_smile"<linebreak/> + <emoji name="sweden" unicode="&#x1f1f8;&#x1f1ea;"/> <emoji name="sweden" unicode="&#x1f1f8;&#x1f1ea;"/> from "sweden"<linebreak/> + <emoji name="sweet_potato" unicode="&#x1f360;"/> <emoji name="sweet_potato" unicode="&#x1f360;"/> from "sweet_potato"<linebreak/> + <emoji name="swimmer" unicode="&#x1f3ca;"/> <emoji name="swimmer" unicode="&#x1f3ca;"/> from "swimmer"<linebreak/> + <emoji name="swimming_man" unicode="&#x1f3ca;"/> <emoji name="swimming_man" unicode="&#x1f3ca;"/> from "swimming_man"<linebreak/> + <emoji name="swimming_woman" unicode="&#x1f3ca;&#x2640;"/> <emoji name="swimming_woman" unicode="&#x1f3ca;&#x2640;"/> from "swimming_woman"<linebreak/> + <emoji name="switzerland" unicode="&#x1f1e8;&#x1f1ed;"/> <emoji name="switzerland" unicode="&#x1f1e8;&#x1f1ed;"/> from "switzerland"<linebreak/> + <emoji name="symbols" unicode="&#x1f523;"/> <emoji name="symbols" unicode="&#x1f523;"/> from "symbols"<linebreak/> + <emoji name="synagogue" unicode="&#x1f54d;"/> <emoji name="synagogue" unicode="&#x1f54d;"/> from "synagogue"<linebreak/> + <emoji name="syria" unicode="&#x1f1f8;&#x1f1fe;"/> <emoji name="syria" unicode="&#x1f1f8;&#x1f1fe;"/> from "syria"<linebreak/> + <emoji name="syringe" unicode="&#x1f489;"/> <emoji name="syringe" unicode="&#x1f489;"/> from "syringe"<linebreak/> + <emoji name="taco" unicode="&#x1f32e;"/> <emoji name="taco" unicode="&#x1f32e;"/> from "taco"<linebreak/> + <emoji name="tada" unicode="&#x1f389;"/> <emoji name="tada" unicode="&#x1f389;"/> from "tada"<linebreak/> + <emoji name="taiwan" unicode="&#x1f1f9;&#x1f1fc;"/> <emoji name="taiwan" unicode="&#x1f1f9;&#x1f1fc;"/> from "taiwan"<linebreak/> + <emoji name="tajikistan" unicode="&#x1f1f9;&#x1f1ef;"/> <emoji name="tajikistan" unicode="&#x1f1f9;&#x1f1ef;"/> from "tajikistan"<linebreak/> + <emoji name="tanabata_tree" unicode="&#x1f38b;"/> <emoji name="tanabata_tree" unicode="&#x1f38b;"/> from "tanabata_tree"<linebreak/> + <emoji name="tangerine" unicode="&#x1f34a;"/> <emoji name="tangerine" unicode="&#x1f34a;"/> from "tangerine"<linebreak/> + <emoji name="tanzania" unicode="&#x1f1f9;&#x1f1ff;"/> <emoji name="tanzania" unicode="&#x1f1f9;&#x1f1ff;"/> from "tanzania"<linebreak/> + <emoji name="taurus" unicode="&#x2649;"/> <emoji name="taurus" unicode="&#x2649;"/> from "taurus"<linebreak/> + <emoji name="taxi" unicode="&#x1f695;"/> <emoji name="taxi" unicode="&#x1f695;"/> from "taxi"<linebreak/> + <emoji name="tea" unicode="&#x1f375;"/> <emoji name="tea" unicode="&#x1f375;"/> from "tea"<linebreak/> + <emoji name="telephone" unicode="&#x260e;"/> <emoji name="telephone" unicode="&#x260e;"/> from "telephone"<linebreak/> + <emoji name="telephone_receiver" unicode="&#x1f4de;"/> <emoji name="telephone_receiver" unicode="&#x1f4de;"/> from "telephone_receiver"<linebreak/> + <emoji name="telescope" unicode="&#x1f52d;"/> <emoji name="telescope" unicode="&#x1f52d;"/> from "telescope"<linebreak/> + <emoji name="tennis" unicode="&#x1f3be;"/> <emoji name="tennis" unicode="&#x1f3be;"/> from "tennis"<linebreak/> + <emoji name="tent" unicode="&#x26fa;"/> <emoji name="tent" unicode="&#x26fa;"/> from "tent"<linebreak/> + <emoji name="thailand" unicode="&#x1f1f9;&#x1f1ed;"/> <emoji name="thailand" unicode="&#x1f1f9;&#x1f1ed;"/> from "thailand"<linebreak/> + <emoji name="thermometer" unicode="&#x1f321;"/> <emoji name="thermometer" unicode="&#x1f321;"/> from "thermometer"<linebreak/> + <emoji name="thinking" unicode="&#x1f914;"/> <emoji name="thinking" unicode="&#x1f914;"/> from "thinking"<linebreak/> + <emoji name="thought_balloon" unicode="&#x1f4ad;"/> <emoji name="thought_balloon" unicode="&#x1f4ad;"/> from "thought_balloon"<linebreak/> + <emoji name="three" unicode="&#x0033;&#x20e3;"/> <emoji name="three" unicode="&#x0033;&#x20e3;"/> from "three"<linebreak/> + <emoji name="thumbsdown" unicode="&#x1f44e;"/> <emoji name="thumbsdown" unicode="&#x1f44e;"/> from "thumbsdown"<linebreak/> + <emoji name="thumbsup" unicode="&#x1f44d;"/> <emoji name="thumbsup" unicode="&#x1f44d;"/> from "thumbsup"<linebreak/> + <emoji name="ticket" unicode="&#x1f3ab;"/> <emoji name="ticket" unicode="&#x1f3ab;"/> from "ticket"<linebreak/> + <emoji name="tickets" unicode="&#x1f39f;"/> <emoji name="tickets" unicode="&#x1f39f;"/> from "tickets"<linebreak/> + <emoji name="tiger" unicode="&#x1f42f;"/> <emoji name="tiger" unicode="&#x1f42f;"/> from "tiger"<linebreak/> + <emoji name="tiger2" unicode="&#x1f405;"/> <emoji name="tiger2" unicode="&#x1f405;"/> from "tiger2"<linebreak/> + <emoji name="timer_clock" unicode="&#x23f2;"/> <emoji name="timer_clock" unicode="&#x23f2;"/> from "timer_clock"<linebreak/> + <emoji name="timor_leste" unicode="&#x1f1f9;&#x1f1f1;"/> <emoji name="timor_leste" unicode="&#x1f1f9;&#x1f1f1;"/> from "timor_leste"<linebreak/> + <emoji name="tipping_hand_man" unicode="&#x1f481;&#x2642;"/> <emoji name="tipping_hand_man" unicode="&#x1f481;&#x2642;"/> from "tipping_hand_man"<linebreak/> + <emoji name="tipping_hand_woman" unicode="&#x1f481;"/> <emoji name="tipping_hand_woman" unicode="&#x1f481;"/> from "tipping_hand_woman"<linebreak/> + <emoji name="tired_face" unicode="&#x1f62b;"/> <emoji name="tired_face" unicode="&#x1f62b;"/> from "tired_face"<linebreak/> + <emoji name="tm" unicode="&#x2122;"/> <emoji name="tm" unicode="&#x2122;"/> from "tm"<linebreak/> + <emoji name="togo" unicode="&#x1f1f9;&#x1f1ec;"/> <emoji name="togo" unicode="&#x1f1f9;&#x1f1ec;"/> from "togo"<linebreak/> + <emoji name="toilet" unicode="&#x1f6bd;"/> <emoji name="toilet" unicode="&#x1f6bd;"/> from "toilet"<linebreak/> + <emoji name="tokelau" unicode="&#x1f1f9;&#x1f1f0;"/> <emoji name="tokelau" unicode="&#x1f1f9;&#x1f1f0;"/> from "tokelau"<linebreak/> + <emoji name="tokyo_tower" unicode="&#x1f5fc;"/> <emoji name="tokyo_tower" unicode="&#x1f5fc;"/> from "tokyo_tower"<linebreak/> + <emoji name="tomato" unicode="&#x1f345;"/> <emoji name="tomato" unicode="&#x1f345;"/> from "tomato"<linebreak/> + <emoji name="tonga" unicode="&#x1f1f9;&#x1f1f4;"/> <emoji name="tonga" unicode="&#x1f1f9;&#x1f1f4;"/> from "tonga"<linebreak/> + <emoji name="tongue" unicode="&#x1f445;"/> <emoji name="tongue" unicode="&#x1f445;"/> from "tongue"<linebreak/> + <emoji name="top" unicode="&#x1f51d;"/> <emoji name="top" unicode="&#x1f51d;"/> from "top"<linebreak/> + <emoji name="tophat" unicode="&#x1f3a9;"/> <emoji name="tophat" unicode="&#x1f3a9;"/> from "tophat"<linebreak/> + <emoji name="tornado" unicode="&#x1f32a;"/> <emoji name="tornado" unicode="&#x1f32a;"/> from "tornado"<linebreak/> + <emoji name="tr" unicode="&#x1f1f9;&#x1f1f7;"/> <emoji name="tr" unicode="&#x1f1f9;&#x1f1f7;"/> from "tr"<linebreak/> + <emoji name="trackball" unicode="&#x1f5b2;"/> <emoji name="trackball" unicode="&#x1f5b2;"/> from "trackball"<linebreak/> + <emoji name="tractor" unicode="&#x1f69c;"/> <emoji name="tractor" unicode="&#x1f69c;"/> from "tractor"<linebreak/> + <emoji name="traffic_light" unicode="&#x1f6a5;"/> <emoji name="traffic_light" unicode="&#x1f6a5;"/> from "traffic_light"<linebreak/> + <emoji name="train" unicode="&#x1f68b;"/> <emoji name="train" unicode="&#x1f68b;"/> from "train"<linebreak/> + <emoji name="train2" unicode="&#x1f686;"/> <emoji name="train2" unicode="&#x1f686;"/> from "train2"<linebreak/> + <emoji name="tram" unicode="&#x1f68a;"/> <emoji name="tram" unicode="&#x1f68a;"/> from "tram"<linebreak/> + <emoji name="triangular_flag_on_post" unicode="&#x1f6a9;"/> <emoji name="triangular_flag_on_post" unicode="&#x1f6a9;"/> from "triangular_flag_on_post"<linebreak/> + <emoji name="triangular_ruler" unicode="&#x1f4d0;"/> <emoji name="triangular_ruler" unicode="&#x1f4d0;"/> from "triangular_ruler"<linebreak/> + <emoji name="trident" unicode="&#x1f531;"/> <emoji name="trident" unicode="&#x1f531;"/> from "trident"<linebreak/> + <emoji name="trinidad_tobago" unicode="&#x1f1f9;&#x1f1f9;"/> <emoji name="trinidad_tobago" unicode="&#x1f1f9;&#x1f1f9;"/> from "trinidad_tobago"<linebreak/> + <emoji name="triumph" unicode="&#x1f624;"/> <emoji name="triumph" unicode="&#x1f624;"/> from "triumph"<linebreak/> + <emoji name="trolleybus" unicode="&#x1f68e;"/> <emoji name="trolleybus" unicode="&#x1f68e;"/> from "trolleybus"<linebreak/> + <emoji name="trophy" unicode="&#x1f3c6;"/> <emoji name="trophy" unicode="&#x1f3c6;"/> from "trophy"<linebreak/> + <emoji name="tropical_drink" unicode="&#x1f379;"/> <emoji name="tropical_drink" unicode="&#x1f379;"/> from "tropical_drink"<linebreak/> + <emoji name="tropical_fish" unicode="&#x1f420;"/> <emoji name="tropical_fish" unicode="&#x1f420;"/> from "tropical_fish"<linebreak/> + <emoji name="truck" unicode="&#x1f69a;"/> <emoji name="truck" unicode="&#x1f69a;"/> from "truck"<linebreak/> + <emoji name="trumpet" unicode="&#x1f3ba;"/> <emoji name="trumpet" unicode="&#x1f3ba;"/> from "trumpet"<linebreak/> + <emoji name="tshirt" unicode="&#x1f455;"/> <emoji name="tshirt" unicode="&#x1f455;"/> from "tshirt"<linebreak/> + <emoji name="tulip" unicode="&#x1f337;"/> <emoji name="tulip" unicode="&#x1f337;"/> from "tulip"<linebreak/> + <emoji name="tumbler_glass" unicode="&#x1f943;"/> <emoji name="tumbler_glass" unicode="&#x1f943;"/> from "tumbler_glass"<linebreak/> + <emoji name="tunisia" unicode="&#x1f1f9;&#x1f1f3;"/> <emoji name="tunisia" unicode="&#x1f1f9;&#x1f1f3;"/> from "tunisia"<linebreak/> + <emoji name="turkey" unicode="&#x1f983;"/> <emoji name="turkey" unicode="&#x1f983;"/> from "turkey"<linebreak/> + <emoji name="turkmenistan" unicode="&#x1f1f9;&#x1f1f2;"/> <emoji name="turkmenistan" unicode="&#x1f1f9;&#x1f1f2;"/> from "turkmenistan"<linebreak/> + <emoji name="turks_caicos_islands" unicode="&#x1f1f9;&#x1f1e8;"/> <emoji name="turks_caicos_islands" unicode="&#x1f1f9;&#x1f1e8;"/> from "turks_caicos_islands"<linebreak/> + <emoji name="turtle" unicode="&#x1f422;"/> <emoji name="turtle" unicode="&#x1f422;"/> from "turtle"<linebreak/> + <emoji name="tuvalu" unicode="&#x1f1f9;&#x1f1fb;"/> <emoji name="tuvalu" unicode="&#x1f1f9;&#x1f1fb;"/> from "tuvalu"<linebreak/> + <emoji name="tv" unicode="&#x1f4fa;"/> <emoji name="tv" unicode="&#x1f4fa;"/> from "tv"<linebreak/> + <emoji name="twisted_rightwards_arrows" unicode="&#x1f500;"/> <emoji name="twisted_rightwards_arrows" unicode="&#x1f500;"/> from "twisted_rightwards_arrows"<linebreak/> + <emoji name="two" unicode="&#x0032;&#x20e3;"/> <emoji name="two" unicode="&#x0032;&#x20e3;"/> from "two"<linebreak/> + <emoji name="two_hearts" unicode="&#x1f495;"/> <emoji name="two_hearts" unicode="&#x1f495;"/> from "two_hearts"<linebreak/> + <emoji name="two_men_holding_hands" unicode="&#x1f46c;"/> <emoji name="two_men_holding_hands" unicode="&#x1f46c;"/> from "two_men_holding_hands"<linebreak/> + <emoji name="two_women_holding_hands" unicode="&#x1f46d;"/> <emoji name="two_women_holding_hands" unicode="&#x1f46d;"/> from "two_women_holding_hands"<linebreak/> + <emoji name="u5272" unicode="&#x1f239;"/> <emoji name="u5272" unicode="&#x1f239;"/> from "u5272"<linebreak/> + <emoji name="u5408" unicode="&#x1f234;"/> <emoji name="u5408" unicode="&#x1f234;"/> from "u5408"<linebreak/> + <emoji name="u55b6" unicode="&#x1f23a;"/> <emoji name="u55b6" unicode="&#x1f23a;"/> from "u55b6"<linebreak/> + <emoji name="u6307" unicode="&#x1f22f;"/> <emoji name="u6307" unicode="&#x1f22f;"/> from "u6307"<linebreak/> + <emoji name="u6708" unicode="&#x1f237;"/> <emoji name="u6708" unicode="&#x1f237;"/> from "u6708"<linebreak/> + <emoji name="u6709" unicode="&#x1f236;"/> <emoji name="u6709" unicode="&#x1f236;"/> from "u6709"<linebreak/> + <emoji name="u6e80" unicode="&#x1f235;"/> <emoji name="u6e80" unicode="&#x1f235;"/> from "u6e80"<linebreak/> + <emoji name="u7121" unicode="&#x1f21a;"/> <emoji name="u7121" unicode="&#x1f21a;"/> from "u7121"<linebreak/> + <emoji name="u7533" unicode="&#x1f238;"/> <emoji name="u7533" unicode="&#x1f238;"/> from "u7533"<linebreak/> + <emoji name="u7981" unicode="&#x1f232;"/> <emoji name="u7981" unicode="&#x1f232;"/> from "u7981"<linebreak/> + <emoji name="u7a7a" unicode="&#x1f233;"/> <emoji name="u7a7a" unicode="&#x1f233;"/> from "u7a7a"<linebreak/> + <emoji name="uganda" unicode="&#x1f1fa;&#x1f1ec;"/> <emoji name="uganda" unicode="&#x1f1fa;&#x1f1ec;"/> from "uganda"<linebreak/> + <emoji name="uk" unicode="&#x1f1ec;&#x1f1e7;"/> <emoji name="uk" unicode="&#x1f1ec;&#x1f1e7;"/> from "uk"<linebreak/> + <emoji name="ukraine" unicode="&#x1f1fa;&#x1f1e6;"/> <emoji name="ukraine" unicode="&#x1f1fa;&#x1f1e6;"/> from "ukraine"<linebreak/> + <emoji name="umbrella" unicode="&#x2614;"/> <emoji name="umbrella" unicode="&#x2614;"/> from "umbrella"<linebreak/> + <emoji name="unamused" unicode="&#x1f612;"/> <emoji name="unamused" unicode="&#x1f612;"/> from "unamused"<linebreak/> + <emoji name="underage" unicode="&#x1f51e;"/> <emoji name="underage" unicode="&#x1f51e;"/> from "underage"<linebreak/> + <emoji name="unicorn" unicode="&#x1f984;"/> <emoji name="unicorn" unicode="&#x1f984;"/> from "unicorn"<linebreak/> + <emoji name="united_arab_emirates" unicode="&#x1f1e6;&#x1f1ea;"/> <emoji name="united_arab_emirates" unicode="&#x1f1e6;&#x1f1ea;"/> from "united_arab_emirates"<linebreak/> + <emoji name="unlock" unicode="&#x1f513;"/> <emoji name="unlock" unicode="&#x1f513;"/> from "unlock"<linebreak/> + <emoji name="up" unicode="&#x1f199;"/> <emoji name="up" unicode="&#x1f199;"/> from "up"<linebreak/> + <emoji name="upside_down_face" unicode="&#x1f643;"/> <emoji name="upside_down_face" unicode="&#x1f643;"/> from "upside_down_face"<linebreak/> + <emoji name="uruguay" unicode="&#x1f1fa;&#x1f1fe;"/> <emoji name="uruguay" unicode="&#x1f1fa;&#x1f1fe;"/> from "uruguay"<linebreak/> + <emoji name="us" unicode="&#x1f1fa;&#x1f1f8;"/> <emoji name="us" unicode="&#x1f1fa;&#x1f1f8;"/> from "us"<linebreak/> + <emoji name="us_virgin_islands" unicode="&#x1f1fb;&#x1f1ee;"/> <emoji name="us_virgin_islands" unicode="&#x1f1fb;&#x1f1ee;"/> from "us_virgin_islands"<linebreak/> + <emoji name="uzbekistan" unicode="&#x1f1fa;&#x1f1ff;"/> <emoji name="uzbekistan" unicode="&#x1f1fa;&#x1f1ff;"/> from "uzbekistan"<linebreak/> + <emoji name="v" unicode="&#x270c;"/> <emoji name="v" unicode="&#x270c;"/> from "v"<linebreak/> + <emoji name="vanuatu" unicode="&#x1f1fb;&#x1f1fa;"/> <emoji name="vanuatu" unicode="&#x1f1fb;&#x1f1fa;"/> from "vanuatu"<linebreak/> + <emoji name="vatican_city" unicode="&#x1f1fb;&#x1f1e6;"/> <emoji name="vatican_city" unicode="&#x1f1fb;&#x1f1e6;"/> from "vatican_city"<linebreak/> + <emoji name="venezuela" unicode="&#x1f1fb;&#x1f1ea;"/> <emoji name="venezuela" unicode="&#x1f1fb;&#x1f1ea;"/> from "venezuela"<linebreak/> + <emoji name="vertical_traffic_light" unicode="&#x1f6a6;"/> <emoji name="vertical_traffic_light" unicode="&#x1f6a6;"/> from "vertical_traffic_light"<linebreak/> + <emoji name="vhs" unicode="&#x1f4fc;"/> <emoji name="vhs" unicode="&#x1f4fc;"/> from "vhs"<linebreak/> + <emoji name="vibration_mode" unicode="&#x1f4f3;"/> <emoji name="vibration_mode" unicode="&#x1f4f3;"/> from "vibration_mode"<linebreak/> + <emoji name="video_camera" unicode="&#x1f4f9;"/> <emoji name="video_camera" unicode="&#x1f4f9;"/> from "video_camera"<linebreak/> + <emoji name="video_game" unicode="&#x1f3ae;"/> <emoji name="video_game" unicode="&#x1f3ae;"/> from "video_game"<linebreak/> + <emoji name="vietnam" unicode="&#x1f1fb;&#x1f1f3;"/> <emoji name="vietnam" unicode="&#x1f1fb;&#x1f1f3;"/> from "vietnam"<linebreak/> + <emoji name="violin" unicode="&#x1f3bb;"/> <emoji name="violin" unicode="&#x1f3bb;"/> from "violin"<linebreak/> + <emoji name="virgo" unicode="&#x264d;"/> <emoji name="virgo" unicode="&#x264d;"/> from "virgo"<linebreak/> + <emoji name="volcano" unicode="&#x1f30b;"/> <emoji name="volcano" unicode="&#x1f30b;"/> from "volcano"<linebreak/> + <emoji name="volleyball" unicode="&#x1f3d0;"/> <emoji name="volleyball" unicode="&#x1f3d0;"/> from "volleyball"<linebreak/> + <emoji name="vs" unicode="&#x1f19a;"/> <emoji name="vs" unicode="&#x1f19a;"/> from "vs"<linebreak/> + <emoji name="vulcan_salute" unicode="&#x1f596;"/> <emoji name="vulcan_salute" unicode="&#x1f596;"/> from "vulcan_salute"<linebreak/> + <emoji name="walking" unicode="&#x1f6b6;"/> <emoji name="walking" unicode="&#x1f6b6;"/> from "walking"<linebreak/> + <emoji name="walking_man" unicode="&#x1f6b6;"/> <emoji name="walking_man" unicode="&#x1f6b6;"/> from "walking_man"<linebreak/> + <emoji name="walking_woman" unicode="&#x1f6b6;&#x2640;"/> <emoji name="walking_woman" unicode="&#x1f6b6;&#x2640;"/> from "walking_woman"<linebreak/> + <emoji name="wallis_futuna" unicode="&#x1f1fc;&#x1f1eb;"/> <emoji name="wallis_futuna" unicode="&#x1f1fc;&#x1f1eb;"/> from "wallis_futuna"<linebreak/> + <emoji name="waning_crescent_moon" unicode="&#x1f318;"/> <emoji name="waning_crescent_moon" unicode="&#x1f318;"/> from "waning_crescent_moon"<linebreak/> + <emoji name="waning_gibbous_moon" unicode="&#x1f316;"/> <emoji name="waning_gibbous_moon" unicode="&#x1f316;"/> from "waning_gibbous_moon"<linebreak/> + <emoji name="warning" unicode="&#x26a0;"/> <emoji name="warning" unicode="&#x26a0;"/> from "warning"<linebreak/> + <emoji name="wastebasket" unicode="&#x1f5d1;"/> <emoji name="wastebasket" unicode="&#x1f5d1;"/> from "wastebasket"<linebreak/> + <emoji name="watch" unicode="&#x231a;"/> <emoji name="watch" unicode="&#x231a;"/> from "watch"<linebreak/> + <emoji name="water_buffalo" unicode="&#x1f403;"/> <emoji name="water_buffalo" unicode="&#x1f403;"/> from "water_buffalo"<linebreak/> + <emoji name="watermelon" unicode="&#x1f349;"/> <emoji name="watermelon" unicode="&#x1f349;"/> from "watermelon"<linebreak/> + <emoji name="wave" unicode="&#x1f44b;"/> <emoji name="wave" unicode="&#x1f44b;"/> from "wave"<linebreak/> + <emoji name="wavy_dash" unicode="&#x3030;"/> <emoji name="wavy_dash" unicode="&#x3030;"/> from "wavy_dash"<linebreak/> + <emoji name="waxing_crescent_moon" unicode="&#x1f312;"/> <emoji name="waxing_crescent_moon" unicode="&#x1f312;"/> from "waxing_crescent_moon"<linebreak/> + <emoji name="waxing_gibbous_moon" unicode="&#x1f314;"/> <emoji name="waxing_gibbous_moon" unicode="&#x1f314;"/> from "waxing_gibbous_moon"<linebreak/> + <emoji name="wc" unicode="&#x1f6be;"/> <emoji name="wc" unicode="&#x1f6be;"/> from "wc"<linebreak/> + <emoji name="weary" unicode="&#x1f629;"/> <emoji name="weary" unicode="&#x1f629;"/> from "weary"<linebreak/> + <emoji name="wedding" unicode="&#x1f492;"/> <emoji name="wedding" unicode="&#x1f492;"/> from "wedding"<linebreak/> + <emoji name="weight_lifting_man" unicode="&#x1f3cb;"/> <emoji name="weight_lifting_man" unicode="&#x1f3cb;"/> from "weight_lifting_man"<linebreak/> + <emoji name="weight_lifting_woman" unicode="&#x1f3cb;&#x2640;"/> <emoji name="weight_lifting_woman" unicode="&#x1f3cb;&#x2640;"/> from "weight_lifting_woman"<linebreak/> + <emoji name="western_sahara" unicode="&#x1f1ea;&#x1f1ed;"/> <emoji name="western_sahara" unicode="&#x1f1ea;&#x1f1ed;"/> from "western_sahara"<linebreak/> + <emoji name="whale" unicode="&#x1f433;"/> <emoji name="whale" unicode="&#x1f433;"/> from "whale"<linebreak/> + <emoji name="whale2" unicode="&#x1f40b;"/> <emoji name="whale2" unicode="&#x1f40b;"/> from "whale2"<linebreak/> + <emoji name="wheel_of_dharma" unicode="&#x2638;"/> <emoji name="wheel_of_dharma" unicode="&#x2638;"/> from "wheel_of_dharma"<linebreak/> + <emoji name="wheelchair" unicode="&#x267f;"/> <emoji name="wheelchair" unicode="&#x267f;"/> from "wheelchair"<linebreak/> + <emoji name="white_check_mark" unicode="&#x2705;"/> <emoji name="white_check_mark" unicode="&#x2705;"/> from "white_check_mark"<linebreak/> + <emoji name="white_circle" unicode="&#x26aa;"/> <emoji name="white_circle" unicode="&#x26aa;"/> from "white_circle"<linebreak/> + <emoji name="white_flag" unicode="&#x1f3f3;"/> <emoji name="white_flag" unicode="&#x1f3f3;"/> from "white_flag"<linebreak/> + <emoji name="white_flower" unicode="&#x1f4ae;"/> <emoji name="white_flower" unicode="&#x1f4ae;"/> from "white_flower"<linebreak/> + <emoji name="white_large_square" unicode="&#x2b1c;"/> <emoji name="white_large_square" unicode="&#x2b1c;"/> from "white_large_square"<linebreak/> + <emoji name="white_medium_small_square" unicode="&#x25fd;"/> <emoji name="white_medium_small_square" unicode="&#x25fd;"/> from "white_medium_small_square"<linebreak/> + <emoji name="white_medium_square" unicode="&#x25fb;"/> <emoji name="white_medium_square" unicode="&#x25fb;"/> from "white_medium_square"<linebreak/> + <emoji name="white_small_square" unicode="&#x25ab;"/> <emoji name="white_small_square" unicode="&#x25ab;"/> from "white_small_square"<linebreak/> + <emoji name="white_square_button" unicode="&#x1f533;"/> <emoji name="white_square_button" unicode="&#x1f533;"/> from "white_square_button"<linebreak/> + <emoji name="wilted_flower" unicode="&#x1f940;"/> <emoji name="wilted_flower" unicode="&#x1f940;"/> from "wilted_flower"<linebreak/> + <emoji name="wind_chime" unicode="&#x1f390;"/> <emoji name="wind_chime" unicode="&#x1f390;"/> from "wind_chime"<linebreak/> + <emoji name="wind_face" unicode="&#x1f32c;"/> <emoji name="wind_face" unicode="&#x1f32c;"/> from "wind_face"<linebreak/> + <emoji name="wine_glass" unicode="&#x1f377;"/> <emoji name="wine_glass" unicode="&#x1f377;"/> from "wine_glass"<linebreak/> + <emoji name="wink" unicode="&#x1f609;"/> <emoji name="wink" unicode="&#x1f609;"/> from "wink"<linebreak/> + <emoji name="wolf" unicode="&#x1f43a;"/> <emoji name="wolf" unicode="&#x1f43a;"/> from "wolf"<linebreak/> + <emoji name="woman" unicode="&#x1f469;"/> <emoji name="woman" unicode="&#x1f469;"/> from "woman"<linebreak/> + <emoji name="woman_artist" unicode="&#x1f469;&#x1f3a8;"/> <emoji name="woman_artist" unicode="&#x1f469;&#x1f3a8;"/> from "woman_artist"<linebreak/> + <emoji name="woman_astronaut" unicode="&#x1f469;&#x1f680;"/> <emoji name="woman_astronaut" unicode="&#x1f469;&#x1f680;"/> from "woman_astronaut"<linebreak/> + <emoji name="woman_cartwheeling" unicode="&#x1f938;&#x2640;"/> <emoji name="woman_cartwheeling" unicode="&#x1f938;&#x2640;"/> from "woman_cartwheeling"<linebreak/> + <emoji name="woman_cook" unicode="&#x1f469;&#x1f373;"/> <emoji name="woman_cook" unicode="&#x1f469;&#x1f373;"/> from "woman_cook"<linebreak/> + <emoji name="woman_facepalming" unicode="&#x1f926;&#x2640;"/> <emoji name="woman_facepalming" unicode="&#x1f926;&#x2640;"/> from "woman_facepalming"<linebreak/> + <emoji name="woman_factory_worker" unicode="&#x1f469;&#x1f3ed;"/> <emoji name="woman_factory_worker" unicode="&#x1f469;&#x1f3ed;"/> from "woman_factory_worker"<linebreak/> + <emoji name="woman_farmer" unicode="&#x1f469;&#x1f33e;"/> <emoji name="woman_farmer" unicode="&#x1f469;&#x1f33e;"/> from "woman_farmer"<linebreak/> + <emoji name="woman_firefighter" unicode="&#x1f469;&#x1f692;"/> <emoji name="woman_firefighter" unicode="&#x1f469;&#x1f692;"/> from "woman_firefighter"<linebreak/> + <emoji name="woman_health_worker" unicode="&#x1f469;&#x2695;"/> <emoji name="woman_health_worker" unicode="&#x1f469;&#x2695;"/> from "woman_health_worker"<linebreak/> + <emoji name="woman_judge" unicode="&#x1f469;&#x2696;"/> <emoji name="woman_judge" unicode="&#x1f469;&#x2696;"/> from "woman_judge"<linebreak/> + <emoji name="woman_juggling" unicode="&#x1f939;&#x2640;"/> <emoji name="woman_juggling" unicode="&#x1f939;&#x2640;"/> from "woman_juggling"<linebreak/> + <emoji name="woman_mechanic" unicode="&#x1f469;&#x1f527;"/> <emoji name="woman_mechanic" unicode="&#x1f469;&#x1f527;"/> from "woman_mechanic"<linebreak/> + <emoji name="woman_office_worker" unicode="&#x1f469;&#x1f4bc;"/> <emoji name="woman_office_worker" unicode="&#x1f469;&#x1f4bc;"/> from "woman_office_worker"<linebreak/> + <emoji name="woman_pilot" unicode="&#x1f469;&#x2708;"/> <emoji name="woman_pilot" unicode="&#x1f469;&#x2708;"/> from "woman_pilot"<linebreak/> + <emoji name="woman_playing_handball" unicode="&#x1f93e;&#x2640;"/> <emoji name="woman_playing_handball" unicode="&#x1f93e;&#x2640;"/> from "woman_playing_handball"<linebreak/> + <emoji name="woman_playing_water_polo" unicode="&#x1f93d;&#x2640;"/> <emoji name="woman_playing_water_polo" unicode="&#x1f93d;&#x2640;"/> from "woman_playing_water_polo"<linebreak/> + <emoji name="woman_scientist" unicode="&#x1f469;&#x1f52c;"/> <emoji name="woman_scientist" unicode="&#x1f469;&#x1f52c;"/> from "woman_scientist"<linebreak/> + <emoji name="woman_shrugging" unicode="&#x1f937;&#x2640;"/> <emoji name="woman_shrugging" unicode="&#x1f937;&#x2640;"/> from "woman_shrugging"<linebreak/> + <emoji name="woman_singer" unicode="&#x1f469;&#x1f3a4;"/> <emoji name="woman_singer" unicode="&#x1f469;&#x1f3a4;"/> from "woman_singer"<linebreak/> + <emoji name="woman_student" unicode="&#x1f469;&#x1f393;"/> <emoji name="woman_student" unicode="&#x1f469;&#x1f393;"/> from "woman_student"<linebreak/> + <emoji name="woman_teacher" unicode="&#x1f469;&#x1f3eb;"/> <emoji name="woman_teacher" unicode="&#x1f469;&#x1f3eb;"/> from "woman_teacher"<linebreak/> + <emoji name="woman_technologist" unicode="&#x1f469;&#x1f4bb;"/> <emoji name="woman_technologist" unicode="&#x1f469;&#x1f4bb;"/> from "woman_technologist"<linebreak/> + <emoji name="woman_with_turban" unicode="&#x1f473;&#x2640;"/> <emoji name="woman_with_turban" unicode="&#x1f473;&#x2640;"/> from "woman_with_turban"<linebreak/> + <emoji name="womans_clothes" unicode="&#x1f45a;"/> <emoji name="womans_clothes" unicode="&#x1f45a;"/> from "womans_clothes"<linebreak/> + <emoji name="womans_hat" unicode="&#x1f452;"/> <emoji name="womans_hat" unicode="&#x1f452;"/> from "womans_hat"<linebreak/> + <emoji name="women_wrestling" unicode="&#x1f93c;&#x2640;"/> <emoji name="women_wrestling" unicode="&#x1f93c;&#x2640;"/> from "women_wrestling"<linebreak/> + <emoji name="womens" unicode="&#x1f6ba;"/> <emoji name="womens" unicode="&#x1f6ba;"/> from "womens"<linebreak/> + <emoji name="world_map" unicode="&#x1f5fa;"/> <emoji name="world_map" unicode="&#x1f5fa;"/> from "world_map"<linebreak/> + <emoji name="worried" unicode="&#x1f61f;"/> <emoji name="worried" unicode="&#x1f61f;"/> from "worried"<linebreak/> + <emoji name="wrench" unicode="&#x1f527;"/> <emoji name="wrench" unicode="&#x1f527;"/> from "wrench"<linebreak/> + <emoji name="writing_hand" unicode="&#x270d;"/> <emoji name="writing_hand" unicode="&#x270d;"/> from "writing_hand"<linebreak/> + <emoji name="x" unicode="&#x274c;"/> <emoji name="x" unicode="&#x274c;"/> from "x"<linebreak/> + <emoji name="yellow_heart" unicode="&#x1f49b;"/> <emoji name="yellow_heart" unicode="&#x1f49b;"/> from "yellow_heart"<linebreak/> + <emoji name="yemen" unicode="&#x1f1fe;&#x1f1ea;"/> <emoji name="yemen" unicode="&#x1f1fe;&#x1f1ea;"/> from "yemen"<linebreak/> + <emoji name="yen" unicode="&#x1f4b4;"/> <emoji name="yen" unicode="&#x1f4b4;"/> from "yen"<linebreak/> + <emoji name="yin_yang" unicode="&#x262f;"/> <emoji name="yin_yang" unicode="&#x262f;"/> from "yin_yang"<linebreak/> + <emoji name="yum" unicode="&#x1f60b;"/> <emoji name="yum" unicode="&#x1f60b;"/> from "yum"<linebreak/> + <emoji name="zambia" unicode="&#x1f1ff;&#x1f1f2;"/> <emoji name="zambia" unicode="&#x1f1ff;&#x1f1f2;"/> from "zambia"<linebreak/> + <emoji name="zap" unicode="&#x26a1;"/> <emoji name="zap" unicode="&#x26a1;"/> from "zap"<linebreak/> + <emoji name="zero" unicode="&#x0030;&#x20e3;"/> <emoji name="zero" unicode="&#x0030;&#x20e3;"/> from "zero"<linebreak/> + <emoji name="zimbabwe" unicode="&#x1f1ff;&#x1f1fc;"/> <emoji name="zimbabwe" unicode="&#x1f1ff;&#x1f1fc;"/> from "zimbabwe"<linebreak/> + <emoji name="zipper_mouth_face" unicode="&#x1f910;"/> <emoji name="zipper_mouth_face" unicode="&#x1f910;"/> from "zipper_mouth_face"<linebreak/> + <emoji name="zzz" unicode="&#x1f4a4;"/> <emoji name="zzz" unicode="&#x1f4a4;"/> from "zzz"<linebreak/> + </para> + </detaileddescription> + </compounddef> +</doxygen> diff --git a/testing/076_emojis.cpp b/testing/076_emojis.cpp new file mode 100644 index 0000000..0526ebe --- /dev/null +++ b/testing/076_emojis.cpp @@ -0,0 +1,1493 @@ +// objective: test all supported emoji characters +// check: indexpage.xml +/** \mainpage Emoji test + + @emoji +1 @emoji :+1: from "+1"<br> + @emoji -1 @emoji :-1: from "-1"<br> + @emoji 100 @emoji :100: from "100"<br> + @emoji 1234 @emoji :1234: from "1234"<br> + @emoji 1st_place_medal @emoji :1st_place_medal: from "1st_place_medal"<br> + @emoji 2nd_place_medal @emoji :2nd_place_medal: from "2nd_place_medal"<br> + @emoji 3rd_place_medal @emoji :3rd_place_medal: from "3rd_place_medal"<br> + @emoji 8ball @emoji :8ball: from "8ball"<br> + @emoji a @emoji :a: from "a"<br> + @emoji ab @emoji :ab: from "ab"<br> + @emoji abc @emoji :abc: from "abc"<br> + @emoji abcd @emoji :abcd: from "abcd"<br> + @emoji accept @emoji :accept: from "accept"<br> + @emoji aerial_tramway @emoji :aerial_tramway: from "aerial_tramway"<br> + @emoji afghanistan @emoji :afghanistan: from "afghanistan"<br> + @emoji airplane @emoji :airplane: from "airplane"<br> + @emoji aland_islands @emoji :aland_islands: from "aland_islands"<br> + @emoji alarm_clock @emoji :alarm_clock: from "alarm_clock"<br> + @emoji albania @emoji :albania: from "albania"<br> + @emoji alembic @emoji :alembic: from "alembic"<br> + @emoji algeria @emoji :algeria: from "algeria"<br> + @emoji alien @emoji :alien: from "alien"<br> + @emoji ambulance @emoji :ambulance: from "ambulance"<br> + @emoji american_samoa @emoji :american_samoa: from "american_samoa"<br> + @emoji amphora @emoji :amphora: from "amphora"<br> + @emoji anchor @emoji :anchor: from "anchor"<br> + @emoji andorra @emoji :andorra: from "andorra"<br> + @emoji angel @emoji :angel: from "angel"<br> + @emoji anger @emoji :anger: from "anger"<br> + @emoji angola @emoji :angola: from "angola"<br> + @emoji angry @emoji :angry: from "angry"<br> + @emoji anguilla @emoji :anguilla: from "anguilla"<br> + @emoji anguished @emoji :anguished: from "anguished"<br> + @emoji ant @emoji :ant: from "ant"<br> + @emoji antarctica @emoji :antarctica: from "antarctica"<br> + @emoji antigua_barbuda @emoji :antigua_barbuda: from "antigua_barbuda"<br> + @emoji apple @emoji :apple: from "apple"<br> + @emoji aquarius @emoji :aquarius: from "aquarius"<br> + @emoji argentina @emoji :argentina: from "argentina"<br> + @emoji aries @emoji :aries: from "aries"<br> + @emoji armenia @emoji :armenia: from "armenia"<br> + @emoji arrow_backward @emoji :arrow_backward: from "arrow_backward"<br> + @emoji arrow_double_down @emoji :arrow_double_down: from "arrow_double_down"<br> + @emoji arrow_double_up @emoji :arrow_double_up: from "arrow_double_up"<br> + @emoji arrow_down @emoji :arrow_down: from "arrow_down"<br> + @emoji arrow_down_small @emoji :arrow_down_small: from "arrow_down_small"<br> + @emoji arrow_forward @emoji :arrow_forward: from "arrow_forward"<br> + @emoji arrow_heading_down @emoji :arrow_heading_down: from "arrow_heading_down"<br> + @emoji arrow_heading_up @emoji :arrow_heading_up: from "arrow_heading_up"<br> + @emoji arrow_left @emoji :arrow_left: from "arrow_left"<br> + @emoji arrow_lower_left @emoji :arrow_lower_left: from "arrow_lower_left"<br> + @emoji arrow_lower_right @emoji :arrow_lower_right: from "arrow_lower_right"<br> + @emoji arrow_right @emoji :arrow_right: from "arrow_right"<br> + @emoji arrow_right_hook @emoji :arrow_right_hook: from "arrow_right_hook"<br> + @emoji arrow_up @emoji :arrow_up: from "arrow_up"<br> + @emoji arrow_up_down @emoji :arrow_up_down: from "arrow_up_down"<br> + @emoji arrow_up_small @emoji :arrow_up_small: from "arrow_up_small"<br> + @emoji arrow_upper_left @emoji :arrow_upper_left: from "arrow_upper_left"<br> + @emoji arrow_upper_right @emoji :arrow_upper_right: from "arrow_upper_right"<br> + @emoji arrows_clockwise @emoji :arrows_clockwise: from "arrows_clockwise"<br> + @emoji arrows_counterclockwise @emoji :arrows_counterclockwise: from "arrows_counterclockwise"<br> + @emoji art @emoji :art: from "art"<br> + @emoji articulated_lorry @emoji :articulated_lorry: from "articulated_lorry"<br> + @emoji artificial_satellite @emoji :artificial_satellite: from "artificial_satellite"<br> + @emoji aruba @emoji :aruba: from "aruba"<br> + @emoji asterisk @emoji :asterisk: from "asterisk"<br> + @emoji astonished @emoji :astonished: from "astonished"<br> + @emoji athletic_shoe @emoji :athletic_shoe: from "athletic_shoe"<br> + @emoji atm @emoji :atm: from "atm"<br> + @emoji atom_symbol @emoji :atom_symbol: from "atom_symbol"<br> + @emoji australia @emoji :australia: from "australia"<br> + @emoji austria @emoji :austria: from "austria"<br> + @emoji avocado @emoji :avocado: from "avocado"<br> + @emoji azerbaijan @emoji :azerbaijan: from "azerbaijan"<br> + @emoji b @emoji :b: from "b"<br> + @emoji baby @emoji :baby: from "baby"<br> + @emoji baby_bottle @emoji :baby_bottle: from "baby_bottle"<br> + @emoji baby_chick @emoji :baby_chick: from "baby_chick"<br> + @emoji baby_symbol @emoji :baby_symbol: from "baby_symbol"<br> + @emoji back @emoji :back: from "back"<br> + @emoji bacon @emoji :bacon: from "bacon"<br> + @emoji badminton @emoji :badminton: from "badminton"<br> + @emoji baggage_claim @emoji :baggage_claim: from "baggage_claim"<br> + @emoji baguette_bread @emoji :baguette_bread: from "baguette_bread"<br> + @emoji bahamas @emoji :bahamas: from "bahamas"<br> + @emoji bahrain @emoji :bahrain: from "bahrain"<br> + @emoji balance_scale @emoji :balance_scale: from "balance_scale"<br> + @emoji balloon @emoji :balloon: from "balloon"<br> + @emoji ballot_box @emoji :ballot_box: from "ballot_box"<br> + @emoji ballot_box_with_check @emoji :ballot_box_with_check: from "ballot_box_with_check"<br> + @emoji bamboo @emoji :bamboo: from "bamboo"<br> + @emoji banana @emoji :banana: from "banana"<br> + @emoji bangbang @emoji :bangbang: from "bangbang"<br> + @emoji bangladesh @emoji :bangladesh: from "bangladesh"<br> + @emoji bank @emoji :bank: from "bank"<br> + @emoji bar_chart @emoji :bar_chart: from "bar_chart"<br> + @emoji barbados @emoji :barbados: from "barbados"<br> + @emoji barber @emoji :barber: from "barber"<br> + @emoji baseball @emoji :baseball: from "baseball"<br> + @emoji basketball @emoji :basketball: from "basketball"<br> + @emoji basketball_man @emoji :basketball_man: from "basketball_man"<br> + @emoji basketball_woman @emoji :basketball_woman: from "basketball_woman"<br> + @emoji bat @emoji :bat: from "bat"<br> + @emoji bath @emoji :bath: from "bath"<br> + @emoji bathtub @emoji :bathtub: from "bathtub"<br> + @emoji battery @emoji :battery: from "battery"<br> + @emoji beach_umbrella @emoji :beach_umbrella: from "beach_umbrella"<br> + @emoji bear @emoji :bear: from "bear"<br> + @emoji bed @emoji :bed: from "bed"<br> + @emoji bee @emoji :bee: from "bee"<br> + @emoji beer @emoji :beer: from "beer"<br> + @emoji beers @emoji :beers: from "beers"<br> + @emoji beetle @emoji :beetle: from "beetle"<br> + @emoji beginner @emoji :beginner: from "beginner"<br> + @emoji belarus @emoji :belarus: from "belarus"<br> + @emoji belgium @emoji :belgium: from "belgium"<br> + @emoji belize @emoji :belize: from "belize"<br> + @emoji bell @emoji :bell: from "bell"<br> + @emoji bellhop_bell @emoji :bellhop_bell: from "bellhop_bell"<br> + @emoji benin @emoji :benin: from "benin"<br> + @emoji bento @emoji :bento: from "bento"<br> + @emoji bermuda @emoji :bermuda: from "bermuda"<br> + @emoji bhutan @emoji :bhutan: from "bhutan"<br> + @emoji bicyclist @emoji :bicyclist: from "bicyclist"<br> + @emoji bike @emoji :bike: from "bike"<br> + @emoji biking_man @emoji :biking_man: from "biking_man"<br> + @emoji biking_woman @emoji :biking_woman: from "biking_woman"<br> + @emoji bikini @emoji :bikini: from "bikini"<br> + @emoji biohazard @emoji :biohazard: from "biohazard"<br> + @emoji bird @emoji :bird: from "bird"<br> + @emoji birthday @emoji :birthday: from "birthday"<br> + @emoji black_circle @emoji :black_circle: from "black_circle"<br> + @emoji black_flag @emoji :black_flag: from "black_flag"<br> + @emoji black_heart @emoji :black_heart: from "black_heart"<br> + @emoji black_joker @emoji :black_joker: from "black_joker"<br> + @emoji black_large_square @emoji :black_large_square: from "black_large_square"<br> + @emoji black_medium_small_square @emoji :black_medium_small_square: from "black_medium_small_square"<br> + @emoji black_medium_square @emoji :black_medium_square: from "black_medium_square"<br> + @emoji black_nib @emoji :black_nib: from "black_nib"<br> + @emoji black_small_square @emoji :black_small_square: from "black_small_square"<br> + @emoji black_square_button @emoji :black_square_button: from "black_square_button"<br> + @emoji blonde_man @emoji :blonde_man: from "blonde_man"<br> + @emoji blonde_woman @emoji :blonde_woman: from "blonde_woman"<br> + @emoji blossom @emoji :blossom: from "blossom"<br> + @emoji blowfish @emoji :blowfish: from "blowfish"<br> + @emoji blue_book @emoji :blue_book: from "blue_book"<br> + @emoji blue_car @emoji :blue_car: from "blue_car"<br> + @emoji blue_heart @emoji :blue_heart: from "blue_heart"<br> + @emoji blush @emoji :blush: from "blush"<br> + @emoji boar @emoji :boar: from "boar"<br> + @emoji boat @emoji :boat: from "boat"<br> + @emoji bolivia @emoji :bolivia: from "bolivia"<br> + @emoji bomb @emoji :bomb: from "bomb"<br> + @emoji book @emoji :book: from "book"<br> + @emoji bookmark @emoji :bookmark: from "bookmark"<br> + @emoji bookmark_tabs @emoji :bookmark_tabs: from "bookmark_tabs"<br> + @emoji books @emoji :books: from "books"<br> + @emoji boom @emoji :boom: from "boom"<br> + @emoji boot @emoji :boot: from "boot"<br> + @emoji bosnia_herzegovina @emoji :bosnia_herzegovina: from "bosnia_herzegovina"<br> + @emoji botswana @emoji :botswana: from "botswana"<br> + @emoji bouquet @emoji :bouquet: from "bouquet"<br> + @emoji bow @emoji :bow: from "bow"<br> + @emoji bow_and_arrow @emoji :bow_and_arrow: from "bow_and_arrow"<br> + @emoji bowing_man @emoji :bowing_man: from "bowing_man"<br> + @emoji bowing_woman @emoji :bowing_woman: from "bowing_woman"<br> + @emoji bowling @emoji :bowling: from "bowling"<br> + @emoji boxing_glove @emoji :boxing_glove: from "boxing_glove"<br> + @emoji boy @emoji :boy: from "boy"<br> + @emoji brazil @emoji :brazil: from "brazil"<br> + @emoji bread @emoji :bread: from "bread"<br> + @emoji bride_with_veil @emoji :bride_with_veil: from "bride_with_veil"<br> + @emoji bridge_at_night @emoji :bridge_at_night: from "bridge_at_night"<br> + @emoji briefcase @emoji :briefcase: from "briefcase"<br> + @emoji british_indian_ocean_territory @emoji :british_indian_ocean_territory: from "british_indian_ocean_territory"<br> + @emoji british_virgin_islands @emoji :british_virgin_islands: from "british_virgin_islands"<br> + @emoji broken_heart @emoji :broken_heart: from "broken_heart"<br> + @emoji brunei @emoji :brunei: from "brunei"<br> + @emoji bug @emoji :bug: from "bug"<br> + @emoji building_construction @emoji :building_construction: from "building_construction"<br> + @emoji bulb @emoji :bulb: from "bulb"<br> + @emoji bulgaria @emoji :bulgaria: from "bulgaria"<br> + @emoji bullettrain_front @emoji :bullettrain_front: from "bullettrain_front"<br> + @emoji bullettrain_side @emoji :bullettrain_side: from "bullettrain_side"<br> + @emoji burkina_faso @emoji :burkina_faso: from "burkina_faso"<br> + @emoji burrito @emoji :burrito: from "burrito"<br> + @emoji burundi @emoji :burundi: from "burundi"<br> + @emoji bus @emoji :bus: from "bus"<br> + @emoji business_suit_levitating @emoji :business_suit_levitating: from "business_suit_levitating"<br> + @emoji busstop @emoji :busstop: from "busstop"<br> + @emoji bust_in_silhouette @emoji :bust_in_silhouette: from "bust_in_silhouette"<br> + @emoji busts_in_silhouette @emoji :busts_in_silhouette: from "busts_in_silhouette"<br> + @emoji butterfly @emoji :butterfly: from "butterfly"<br> + @emoji cactus @emoji :cactus: from "cactus"<br> + @emoji cake @emoji :cake: from "cake"<br> + @emoji calendar @emoji :calendar: from "calendar"<br> + @emoji call_me_hand @emoji :call_me_hand: from "call_me_hand"<br> + @emoji calling @emoji :calling: from "calling"<br> + @emoji cambodia @emoji :cambodia: from "cambodia"<br> + @emoji camel @emoji :camel: from "camel"<br> + @emoji camera @emoji :camera: from "camera"<br> + @emoji camera_flash @emoji :camera_flash: from "camera_flash"<br> + @emoji cameroon @emoji :cameroon: from "cameroon"<br> + @emoji camping @emoji :camping: from "camping"<br> + @emoji canada @emoji :canada: from "canada"<br> + @emoji canary_islands @emoji :canary_islands: from "canary_islands"<br> + @emoji cancer @emoji :cancer: from "cancer"<br> + @emoji candle @emoji :candle: from "candle"<br> + @emoji candy @emoji :candy: from "candy"<br> + @emoji canoe @emoji :canoe: from "canoe"<br> + @emoji cape_verde @emoji :cape_verde: from "cape_verde"<br> + @emoji capital_abcd @emoji :capital_abcd: from "capital_abcd"<br> + @emoji capricorn @emoji :capricorn: from "capricorn"<br> + @emoji car @emoji :car: from "car"<br> + @emoji card_file_box @emoji :card_file_box: from "card_file_box"<br> + @emoji card_index @emoji :card_index: from "card_index"<br> + @emoji card_index_dividers @emoji :card_index_dividers: from "card_index_dividers"<br> + @emoji caribbean_netherlands @emoji :caribbean_netherlands: from "caribbean_netherlands"<br> + @emoji carousel_horse @emoji :carousel_horse: from "carousel_horse"<br> + @emoji carrot @emoji :carrot: from "carrot"<br> + @emoji cat @emoji :cat: from "cat"<br> + @emoji cat2 @emoji :cat2: from "cat2"<br> + @emoji cayman_islands @emoji :cayman_islands: from "cayman_islands"<br> + @emoji cd @emoji :cd: from "cd"<br> + @emoji central_african_republic @emoji :central_african_republic: from "central_african_republic"<br> + @emoji chad @emoji :chad: from "chad"<br> + @emoji chains @emoji :chains: from "chains"<br> + @emoji champagne @emoji :champagne: from "champagne"<br> + @emoji chart @emoji :chart: from "chart"<br> + @emoji chart_with_downwards_trend @emoji :chart_with_downwards_trend: from "chart_with_downwards_trend"<br> + @emoji chart_with_upwards_trend @emoji :chart_with_upwards_trend: from "chart_with_upwards_trend"<br> + @emoji checkered_flag @emoji :checkered_flag: from "checkered_flag"<br> + @emoji cheese @emoji :cheese: from "cheese"<br> + @emoji cherries @emoji :cherries: from "cherries"<br> + @emoji cherry_blossom @emoji :cherry_blossom: from "cherry_blossom"<br> + @emoji chestnut @emoji :chestnut: from "chestnut"<br> + @emoji chicken @emoji :chicken: from "chicken"<br> + @emoji children_crossing @emoji :children_crossing: from "children_crossing"<br> + @emoji chile @emoji :chile: from "chile"<br> + @emoji chipmunk @emoji :chipmunk: from "chipmunk"<br> + @emoji chocolate_bar @emoji :chocolate_bar: from "chocolate_bar"<br> + @emoji christmas_island @emoji :christmas_island: from "christmas_island"<br> + @emoji christmas_tree @emoji :christmas_tree: from "christmas_tree"<br> + @emoji church @emoji :church: from "church"<br> + @emoji cinema @emoji :cinema: from "cinema"<br> + @emoji circus_tent @emoji :circus_tent: from "circus_tent"<br> + @emoji city_sunrise @emoji :city_sunrise: from "city_sunrise"<br> + @emoji city_sunset @emoji :city_sunset: from "city_sunset"<br> + @emoji cityscape @emoji :cityscape: from "cityscape"<br> + @emoji cl @emoji :cl: from "cl"<br> + @emoji clamp @emoji :clamp: from "clamp"<br> + @emoji clap @emoji :clap: from "clap"<br> + @emoji clapper @emoji :clapper: from "clapper"<br> + @emoji classical_building @emoji :classical_building: from "classical_building"<br> + @emoji clinking_glasses @emoji :clinking_glasses: from "clinking_glasses"<br> + @emoji clipboard @emoji :clipboard: from "clipboard"<br> + @emoji clock1 @emoji :clock1: from "clock1"<br> + @emoji clock10 @emoji :clock10: from "clock10"<br> + @emoji clock1030 @emoji :clock1030: from "clock1030"<br> + @emoji clock11 @emoji :clock11: from "clock11"<br> + @emoji clock1130 @emoji :clock1130: from "clock1130"<br> + @emoji clock12 @emoji :clock12: from "clock12"<br> + @emoji clock1230 @emoji :clock1230: from "clock1230"<br> + @emoji clock130 @emoji :clock130: from "clock130"<br> + @emoji clock2 @emoji :clock2: from "clock2"<br> + @emoji clock230 @emoji :clock230: from "clock230"<br> + @emoji clock3 @emoji :clock3: from "clock3"<br> + @emoji clock330 @emoji :clock330: from "clock330"<br> + @emoji clock4 @emoji :clock4: from "clock4"<br> + @emoji clock430 @emoji :clock430: from "clock430"<br> + @emoji clock5 @emoji :clock5: from "clock5"<br> + @emoji clock530 @emoji :clock530: from "clock530"<br> + @emoji clock6 @emoji :clock6: from "clock6"<br> + @emoji clock630 @emoji :clock630: from "clock630"<br> + @emoji clock7 @emoji :clock7: from "clock7"<br> + @emoji clock730 @emoji :clock730: from "clock730"<br> + @emoji clock8 @emoji :clock8: from "clock8"<br> + @emoji clock830 @emoji :clock830: from "clock830"<br> + @emoji clock9 @emoji :clock9: from "clock9"<br> + @emoji clock930 @emoji :clock930: from "clock930"<br> + @emoji closed_book @emoji :closed_book: from "closed_book"<br> + @emoji closed_lock_with_key @emoji :closed_lock_with_key: from "closed_lock_with_key"<br> + @emoji closed_umbrella @emoji :closed_umbrella: from "closed_umbrella"<br> + @emoji cloud @emoji :cloud: from "cloud"<br> + @emoji cloud_with_lightning @emoji :cloud_with_lightning: from "cloud_with_lightning"<br> + @emoji cloud_with_lightning_and_rain @emoji :cloud_with_lightning_and_rain: from "cloud_with_lightning_and_rain"<br> + @emoji cloud_with_rain @emoji :cloud_with_rain: from "cloud_with_rain"<br> + @emoji cloud_with_snow @emoji :cloud_with_snow: from "cloud_with_snow"<br> + @emoji clown_face @emoji :clown_face: from "clown_face"<br> + @emoji clubs @emoji :clubs: from "clubs"<br> + @emoji cn @emoji :cn: from "cn"<br> + @emoji cocktail @emoji :cocktail: from "cocktail"<br> + @emoji cocos_islands @emoji :cocos_islands: from "cocos_islands"<br> + @emoji coffee @emoji :coffee: from "coffee"<br> + @emoji coffin @emoji :coffin: from "coffin"<br> + @emoji cold_sweat @emoji :cold_sweat: from "cold_sweat"<br> + @emoji collision @emoji :collision: from "collision"<br> + @emoji colombia @emoji :colombia: from "colombia"<br> + @emoji comet @emoji :comet: from "comet"<br> + @emoji comoros @emoji :comoros: from "comoros"<br> + @emoji computer @emoji :computer: from "computer"<br> + @emoji computer_mouse @emoji :computer_mouse: from "computer_mouse"<br> + @emoji confetti_ball @emoji :confetti_ball: from "confetti_ball"<br> + @emoji confounded @emoji :confounded: from "confounded"<br> + @emoji confused @emoji :confused: from "confused"<br> + @emoji congo_brazzaville @emoji :congo_brazzaville: from "congo_brazzaville"<br> + @emoji congo_kinshasa @emoji :congo_kinshasa: from "congo_kinshasa"<br> + @emoji congratulations @emoji :congratulations: from "congratulations"<br> + @emoji construction @emoji :construction: from "construction"<br> + @emoji construction_worker @emoji :construction_worker: from "construction_worker"<br> + @emoji construction_worker_man @emoji :construction_worker_man: from "construction_worker_man"<br> + @emoji construction_worker_woman @emoji :construction_worker_woman: from "construction_worker_woman"<br> + @emoji control_knobs @emoji :control_knobs: from "control_knobs"<br> + @emoji convenience_store @emoji :convenience_store: from "convenience_store"<br> + @emoji cook_islands @emoji :cook_islands: from "cook_islands"<br> + @emoji cookie @emoji :cookie: from "cookie"<br> + @emoji cool @emoji :cool: from "cool"<br> + @emoji cop @emoji :cop: from "cop"<br> + @emoji copyright @emoji :copyright: from "copyright"<br> + @emoji corn @emoji :corn: from "corn"<br> + @emoji costa_rica @emoji :costa_rica: from "costa_rica"<br> + @emoji cote_divoire @emoji :cote_divoire: from "cote_divoire"<br> + @emoji couch_and_lamp @emoji :couch_and_lamp: from "couch_and_lamp"<br> + @emoji couple @emoji :couple: from "couple"<br> + @emoji couple_with_heart @emoji :couple_with_heart: from "couple_with_heart"<br> + @emoji couple_with_heart_man_man @emoji :couple_with_heart_man_man: from "couple_with_heart_man_man"<br> + @emoji couple_with_heart_woman_man @emoji :couple_with_heart_woman_man: from "couple_with_heart_woman_man"<br> + @emoji couple_with_heart_woman_woman @emoji :couple_with_heart_woman_woman: from "couple_with_heart_woman_woman"<br> + @emoji couplekiss_man_man @emoji :couplekiss_man_man: from "couplekiss_man_man"<br> + @emoji couplekiss_man_woman @emoji :couplekiss_man_woman: from "couplekiss_man_woman"<br> + @emoji couplekiss_woman_woman @emoji :couplekiss_woman_woman: from "couplekiss_woman_woman"<br> + @emoji cow @emoji :cow: from "cow"<br> + @emoji cow2 @emoji :cow2: from "cow2"<br> + @emoji cowboy_hat_face @emoji :cowboy_hat_face: from "cowboy_hat_face"<br> + @emoji crab @emoji :crab: from "crab"<br> + @emoji crayon @emoji :crayon: from "crayon"<br> + @emoji credit_card @emoji :credit_card: from "credit_card"<br> + @emoji crescent_moon @emoji :crescent_moon: from "crescent_moon"<br> + @emoji cricket @emoji :cricket: from "cricket"<br> + @emoji croatia @emoji :croatia: from "croatia"<br> + @emoji crocodile @emoji :crocodile: from "crocodile"<br> + @emoji croissant @emoji :croissant: from "croissant"<br> + @emoji crossed_fingers @emoji :crossed_fingers: from "crossed_fingers"<br> + @emoji crossed_flags @emoji :crossed_flags: from "crossed_flags"<br> + @emoji crossed_swords @emoji :crossed_swords: from "crossed_swords"<br> + @emoji crown @emoji :crown: from "crown"<br> + @emoji cry @emoji :cry: from "cry"<br> + @emoji crying_cat_face @emoji :crying_cat_face: from "crying_cat_face"<br> + @emoji crystal_ball @emoji :crystal_ball: from "crystal_ball"<br> + @emoji cuba @emoji :cuba: from "cuba"<br> + @emoji cucumber @emoji :cucumber: from "cucumber"<br> + @emoji cupid @emoji :cupid: from "cupid"<br> + @emoji curacao @emoji :curacao: from "curacao"<br> + @emoji curly_loop @emoji :curly_loop: from "curly_loop"<br> + @emoji currency_exchange @emoji :currency_exchange: from "currency_exchange"<br> + @emoji curry @emoji :curry: from "curry"<br> + @emoji custard @emoji :custard: from "custard"<br> + @emoji customs @emoji :customs: from "customs"<br> + @emoji cyclone @emoji :cyclone: from "cyclone"<br> + @emoji cyprus @emoji :cyprus: from "cyprus"<br> + @emoji czech_republic @emoji :czech_republic: from "czech_republic"<br> + @emoji dagger @emoji :dagger: from "dagger"<br> + @emoji dancer @emoji :dancer: from "dancer"<br> + @emoji dancers @emoji :dancers: from "dancers"<br> + @emoji dancing_men @emoji :dancing_men: from "dancing_men"<br> + @emoji dancing_women @emoji :dancing_women: from "dancing_women"<br> + @emoji dango @emoji :dango: from "dango"<br> + @emoji dark_sunglasses @emoji :dark_sunglasses: from "dark_sunglasses"<br> + @emoji dart @emoji :dart: from "dart"<br> + @emoji dash @emoji :dash: from "dash"<br> + @emoji date @emoji :date: from "date"<br> + @emoji de @emoji :de: from "de"<br> + @emoji deciduous_tree @emoji :deciduous_tree: from "deciduous_tree"<br> + @emoji deer @emoji :deer: from "deer"<br> + @emoji denmark @emoji :denmark: from "denmark"<br> + @emoji department_store @emoji :department_store: from "department_store"<br> + @emoji derelict_house @emoji :derelict_house: from "derelict_house"<br> + @emoji desert @emoji :desert: from "desert"<br> + @emoji desert_island @emoji :desert_island: from "desert_island"<br> + @emoji desktop_computer @emoji :desktop_computer: from "desktop_computer"<br> + @emoji detective @emoji :detective: from "detective"<br> + @emoji diamond_shape_with_a_dot_inside @emoji :diamond_shape_with_a_dot_inside: from "diamond_shape_with_a_dot_inside"<br> + @emoji diamonds @emoji :diamonds: from "diamonds"<br> + @emoji disappointed @emoji :disappointed: from "disappointed"<br> + @emoji disappointed_relieved @emoji :disappointed_relieved: from "disappointed_relieved"<br> + @emoji dizzy @emoji :dizzy: from "dizzy"<br> + @emoji dizzy_face @emoji :dizzy_face: from "dizzy_face"<br> + @emoji djibouti @emoji :djibouti: from "djibouti"<br> + @emoji do_not_litter @emoji :do_not_litter: from "do_not_litter"<br> + @emoji dog @emoji :dog: from "dog"<br> + @emoji dog2 @emoji :dog2: from "dog2"<br> + @emoji dollar @emoji :dollar: from "dollar"<br> + @emoji dolls @emoji :dolls: from "dolls"<br> + @emoji dolphin @emoji :dolphin: from "dolphin"<br> + @emoji dominica @emoji :dominica: from "dominica"<br> + @emoji dominican_republic @emoji :dominican_republic: from "dominican_republic"<br> + @emoji door @emoji :door: from "door"<br> + @emoji doughnut @emoji :doughnut: from "doughnut"<br> + @emoji dove @emoji :dove: from "dove"<br> + @emoji dragon @emoji :dragon: from "dragon"<br> + @emoji dragon_face @emoji :dragon_face: from "dragon_face"<br> + @emoji dress @emoji :dress: from "dress"<br> + @emoji dromedary_camel @emoji :dromedary_camel: from "dromedary_camel"<br> + @emoji drooling_face @emoji :drooling_face: from "drooling_face"<br> + @emoji droplet @emoji :droplet: from "droplet"<br> + @emoji drum @emoji :drum: from "drum"<br> + @emoji duck @emoji :duck: from "duck"<br> + @emoji dvd @emoji :dvd: from "dvd"<br> + @emoji e-mail @emoji :e-mail: from "e-mail"<br> + @emoji eagle @emoji :eagle: from "eagle"<br> + @emoji ear @emoji :ear: from "ear"<br> + @emoji ear_of_rice @emoji :ear_of_rice: from "ear_of_rice"<br> + @emoji earth_africa @emoji :earth_africa: from "earth_africa"<br> + @emoji earth_americas @emoji :earth_americas: from "earth_americas"<br> + @emoji earth_asia @emoji :earth_asia: from "earth_asia"<br> + @emoji ecuador @emoji :ecuador: from "ecuador"<br> + @emoji egg @emoji :egg: from "egg"<br> + @emoji eggplant @emoji :eggplant: from "eggplant"<br> + @emoji egypt @emoji :egypt: from "egypt"<br> + @emoji eight @emoji :eight: from "eight"<br> + @emoji eight_pointed_black_star @emoji :eight_pointed_black_star: from "eight_pointed_black_star"<br> + @emoji eight_spoked_asterisk @emoji :eight_spoked_asterisk: from "eight_spoked_asterisk"<br> + @emoji el_salvador @emoji :el_salvador: from "el_salvador"<br> + @emoji electric_plug @emoji :electric_plug: from "electric_plug"<br> + @emoji elephant @emoji :elephant: from "elephant"<br> + @emoji email @emoji :email: from "email"<br> + @emoji end @emoji :end: from "end"<br> + @emoji envelope @emoji :envelope: from "envelope"<br> + @emoji envelope_with_arrow @emoji :envelope_with_arrow: from "envelope_with_arrow"<br> + @emoji equatorial_guinea @emoji :equatorial_guinea: from "equatorial_guinea"<br> + @emoji eritrea @emoji :eritrea: from "eritrea"<br> + @emoji es @emoji :es: from "es"<br> + @emoji estonia @emoji :estonia: from "estonia"<br> + @emoji ethiopia @emoji :ethiopia: from "ethiopia"<br> + @emoji eu @emoji :eu: from "eu"<br> + @emoji euro @emoji :euro: from "euro"<br> + @emoji european_castle @emoji :european_castle: from "european_castle"<br> + @emoji european_post_office @emoji :european_post_office: from "european_post_office"<br> + @emoji european_union @emoji :european_union: from "european_union"<br> + @emoji evergreen_tree @emoji :evergreen_tree: from "evergreen_tree"<br> + @emoji exclamation @emoji :exclamation: from "exclamation"<br> + @emoji expressionless @emoji :expressionless: from "expressionless"<br> + @emoji eye @emoji :eye: from "eye"<br> + @emoji eye_speech_bubble @emoji :eye_speech_bubble: from "eye_speech_bubble"<br> + @emoji eyeglasses @emoji :eyeglasses: from "eyeglasses"<br> + @emoji eyes @emoji :eyes: from "eyes"<br> + @emoji face_with_head_bandage @emoji :face_with_head_bandage: from "face_with_head_bandage"<br> + @emoji face_with_thermometer @emoji :face_with_thermometer: from "face_with_thermometer"<br> + @emoji facepunch @emoji :facepunch: from "facepunch"<br> + @emoji factory @emoji :factory: from "factory"<br> + @emoji falkland_islands @emoji :falkland_islands: from "falkland_islands"<br> + @emoji fallen_leaf @emoji :fallen_leaf: from "fallen_leaf"<br> + @emoji family @emoji :family: from "family"<br> + @emoji family_man_boy @emoji :family_man_boy: from "family_man_boy"<br> + @emoji family_man_boy_boy @emoji :family_man_boy_boy: from "family_man_boy_boy"<br> + @emoji family_man_girl @emoji :family_man_girl: from "family_man_girl"<br> + @emoji family_man_girl_boy @emoji :family_man_girl_boy: from "family_man_girl_boy"<br> + @emoji family_man_girl_girl @emoji :family_man_girl_girl: from "family_man_girl_girl"<br> + @emoji family_man_man_boy @emoji :family_man_man_boy: from "family_man_man_boy"<br> + @emoji family_man_man_boy_boy @emoji :family_man_man_boy_boy: from "family_man_man_boy_boy"<br> + @emoji family_man_man_girl @emoji :family_man_man_girl: from "family_man_man_girl"<br> + @emoji family_man_man_girl_boy @emoji :family_man_man_girl_boy: from "family_man_man_girl_boy"<br> + @emoji family_man_man_girl_girl @emoji :family_man_man_girl_girl: from "family_man_man_girl_girl"<br> + @emoji family_man_woman_boy @emoji :family_man_woman_boy: from "family_man_woman_boy"<br> + @emoji family_man_woman_boy_boy @emoji :family_man_woman_boy_boy: from "family_man_woman_boy_boy"<br> + @emoji family_man_woman_girl @emoji :family_man_woman_girl: from "family_man_woman_girl"<br> + @emoji family_man_woman_girl_boy @emoji :family_man_woman_girl_boy: from "family_man_woman_girl_boy"<br> + @emoji family_man_woman_girl_girl @emoji :family_man_woman_girl_girl: from "family_man_woman_girl_girl"<br> + @emoji family_woman_boy @emoji :family_woman_boy: from "family_woman_boy"<br> + @emoji family_woman_boy_boy @emoji :family_woman_boy_boy: from "family_woman_boy_boy"<br> + @emoji family_woman_girl @emoji :family_woman_girl: from "family_woman_girl"<br> + @emoji family_woman_girl_boy @emoji :family_woman_girl_boy: from "family_woman_girl_boy"<br> + @emoji family_woman_girl_girl @emoji :family_woman_girl_girl: from "family_woman_girl_girl"<br> + @emoji family_woman_woman_boy @emoji :family_woman_woman_boy: from "family_woman_woman_boy"<br> + @emoji family_woman_woman_boy_boy @emoji :family_woman_woman_boy_boy: from "family_woman_woman_boy_boy"<br> + @emoji family_woman_woman_girl @emoji :family_woman_woman_girl: from "family_woman_woman_girl"<br> + @emoji family_woman_woman_girl_boy @emoji :family_woman_woman_girl_boy: from "family_woman_woman_girl_boy"<br> + @emoji family_woman_woman_girl_girl @emoji :family_woman_woman_girl_girl: from "family_woman_woman_girl_girl"<br> + @emoji faroe_islands @emoji :faroe_islands: from "faroe_islands"<br> + @emoji fast_forward @emoji :fast_forward: from "fast_forward"<br> + @emoji fax @emoji :fax: from "fax"<br> + @emoji fearful @emoji :fearful: from "fearful"<br> + @emoji feet @emoji :feet: from "feet"<br> + @emoji female_detective @emoji :female_detective: from "female_detective"<br> + @emoji ferris_wheel @emoji :ferris_wheel: from "ferris_wheel"<br> + @emoji ferry @emoji :ferry: from "ferry"<br> + @emoji field_hockey @emoji :field_hockey: from "field_hockey"<br> + @emoji fiji @emoji :fiji: from "fiji"<br> + @emoji file_cabinet @emoji :file_cabinet: from "file_cabinet"<br> + @emoji file_folder @emoji :file_folder: from "file_folder"<br> + @emoji film_projector @emoji :film_projector: from "film_projector"<br> + @emoji film_strip @emoji :film_strip: from "film_strip"<br> + @emoji finland @emoji :finland: from "finland"<br> + @emoji fire @emoji :fire: from "fire"<br> + @emoji fire_engine @emoji :fire_engine: from "fire_engine"<br> + @emoji fireworks @emoji :fireworks: from "fireworks"<br> + @emoji first_quarter_moon @emoji :first_quarter_moon: from "first_quarter_moon"<br> + @emoji first_quarter_moon_with_face @emoji :first_quarter_moon_with_face: from "first_quarter_moon_with_face"<br> + @emoji fish @emoji :fish: from "fish"<br> + @emoji fish_cake @emoji :fish_cake: from "fish_cake"<br> + @emoji fishing_pole_and_fish @emoji :fishing_pole_and_fish: from "fishing_pole_and_fish"<br> + @emoji fist @emoji :fist: from "fist"<br> + @emoji fist_left @emoji :fist_left: from "fist_left"<br> + @emoji fist_oncoming @emoji :fist_oncoming: from "fist_oncoming"<br> + @emoji fist_raised @emoji :fist_raised: from "fist_raised"<br> + @emoji fist_right @emoji :fist_right: from "fist_right"<br> + @emoji five @emoji :five: from "five"<br> + @emoji flags @emoji :flags: from "flags"<br> + @emoji flashlight @emoji :flashlight: from "flashlight"<br> + @emoji fleur_de_lis @emoji :fleur_de_lis: from "fleur_de_lis"<br> + @emoji flight_arrival @emoji :flight_arrival: from "flight_arrival"<br> + @emoji flight_departure @emoji :flight_departure: from "flight_departure"<br> + @emoji flipper @emoji :flipper: from "flipper"<br> + @emoji floppy_disk @emoji :floppy_disk: from "floppy_disk"<br> + @emoji flower_playing_cards @emoji :flower_playing_cards: from "flower_playing_cards"<br> + @emoji flushed @emoji :flushed: from "flushed"<br> + @emoji fog @emoji :fog: from "fog"<br> + @emoji foggy @emoji :foggy: from "foggy"<br> + @emoji football @emoji :football: from "football"<br> + @emoji footprints @emoji :footprints: from "footprints"<br> + @emoji fork_and_knife @emoji :fork_and_knife: from "fork_and_knife"<br> + @emoji fountain @emoji :fountain: from "fountain"<br> + @emoji fountain_pen @emoji :fountain_pen: from "fountain_pen"<br> + @emoji four @emoji :four: from "four"<br> + @emoji four_leaf_clover @emoji :four_leaf_clover: from "four_leaf_clover"<br> + @emoji fox_face @emoji :fox_face: from "fox_face"<br> + @emoji fr @emoji :fr: from "fr"<br> + @emoji framed_picture @emoji :framed_picture: from "framed_picture"<br> + @emoji free @emoji :free: from "free"<br> + @emoji french_guiana @emoji :french_guiana: from "french_guiana"<br> + @emoji french_polynesia @emoji :french_polynesia: from "french_polynesia"<br> + @emoji french_southern_territories @emoji :french_southern_territories: from "french_southern_territories"<br> + @emoji fried_egg @emoji :fried_egg: from "fried_egg"<br> + @emoji fried_shrimp @emoji :fried_shrimp: from "fried_shrimp"<br> + @emoji fries @emoji :fries: from "fries"<br> + @emoji frog @emoji :frog: from "frog"<br> + @emoji frowning @emoji :frowning: from "frowning"<br> + @emoji frowning_face @emoji :frowning_face: from "frowning_face"<br> + @emoji frowning_man @emoji :frowning_man: from "frowning_man"<br> + @emoji frowning_woman @emoji :frowning_woman: from "frowning_woman"<br> + @emoji fu @emoji :fu: from "fu"<br> + @emoji fuelpump @emoji :fuelpump: from "fuelpump"<br> + @emoji full_moon @emoji :full_moon: from "full_moon"<br> + @emoji full_moon_with_face @emoji :full_moon_with_face: from "full_moon_with_face"<br> + @emoji funeral_urn @emoji :funeral_urn: from "funeral_urn"<br> + @emoji gabon @emoji :gabon: from "gabon"<br> + @emoji gambia @emoji :gambia: from "gambia"<br> + @emoji game_die @emoji :game_die: from "game_die"<br> + @emoji gb @emoji :gb: from "gb"<br> + @emoji gear @emoji :gear: from "gear"<br> + @emoji gem @emoji :gem: from "gem"<br> + @emoji gemini @emoji :gemini: from "gemini"<br> + @emoji georgia @emoji :georgia: from "georgia"<br> + @emoji ghana @emoji :ghana: from "ghana"<br> + @emoji ghost @emoji :ghost: from "ghost"<br> + @emoji gibraltar @emoji :gibraltar: from "gibraltar"<br> + @emoji gift @emoji :gift: from "gift"<br> + @emoji gift_heart @emoji :gift_heart: from "gift_heart"<br> + @emoji girl @emoji :girl: from "girl"<br> + @emoji globe_with_meridians @emoji :globe_with_meridians: from "globe_with_meridians"<br> + @emoji goal_net @emoji :goal_net: from "goal_net"<br> + @emoji goat @emoji :goat: from "goat"<br> + @emoji golf @emoji :golf: from "golf"<br> + @emoji golfing_man @emoji :golfing_man: from "golfing_man"<br> + @emoji golfing_woman @emoji :golfing_woman: from "golfing_woman"<br> + @emoji gorilla @emoji :gorilla: from "gorilla"<br> + @emoji grapes @emoji :grapes: from "grapes"<br> + @emoji greece @emoji :greece: from "greece"<br> + @emoji green_apple @emoji :green_apple: from "green_apple"<br> + @emoji green_book @emoji :green_book: from "green_book"<br> + @emoji green_heart @emoji :green_heart: from "green_heart"<br> + @emoji green_salad @emoji :green_salad: from "green_salad"<br> + @emoji greenland @emoji :greenland: from "greenland"<br> + @emoji grenada @emoji :grenada: from "grenada"<br> + @emoji grey_exclamation @emoji :grey_exclamation: from "grey_exclamation"<br> + @emoji grey_question @emoji :grey_question: from "grey_question"<br> + @emoji grimacing @emoji :grimacing: from "grimacing"<br> + @emoji grin @emoji :grin: from "grin"<br> + @emoji grinning @emoji :grinning: from "grinning"<br> + @emoji guadeloupe @emoji :guadeloupe: from "guadeloupe"<br> + @emoji guam @emoji :guam: from "guam"<br> + @emoji guardsman @emoji :guardsman: from "guardsman"<br> + @emoji guardswoman @emoji :guardswoman: from "guardswoman"<br> + @emoji guatemala @emoji :guatemala: from "guatemala"<br> + @emoji guernsey @emoji :guernsey: from "guernsey"<br> + @emoji guinea @emoji :guinea: from "guinea"<br> + @emoji guinea_bissau @emoji :guinea_bissau: from "guinea_bissau"<br> + @emoji guitar @emoji :guitar: from "guitar"<br> + @emoji gun @emoji :gun: from "gun"<br> + @emoji guyana @emoji :guyana: from "guyana"<br> + @emoji haircut @emoji :haircut: from "haircut"<br> + @emoji haircut_man @emoji :haircut_man: from "haircut_man"<br> + @emoji haircut_woman @emoji :haircut_woman: from "haircut_woman"<br> + @emoji haiti @emoji :haiti: from "haiti"<br> + @emoji hamburger @emoji :hamburger: from "hamburger"<br> + @emoji hammer @emoji :hammer: from "hammer"<br> + @emoji hammer_and_pick @emoji :hammer_and_pick: from "hammer_and_pick"<br> + @emoji hammer_and_wrench @emoji :hammer_and_wrench: from "hammer_and_wrench"<br> + @emoji hamster @emoji :hamster: from "hamster"<br> + @emoji hand @emoji :hand: from "hand"<br> + @emoji handbag @emoji :handbag: from "handbag"<br> + @emoji handshake @emoji :handshake: from "handshake"<br> + @emoji hankey @emoji :hankey: from "hankey"<br> + @emoji hash @emoji :hash: from "hash"<br> + @emoji hatched_chick @emoji :hatched_chick: from "hatched_chick"<br> + @emoji hatching_chick @emoji :hatching_chick: from "hatching_chick"<br> + @emoji headphones @emoji :headphones: from "headphones"<br> + @emoji hear_no_evil @emoji :hear_no_evil: from "hear_no_evil"<br> + @emoji heart @emoji :heart: from "heart"<br> + @emoji heart_decoration @emoji :heart_decoration: from "heart_decoration"<br> + @emoji heart_eyes @emoji :heart_eyes: from "heart_eyes"<br> + @emoji heart_eyes_cat @emoji :heart_eyes_cat: from "heart_eyes_cat"<br> + @emoji heartbeat @emoji :heartbeat: from "heartbeat"<br> + @emoji heartpulse @emoji :heartpulse: from "heartpulse"<br> + @emoji hearts @emoji :hearts: from "hearts"<br> + @emoji heavy_check_mark @emoji :heavy_check_mark: from "heavy_check_mark"<br> + @emoji heavy_division_sign @emoji :heavy_division_sign: from "heavy_division_sign"<br> + @emoji heavy_dollar_sign @emoji :heavy_dollar_sign: from "heavy_dollar_sign"<br> + @emoji heavy_exclamation_mark @emoji :heavy_exclamation_mark: from "heavy_exclamation_mark"<br> + @emoji heavy_heart_exclamation @emoji :heavy_heart_exclamation: from "heavy_heart_exclamation"<br> + @emoji heavy_minus_sign @emoji :heavy_minus_sign: from "heavy_minus_sign"<br> + @emoji heavy_multiplication_x @emoji :heavy_multiplication_x: from "heavy_multiplication_x"<br> + @emoji heavy_plus_sign @emoji :heavy_plus_sign: from "heavy_plus_sign"<br> + @emoji helicopter @emoji :helicopter: from "helicopter"<br> + @emoji herb @emoji :herb: from "herb"<br> + @emoji hibiscus @emoji :hibiscus: from "hibiscus"<br> + @emoji high_brightness @emoji :high_brightness: from "high_brightness"<br> + @emoji high_heel @emoji :high_heel: from "high_heel"<br> + @emoji hocho @emoji :hocho: from "hocho"<br> + @emoji hole @emoji :hole: from "hole"<br> + @emoji honduras @emoji :honduras: from "honduras"<br> + @emoji honey_pot @emoji :honey_pot: from "honey_pot"<br> + @emoji honeybee @emoji :honeybee: from "honeybee"<br> + @emoji hong_kong @emoji :hong_kong: from "hong_kong"<br> + @emoji horse @emoji :horse: from "horse"<br> + @emoji horse_racing @emoji :horse_racing: from "horse_racing"<br> + @emoji hospital @emoji :hospital: from "hospital"<br> + @emoji hot_pepper @emoji :hot_pepper: from "hot_pepper"<br> + @emoji hotdog @emoji :hotdog: from "hotdog"<br> + @emoji hotel @emoji :hotel: from "hotel"<br> + @emoji hotsprings @emoji :hotsprings: from "hotsprings"<br> + @emoji hourglass @emoji :hourglass: from "hourglass"<br> + @emoji hourglass_flowing_sand @emoji :hourglass_flowing_sand: from "hourglass_flowing_sand"<br> + @emoji house @emoji :house: from "house"<br> + @emoji house_with_garden @emoji :house_with_garden: from "house_with_garden"<br> + @emoji houses @emoji :houses: from "houses"<br> + @emoji hugs @emoji :hugs: from "hugs"<br> + @emoji hungary @emoji :hungary: from "hungary"<br> + @emoji hushed @emoji :hushed: from "hushed"<br> + @emoji ice_cream @emoji :ice_cream: from "ice_cream"<br> + @emoji ice_hockey @emoji :ice_hockey: from "ice_hockey"<br> + @emoji ice_skate @emoji :ice_skate: from "ice_skate"<br> + @emoji icecream @emoji :icecream: from "icecream"<br> + @emoji iceland @emoji :iceland: from "iceland"<br> + @emoji id @emoji :id: from "id"<br> + @emoji ideograph_advantage @emoji :ideograph_advantage: from "ideograph_advantage"<br> + @emoji imp @emoji :imp: from "imp"<br> + @emoji inbox_tray @emoji :inbox_tray: from "inbox_tray"<br> + @emoji incoming_envelope @emoji :incoming_envelope: from "incoming_envelope"<br> + @emoji india @emoji :india: from "india"<br> + @emoji indonesia @emoji :indonesia: from "indonesia"<br> + @emoji information_desk_person @emoji :information_desk_person: from "information_desk_person"<br> + @emoji information_source @emoji :information_source: from "information_source"<br> + @emoji innocent @emoji :innocent: from "innocent"<br> + @emoji interrobang @emoji :interrobang: from "interrobang"<br> + @emoji iphone @emoji :iphone: from "iphone"<br> + @emoji iran @emoji :iran: from "iran"<br> + @emoji iraq @emoji :iraq: from "iraq"<br> + @emoji ireland @emoji :ireland: from "ireland"<br> + @emoji isle_of_man @emoji :isle_of_man: from "isle_of_man"<br> + @emoji israel @emoji :israel: from "israel"<br> + @emoji it @emoji :it: from "it"<br> + @emoji izakaya_lantern @emoji :izakaya_lantern: from "izakaya_lantern"<br> + @emoji jack_o_lantern @emoji :jack_o_lantern: from "jack_o_lantern"<br> + @emoji jamaica @emoji :jamaica: from "jamaica"<br> + @emoji japan @emoji :japan: from "japan"<br> + @emoji japanese_castle @emoji :japanese_castle: from "japanese_castle"<br> + @emoji japanese_goblin @emoji :japanese_goblin: from "japanese_goblin"<br> + @emoji japanese_ogre @emoji :japanese_ogre: from "japanese_ogre"<br> + @emoji jeans @emoji :jeans: from "jeans"<br> + @emoji jersey @emoji :jersey: from "jersey"<br> + @emoji jordan @emoji :jordan: from "jordan"<br> + @emoji joy @emoji :joy: from "joy"<br> + @emoji joy_cat @emoji :joy_cat: from "joy_cat"<br> + @emoji joystick @emoji :joystick: from "joystick"<br> + @emoji jp @emoji :jp: from "jp"<br> + @emoji kaaba @emoji :kaaba: from "kaaba"<br> + @emoji kazakhstan @emoji :kazakhstan: from "kazakhstan"<br> + @emoji kenya @emoji :kenya: from "kenya"<br> + @emoji key @emoji :key: from "key"<br> + @emoji keyboard @emoji :keyboard: from "keyboard"<br> + @emoji keycap_ten @emoji :keycap_ten: from "keycap_ten"<br> + @emoji kick_scooter @emoji :kick_scooter: from "kick_scooter"<br> + @emoji kimono @emoji :kimono: from "kimono"<br> + @emoji kiribati @emoji :kiribati: from "kiribati"<br> + @emoji kiss @emoji :kiss: from "kiss"<br> + @emoji kissing @emoji :kissing: from "kissing"<br> + @emoji kissing_cat @emoji :kissing_cat: from "kissing_cat"<br> + @emoji kissing_closed_eyes @emoji :kissing_closed_eyes: from "kissing_closed_eyes"<br> + @emoji kissing_heart @emoji :kissing_heart: from "kissing_heart"<br> + @emoji kissing_smiling_eyes @emoji :kissing_smiling_eyes: from "kissing_smiling_eyes"<br> + @emoji kiwi_fruit @emoji :kiwi_fruit: from "kiwi_fruit"<br> + @emoji knife @emoji :knife: from "knife"<br> + @emoji koala @emoji :koala: from "koala"<br> + @emoji koko @emoji :koko: from "koko"<br> + @emoji kosovo @emoji :kosovo: from "kosovo"<br> + @emoji kr @emoji :kr: from "kr"<br> + @emoji kuwait @emoji :kuwait: from "kuwait"<br> + @emoji kyrgyzstan @emoji :kyrgyzstan: from "kyrgyzstan"<br> + @emoji label @emoji :label: from "label"<br> + @emoji lantern @emoji :lantern: from "lantern"<br> + @emoji laos @emoji :laos: from "laos"<br> + @emoji large_blue_circle @emoji :large_blue_circle: from "large_blue_circle"<br> + @emoji large_blue_diamond @emoji :large_blue_diamond: from "large_blue_diamond"<br> + @emoji large_orange_diamond @emoji :large_orange_diamond: from "large_orange_diamond"<br> + @emoji last_quarter_moon @emoji :last_quarter_moon: from "last_quarter_moon"<br> + @emoji last_quarter_moon_with_face @emoji :last_quarter_moon_with_face: from "last_quarter_moon_with_face"<br> + @emoji latin_cross @emoji :latin_cross: from "latin_cross"<br> + @emoji latvia @emoji :latvia: from "latvia"<br> + @emoji laughing @emoji :laughing: from "laughing"<br> + @emoji leaves @emoji :leaves: from "leaves"<br> + @emoji lebanon @emoji :lebanon: from "lebanon"<br> + @emoji ledger @emoji :ledger: from "ledger"<br> + @emoji left_luggage @emoji :left_luggage: from "left_luggage"<br> + @emoji left_right_arrow @emoji :left_right_arrow: from "left_right_arrow"<br> + @emoji leftwards_arrow_with_hook @emoji :leftwards_arrow_with_hook: from "leftwards_arrow_with_hook"<br> + @emoji lemon @emoji :lemon: from "lemon"<br> + @emoji leo @emoji :leo: from "leo"<br> + @emoji leopard @emoji :leopard: from "leopard"<br> + @emoji lesotho @emoji :lesotho: from "lesotho"<br> + @emoji level_slider @emoji :level_slider: from "level_slider"<br> + @emoji liberia @emoji :liberia: from "liberia"<br> + @emoji libra @emoji :libra: from "libra"<br> + @emoji libya @emoji :libya: from "libya"<br> + @emoji liechtenstein @emoji :liechtenstein: from "liechtenstein"<br> + @emoji light_rail @emoji :light_rail: from "light_rail"<br> + @emoji link @emoji :link: from "link"<br> + @emoji lion @emoji :lion: from "lion"<br> + @emoji lips @emoji :lips: from "lips"<br> + @emoji lipstick @emoji :lipstick: from "lipstick"<br> + @emoji lithuania @emoji :lithuania: from "lithuania"<br> + @emoji lizard @emoji :lizard: from "lizard"<br> + @emoji lock @emoji :lock: from "lock"<br> + @emoji lock_with_ink_pen @emoji :lock_with_ink_pen: from "lock_with_ink_pen"<br> + @emoji lollipop @emoji :lollipop: from "lollipop"<br> + @emoji loop @emoji :loop: from "loop"<br> + @emoji loud_sound @emoji :loud_sound: from "loud_sound"<br> + @emoji loudspeaker @emoji :loudspeaker: from "loudspeaker"<br> + @emoji love_hotel @emoji :love_hotel: from "love_hotel"<br> + @emoji love_letter @emoji :love_letter: from "love_letter"<br> + @emoji low_brightness @emoji :low_brightness: from "low_brightness"<br> + @emoji luxembourg @emoji :luxembourg: from "luxembourg"<br> + @emoji lying_face @emoji :lying_face: from "lying_face"<br> + @emoji m @emoji :m: from "m"<br> + @emoji macau @emoji :macau: from "macau"<br> + @emoji macedonia @emoji :macedonia: from "macedonia"<br> + @emoji madagascar @emoji :madagascar: from "madagascar"<br> + @emoji mag @emoji :mag: from "mag"<br> + @emoji mag_right @emoji :mag_right: from "mag_right"<br> + @emoji mahjong @emoji :mahjong: from "mahjong"<br> + @emoji mailbox @emoji :mailbox: from "mailbox"<br> + @emoji mailbox_closed @emoji :mailbox_closed: from "mailbox_closed"<br> + @emoji mailbox_with_mail @emoji :mailbox_with_mail: from "mailbox_with_mail"<br> + @emoji mailbox_with_no_mail @emoji :mailbox_with_no_mail: from "mailbox_with_no_mail"<br> + @emoji malawi @emoji :malawi: from "malawi"<br> + @emoji malaysia @emoji :malaysia: from "malaysia"<br> + @emoji maldives @emoji :maldives: from "maldives"<br> + @emoji male_detective @emoji :male_detective: from "male_detective"<br> + @emoji mali @emoji :mali: from "mali"<br> + @emoji malta @emoji :malta: from "malta"<br> + @emoji man @emoji :man: from "man"<br> + @emoji man_artist @emoji :man_artist: from "man_artist"<br> + @emoji man_astronaut @emoji :man_astronaut: from "man_astronaut"<br> + @emoji man_cartwheeling @emoji :man_cartwheeling: from "man_cartwheeling"<br> + @emoji man_cook @emoji :man_cook: from "man_cook"<br> + @emoji man_dancing @emoji :man_dancing: from "man_dancing"<br> + @emoji man_facepalming @emoji :man_facepalming: from "man_facepalming"<br> + @emoji man_factory_worker @emoji :man_factory_worker: from "man_factory_worker"<br> + @emoji man_farmer @emoji :man_farmer: from "man_farmer"<br> + @emoji man_firefighter @emoji :man_firefighter: from "man_firefighter"<br> + @emoji man_health_worker @emoji :man_health_worker: from "man_health_worker"<br> + @emoji man_in_tuxedo @emoji :man_in_tuxedo: from "man_in_tuxedo"<br> + @emoji man_judge @emoji :man_judge: from "man_judge"<br> + @emoji man_juggling @emoji :man_juggling: from "man_juggling"<br> + @emoji man_mechanic @emoji :man_mechanic: from "man_mechanic"<br> + @emoji man_office_worker @emoji :man_office_worker: from "man_office_worker"<br> + @emoji man_pilot @emoji :man_pilot: from "man_pilot"<br> + @emoji man_playing_handball @emoji :man_playing_handball: from "man_playing_handball"<br> + @emoji man_playing_water_polo @emoji :man_playing_water_polo: from "man_playing_water_polo"<br> + @emoji man_scientist @emoji :man_scientist: from "man_scientist"<br> + @emoji man_shrugging @emoji :man_shrugging: from "man_shrugging"<br> + @emoji man_singer @emoji :man_singer: from "man_singer"<br> + @emoji man_student @emoji :man_student: from "man_student"<br> + @emoji man_teacher @emoji :man_teacher: from "man_teacher"<br> + @emoji man_technologist @emoji :man_technologist: from "man_technologist"<br> + @emoji man_with_gua_pi_mao @emoji :man_with_gua_pi_mao: from "man_with_gua_pi_mao"<br> + @emoji man_with_turban @emoji :man_with_turban: from "man_with_turban"<br> + @emoji mandarin @emoji :mandarin: from "mandarin"<br> + @emoji mans_shoe @emoji :mans_shoe: from "mans_shoe"<br> + @emoji mantelpiece_clock @emoji :mantelpiece_clock: from "mantelpiece_clock"<br> + @emoji maple_leaf @emoji :maple_leaf: from "maple_leaf"<br> + @emoji marshall_islands @emoji :marshall_islands: from "marshall_islands"<br> + @emoji martial_arts_uniform @emoji :martial_arts_uniform: from "martial_arts_uniform"<br> + @emoji martinique @emoji :martinique: from "martinique"<br> + @emoji mask @emoji :mask: from "mask"<br> + @emoji massage @emoji :massage: from "massage"<br> + @emoji massage_man @emoji :massage_man: from "massage_man"<br> + @emoji massage_woman @emoji :massage_woman: from "massage_woman"<br> + @emoji mauritania @emoji :mauritania: from "mauritania"<br> + @emoji mauritius @emoji :mauritius: from "mauritius"<br> + @emoji mayotte @emoji :mayotte: from "mayotte"<br> + @emoji meat_on_bone @emoji :meat_on_bone: from "meat_on_bone"<br> + @emoji medal_military @emoji :medal_military: from "medal_military"<br> + @emoji medal_sports @emoji :medal_sports: from "medal_sports"<br> + @emoji mega @emoji :mega: from "mega"<br> + @emoji melon @emoji :melon: from "melon"<br> + @emoji memo @emoji :memo: from "memo"<br> + @emoji men_wrestling @emoji :men_wrestling: from "men_wrestling"<br> + @emoji menorah @emoji :menorah: from "menorah"<br> + @emoji mens @emoji :mens: from "mens"<br> + @emoji metal @emoji :metal: from "metal"<br> + @emoji metro @emoji :metro: from "metro"<br> + @emoji mexico @emoji :mexico: from "mexico"<br> + @emoji micronesia @emoji :micronesia: from "micronesia"<br> + @emoji microphone @emoji :microphone: from "microphone"<br> + @emoji microscope @emoji :microscope: from "microscope"<br> + @emoji middle_finger @emoji :middle_finger: from "middle_finger"<br> + @emoji milk_glass @emoji :milk_glass: from "milk_glass"<br> + @emoji milky_way @emoji :milky_way: from "milky_way"<br> + @emoji minibus @emoji :minibus: from "minibus"<br> + @emoji minidisc @emoji :minidisc: from "minidisc"<br> + @emoji mobile_phone_off @emoji :mobile_phone_off: from "mobile_phone_off"<br> + @emoji moldova @emoji :moldova: from "moldova"<br> + @emoji monaco @emoji :monaco: from "monaco"<br> + @emoji money_mouth_face @emoji :money_mouth_face: from "money_mouth_face"<br> + @emoji money_with_wings @emoji :money_with_wings: from "money_with_wings"<br> + @emoji moneybag @emoji :moneybag: from "moneybag"<br> + @emoji mongolia @emoji :mongolia: from "mongolia"<br> + @emoji monkey @emoji :monkey: from "monkey"<br> + @emoji monkey_face @emoji :monkey_face: from "monkey_face"<br> + @emoji monorail @emoji :monorail: from "monorail"<br> + @emoji montenegro @emoji :montenegro: from "montenegro"<br> + @emoji montserrat @emoji :montserrat: from "montserrat"<br> + @emoji moon @emoji :moon: from "moon"<br> + @emoji morocco @emoji :morocco: from "morocco"<br> + @emoji mortar_board @emoji :mortar_board: from "mortar_board"<br> + @emoji mosque @emoji :mosque: from "mosque"<br> + @emoji motor_boat @emoji :motor_boat: from "motor_boat"<br> + @emoji motor_scooter @emoji :motor_scooter: from "motor_scooter"<br> + @emoji motorcycle @emoji :motorcycle: from "motorcycle"<br> + @emoji motorway @emoji :motorway: from "motorway"<br> + @emoji mount_fuji @emoji :mount_fuji: from "mount_fuji"<br> + @emoji mountain @emoji :mountain: from "mountain"<br> + @emoji mountain_bicyclist @emoji :mountain_bicyclist: from "mountain_bicyclist"<br> + @emoji mountain_biking_man @emoji :mountain_biking_man: from "mountain_biking_man"<br> + @emoji mountain_biking_woman @emoji :mountain_biking_woman: from "mountain_biking_woman"<br> + @emoji mountain_cableway @emoji :mountain_cableway: from "mountain_cableway"<br> + @emoji mountain_railway @emoji :mountain_railway: from "mountain_railway"<br> + @emoji mountain_snow @emoji :mountain_snow: from "mountain_snow"<br> + @emoji mouse @emoji :mouse: from "mouse"<br> + @emoji mouse2 @emoji :mouse2: from "mouse2"<br> + @emoji movie_camera @emoji :movie_camera: from "movie_camera"<br> + @emoji moyai @emoji :moyai: from "moyai"<br> + @emoji mozambique @emoji :mozambique: from "mozambique"<br> + @emoji mrs_claus @emoji :mrs_claus: from "mrs_claus"<br> + @emoji muscle @emoji :muscle: from "muscle"<br> + @emoji mushroom @emoji :mushroom: from "mushroom"<br> + @emoji musical_keyboard @emoji :musical_keyboard: from "musical_keyboard"<br> + @emoji musical_note @emoji :musical_note: from "musical_note"<br> + @emoji musical_score @emoji :musical_score: from "musical_score"<br> + @emoji mute @emoji :mute: from "mute"<br> + @emoji myanmar @emoji :myanmar: from "myanmar"<br> + @emoji nail_care @emoji :nail_care: from "nail_care"<br> + @emoji name_badge @emoji :name_badge: from "name_badge"<br> + @emoji namibia @emoji :namibia: from "namibia"<br> + @emoji national_park @emoji :national_park: from "national_park"<br> + @emoji nauru @emoji :nauru: from "nauru"<br> + @emoji nauseated_face @emoji :nauseated_face: from "nauseated_face"<br> + @emoji necktie @emoji :necktie: from "necktie"<br> + @emoji negative_squared_cross_mark @emoji :negative_squared_cross_mark: from "negative_squared_cross_mark"<br> + @emoji nepal @emoji :nepal: from "nepal"<br> + @emoji nerd_face @emoji :nerd_face: from "nerd_face"<br> + @emoji netherlands @emoji :netherlands: from "netherlands"<br> + @emoji neutral_face @emoji :neutral_face: from "neutral_face"<br> + @emoji new @emoji :new: from "new"<br> + @emoji new_caledonia @emoji :new_caledonia: from "new_caledonia"<br> + @emoji new_moon @emoji :new_moon: from "new_moon"<br> + @emoji new_moon_with_face @emoji :new_moon_with_face: from "new_moon_with_face"<br> + @emoji new_zealand @emoji :new_zealand: from "new_zealand"<br> + @emoji newspaper @emoji :newspaper: from "newspaper"<br> + @emoji newspaper_roll @emoji :newspaper_roll: from "newspaper_roll"<br> + @emoji next_track_button @emoji :next_track_button: from "next_track_button"<br> + @emoji ng @emoji :ng: from "ng"<br> + @emoji ng_man @emoji :ng_man: from "ng_man"<br> + @emoji ng_woman @emoji :ng_woman: from "ng_woman"<br> + @emoji nicaragua @emoji :nicaragua: from "nicaragua"<br> + @emoji niger @emoji :niger: from "niger"<br> + @emoji nigeria @emoji :nigeria: from "nigeria"<br> + @emoji night_with_stars @emoji :night_with_stars: from "night_with_stars"<br> + @emoji nine @emoji :nine: from "nine"<br> + @emoji niue @emoji :niue: from "niue"<br> + @emoji no_bell @emoji :no_bell: from "no_bell"<br> + @emoji no_bicycles @emoji :no_bicycles: from "no_bicycles"<br> + @emoji no_entry @emoji :no_entry: from "no_entry"<br> + @emoji no_entry_sign @emoji :no_entry_sign: from "no_entry_sign"<br> + @emoji no_good @emoji :no_good: from "no_good"<br> + @emoji no_good_man @emoji :no_good_man: from "no_good_man"<br> + @emoji no_good_woman @emoji :no_good_woman: from "no_good_woman"<br> + @emoji no_mobile_phones @emoji :no_mobile_phones: from "no_mobile_phones"<br> + @emoji no_mouth @emoji :no_mouth: from "no_mouth"<br> + @emoji no_pedestrians @emoji :no_pedestrians: from "no_pedestrians"<br> + @emoji no_smoking @emoji :no_smoking: from "no_smoking"<br> + @emoji non-potable_water @emoji :non-potable_water: from "non-potable_water"<br> + @emoji norfolk_island @emoji :norfolk_island: from "norfolk_island"<br> + @emoji north_korea @emoji :north_korea: from "north_korea"<br> + @emoji northern_mariana_islands @emoji :northern_mariana_islands: from "northern_mariana_islands"<br> + @emoji norway @emoji :norway: from "norway"<br> + @emoji nose @emoji :nose: from "nose"<br> + @emoji notebook @emoji :notebook: from "notebook"<br> + @emoji notebook_with_decorative_cover @emoji :notebook_with_decorative_cover: from "notebook_with_decorative_cover"<br> + @emoji notes @emoji :notes: from "notes"<br> + @emoji nut_and_bolt @emoji :nut_and_bolt: from "nut_and_bolt"<br> + @emoji o @emoji :o: from "o"<br> + @emoji o2 @emoji :o2: from "o2"<br> + @emoji ocean @emoji :ocean: from "ocean"<br> + @emoji octopus @emoji :octopus: from "octopus"<br> + @emoji oden @emoji :oden: from "oden"<br> + @emoji office @emoji :office: from "office"<br> + @emoji oil_drum @emoji :oil_drum: from "oil_drum"<br> + @emoji ok @emoji :ok: from "ok"<br> + @emoji ok_hand @emoji :ok_hand: from "ok_hand"<br> + @emoji ok_man @emoji :ok_man: from "ok_man"<br> + @emoji ok_woman @emoji :ok_woman: from "ok_woman"<br> + @emoji old_key @emoji :old_key: from "old_key"<br> + @emoji older_man @emoji :older_man: from "older_man"<br> + @emoji older_woman @emoji :older_woman: from "older_woman"<br> + @emoji om @emoji :om: from "om"<br> + @emoji oman @emoji :oman: from "oman"<br> + @emoji on @emoji :on: from "on"<br> + @emoji oncoming_automobile @emoji :oncoming_automobile: from "oncoming_automobile"<br> + @emoji oncoming_bus @emoji :oncoming_bus: from "oncoming_bus"<br> + @emoji oncoming_police_car @emoji :oncoming_police_car: from "oncoming_police_car"<br> + @emoji oncoming_taxi @emoji :oncoming_taxi: from "oncoming_taxi"<br> + @emoji one @emoji :one: from "one"<br> + @emoji open_book @emoji :open_book: from "open_book"<br> + @emoji open_file_folder @emoji :open_file_folder: from "open_file_folder"<br> + @emoji open_hands @emoji :open_hands: from "open_hands"<br> + @emoji open_mouth @emoji :open_mouth: from "open_mouth"<br> + @emoji open_umbrella @emoji :open_umbrella: from "open_umbrella"<br> + @emoji ophiuchus @emoji :ophiuchus: from "ophiuchus"<br> + @emoji orange @emoji :orange: from "orange"<br> + @emoji orange_book @emoji :orange_book: from "orange_book"<br> + @emoji orthodox_cross @emoji :orthodox_cross: from "orthodox_cross"<br> + @emoji outbox_tray @emoji :outbox_tray: from "outbox_tray"<br> + @emoji owl @emoji :owl: from "owl"<br> + @emoji ox @emoji :ox: from "ox"<br> + @emoji package @emoji :package: from "package"<br> + @emoji page_facing_up @emoji :page_facing_up: from "page_facing_up"<br> + @emoji page_with_curl @emoji :page_with_curl: from "page_with_curl"<br> + @emoji pager @emoji :pager: from "pager"<br> + @emoji paintbrush @emoji :paintbrush: from "paintbrush"<br> + @emoji pakistan @emoji :pakistan: from "pakistan"<br> + @emoji palau @emoji :palau: from "palau"<br> + @emoji palestinian_territories @emoji :palestinian_territories: from "palestinian_territories"<br> + @emoji palm_tree @emoji :palm_tree: from "palm_tree"<br> + @emoji panama @emoji :panama: from "panama"<br> + @emoji pancakes @emoji :pancakes: from "pancakes"<br> + @emoji panda_face @emoji :panda_face: from "panda_face"<br> + @emoji paperclip @emoji :paperclip: from "paperclip"<br> + @emoji paperclips @emoji :paperclips: from "paperclips"<br> + @emoji papua_new_guinea @emoji :papua_new_guinea: from "papua_new_guinea"<br> + @emoji paraguay @emoji :paraguay: from "paraguay"<br> + @emoji parasol_on_ground @emoji :parasol_on_ground: from "parasol_on_ground"<br> + @emoji parking @emoji :parking: from "parking"<br> + @emoji part_alternation_mark @emoji :part_alternation_mark: from "part_alternation_mark"<br> + @emoji partly_sunny @emoji :partly_sunny: from "partly_sunny"<br> + @emoji passenger_ship @emoji :passenger_ship: from "passenger_ship"<br> + @emoji passport_control @emoji :passport_control: from "passport_control"<br> + @emoji pause_button @emoji :pause_button: from "pause_button"<br> + @emoji paw_prints @emoji :paw_prints: from "paw_prints"<br> + @emoji peace_symbol @emoji :peace_symbol: from "peace_symbol"<br> + @emoji peach @emoji :peach: from "peach"<br> + @emoji peanuts @emoji :peanuts: from "peanuts"<br> + @emoji pear @emoji :pear: from "pear"<br> + @emoji pen @emoji :pen: from "pen"<br> + @emoji pencil @emoji :pencil: from "pencil"<br> + @emoji pencil2 @emoji :pencil2: from "pencil2"<br> + @emoji penguin @emoji :penguin: from "penguin"<br> + @emoji pensive @emoji :pensive: from "pensive"<br> + @emoji performing_arts @emoji :performing_arts: from "performing_arts"<br> + @emoji persevere @emoji :persevere: from "persevere"<br> + @emoji person_fencing @emoji :person_fencing: from "person_fencing"<br> + @emoji person_frowning @emoji :person_frowning: from "person_frowning"<br> + @emoji person_with_blond_hair @emoji :person_with_blond_hair: from "person_with_blond_hair"<br> + @emoji person_with_pouting_face @emoji :person_with_pouting_face: from "person_with_pouting_face"<br> + @emoji peru @emoji :peru: from "peru"<br> + @emoji philippines @emoji :philippines: from "philippines"<br> + @emoji phone @emoji :phone: from "phone"<br> + @emoji pick @emoji :pick: from "pick"<br> + @emoji pig @emoji :pig: from "pig"<br> + @emoji pig2 @emoji :pig2: from "pig2"<br> + @emoji pig_nose @emoji :pig_nose: from "pig_nose"<br> + @emoji pill @emoji :pill: from "pill"<br> + @emoji pineapple @emoji :pineapple: from "pineapple"<br> + @emoji ping_pong @emoji :ping_pong: from "ping_pong"<br> + @emoji pisces @emoji :pisces: from "pisces"<br> + @emoji pitcairn_islands @emoji :pitcairn_islands: from "pitcairn_islands"<br> + @emoji pizza @emoji :pizza: from "pizza"<br> + @emoji place_of_worship @emoji :place_of_worship: from "place_of_worship"<br> + @emoji plate_with_cutlery @emoji :plate_with_cutlery: from "plate_with_cutlery"<br> + @emoji play_or_pause_button @emoji :play_or_pause_button: from "play_or_pause_button"<br> + @emoji point_down @emoji :point_down: from "point_down"<br> + @emoji point_left @emoji :point_left: from "point_left"<br> + @emoji point_right @emoji :point_right: from "point_right"<br> + @emoji point_up @emoji :point_up: from "point_up"<br> + @emoji point_up_2 @emoji :point_up_2: from "point_up_2"<br> + @emoji poland @emoji :poland: from "poland"<br> + @emoji police_car @emoji :police_car: from "police_car"<br> + @emoji policeman @emoji :policeman: from "policeman"<br> + @emoji policewoman @emoji :policewoman: from "policewoman"<br> + @emoji poodle @emoji :poodle: from "poodle"<br> + @emoji poop @emoji :poop: from "poop"<br> + @emoji popcorn @emoji :popcorn: from "popcorn"<br> + @emoji portugal @emoji :portugal: from "portugal"<br> + @emoji post_office @emoji :post_office: from "post_office"<br> + @emoji postal_horn @emoji :postal_horn: from "postal_horn"<br> + @emoji postbox @emoji :postbox: from "postbox"<br> + @emoji potable_water @emoji :potable_water: from "potable_water"<br> + @emoji potato @emoji :potato: from "potato"<br> + @emoji pouch @emoji :pouch: from "pouch"<br> + @emoji poultry_leg @emoji :poultry_leg: from "poultry_leg"<br> + @emoji pound @emoji :pound: from "pound"<br> + @emoji pout @emoji :pout: from "pout"<br> + @emoji pouting_cat @emoji :pouting_cat: from "pouting_cat"<br> + @emoji pouting_man @emoji :pouting_man: from "pouting_man"<br> + @emoji pouting_woman @emoji :pouting_woman: from "pouting_woman"<br> + @emoji pray @emoji :pray: from "pray"<br> + @emoji prayer_beads @emoji :prayer_beads: from "prayer_beads"<br> + @emoji pregnant_woman @emoji :pregnant_woman: from "pregnant_woman"<br> + @emoji previous_track_button @emoji :previous_track_button: from "previous_track_button"<br> + @emoji prince @emoji :prince: from "prince"<br> + @emoji princess @emoji :princess: from "princess"<br> + @emoji printer @emoji :printer: from "printer"<br> + @emoji puerto_rico @emoji :puerto_rico: from "puerto_rico"<br> + @emoji punch @emoji :punch: from "punch"<br> + @emoji purple_heart @emoji :purple_heart: from "purple_heart"<br> + @emoji purse @emoji :purse: from "purse"<br> + @emoji pushpin @emoji :pushpin: from "pushpin"<br> + @emoji put_litter_in_its_place @emoji :put_litter_in_its_place: from "put_litter_in_its_place"<br> + @emoji qatar @emoji :qatar: from "qatar"<br> + @emoji question @emoji :question: from "question"<br> + @emoji rabbit @emoji :rabbit: from "rabbit"<br> + @emoji rabbit2 @emoji :rabbit2: from "rabbit2"<br> + @emoji racehorse @emoji :racehorse: from "racehorse"<br> + @emoji racing_car @emoji :racing_car: from "racing_car"<br> + @emoji radio @emoji :radio: from "radio"<br> + @emoji radio_button @emoji :radio_button: from "radio_button"<br> + @emoji radioactive @emoji :radioactive: from "radioactive"<br> + @emoji rage @emoji :rage: from "rage"<br> + @emoji railway_car @emoji :railway_car: from "railway_car"<br> + @emoji railway_track @emoji :railway_track: from "railway_track"<br> + @emoji rainbow @emoji :rainbow: from "rainbow"<br> + @emoji rainbow_flag @emoji :rainbow_flag: from "rainbow_flag"<br> + @emoji raised_back_of_hand @emoji :raised_back_of_hand: from "raised_back_of_hand"<br> + @emoji raised_hand @emoji :raised_hand: from "raised_hand"<br> + @emoji raised_hand_with_fingers_splayed @emoji :raised_hand_with_fingers_splayed: from "raised_hand_with_fingers_splayed"<br> + @emoji raised_hands @emoji :raised_hands: from "raised_hands"<br> + @emoji raising_hand @emoji :raising_hand: from "raising_hand"<br> + @emoji raising_hand_man @emoji :raising_hand_man: from "raising_hand_man"<br> + @emoji raising_hand_woman @emoji :raising_hand_woman: from "raising_hand_woman"<br> + @emoji ram @emoji :ram: from "ram"<br> + @emoji ramen @emoji :ramen: from "ramen"<br> + @emoji rat @emoji :rat: from "rat"<br> + @emoji record_button @emoji :record_button: from "record_button"<br> + @emoji recycle @emoji :recycle: from "recycle"<br> + @emoji red_car @emoji :red_car: from "red_car"<br> + @emoji red_circle @emoji :red_circle: from "red_circle"<br> + @emoji registered @emoji :registered: from "registered"<br> + @emoji relaxed @emoji :relaxed: from "relaxed"<br> + @emoji relieved @emoji :relieved: from "relieved"<br> + @emoji reminder_ribbon @emoji :reminder_ribbon: from "reminder_ribbon"<br> + @emoji repeat @emoji :repeat: from "repeat"<br> + @emoji repeat_one @emoji :repeat_one: from "repeat_one"<br> + @emoji rescue_worker_helmet @emoji :rescue_worker_helmet: from "rescue_worker_helmet"<br> + @emoji restroom @emoji :restroom: from "restroom"<br> + @emoji reunion @emoji :reunion: from "reunion"<br> + @emoji revolving_hearts @emoji :revolving_hearts: from "revolving_hearts"<br> + @emoji rewind @emoji :rewind: from "rewind"<br> + @emoji rhinoceros @emoji :rhinoceros: from "rhinoceros"<br> + @emoji ribbon @emoji :ribbon: from "ribbon"<br> + @emoji rice @emoji :rice: from "rice"<br> + @emoji rice_ball @emoji :rice_ball: from "rice_ball"<br> + @emoji rice_cracker @emoji :rice_cracker: from "rice_cracker"<br> + @emoji rice_scene @emoji :rice_scene: from "rice_scene"<br> + @emoji right_anger_bubble @emoji :right_anger_bubble: from "right_anger_bubble"<br> + @emoji ring @emoji :ring: from "ring"<br> + @emoji robot @emoji :robot: from "robot"<br> + @emoji rocket @emoji :rocket: from "rocket"<br> + @emoji rofl @emoji :rofl: from "rofl"<br> + @emoji roll_eyes @emoji :roll_eyes: from "roll_eyes"<br> + @emoji roller_coaster @emoji :roller_coaster: from "roller_coaster"<br> + @emoji romania @emoji :romania: from "romania"<br> + @emoji rooster @emoji :rooster: from "rooster"<br> + @emoji rose @emoji :rose: from "rose"<br> + @emoji rosette @emoji :rosette: from "rosette"<br> + @emoji rotating_light @emoji :rotating_light: from "rotating_light"<br> + @emoji round_pushpin @emoji :round_pushpin: from "round_pushpin"<br> + @emoji rowboat @emoji :rowboat: from "rowboat"<br> + @emoji rowing_man @emoji :rowing_man: from "rowing_man"<br> + @emoji rowing_woman @emoji :rowing_woman: from "rowing_woman"<br> + @emoji ru @emoji :ru: from "ru"<br> + @emoji rugby_football @emoji :rugby_football: from "rugby_football"<br> + @emoji runner @emoji :runner: from "runner"<br> + @emoji running @emoji :running: from "running"<br> + @emoji running_man @emoji :running_man: from "running_man"<br> + @emoji running_shirt_with_sash @emoji :running_shirt_with_sash: from "running_shirt_with_sash"<br> + @emoji running_woman @emoji :running_woman: from "running_woman"<br> + @emoji rwanda @emoji :rwanda: from "rwanda"<br> + @emoji sa @emoji :sa: from "sa"<br> + @emoji sagittarius @emoji :sagittarius: from "sagittarius"<br> + @emoji sailboat @emoji :sailboat: from "sailboat"<br> + @emoji sake @emoji :sake: from "sake"<br> + @emoji samoa @emoji :samoa: from "samoa"<br> + @emoji san_marino @emoji :san_marino: from "san_marino"<br> + @emoji sandal @emoji :sandal: from "sandal"<br> + @emoji santa @emoji :santa: from "santa"<br> + @emoji sao_tome_principe @emoji :sao_tome_principe: from "sao_tome_principe"<br> + @emoji satellite @emoji :satellite: from "satellite"<br> + @emoji satisfied @emoji :satisfied: from "satisfied"<br> + @emoji saudi_arabia @emoji :saudi_arabia: from "saudi_arabia"<br> + @emoji saxophone @emoji :saxophone: from "saxophone"<br> + @emoji school @emoji :school: from "school"<br> + @emoji school_satchel @emoji :school_satchel: from "school_satchel"<br> + @emoji scissors @emoji :scissors: from "scissors"<br> + @emoji scorpion @emoji :scorpion: from "scorpion"<br> + @emoji scorpius @emoji :scorpius: from "scorpius"<br> + @emoji scream @emoji :scream: from "scream"<br> + @emoji scream_cat @emoji :scream_cat: from "scream_cat"<br> + @emoji scroll @emoji :scroll: from "scroll"<br> + @emoji seat @emoji :seat: from "seat"<br> + @emoji secret @emoji :secret: from "secret"<br> + @emoji see_no_evil @emoji :see_no_evil: from "see_no_evil"<br> + @emoji seedling @emoji :seedling: from "seedling"<br> + @emoji selfie @emoji :selfie: from "selfie"<br> + @emoji senegal @emoji :senegal: from "senegal"<br> + @emoji serbia @emoji :serbia: from "serbia"<br> + @emoji seven @emoji :seven: from "seven"<br> + @emoji seychelles @emoji :seychelles: from "seychelles"<br> + @emoji shallow_pan_of_food @emoji :shallow_pan_of_food: from "shallow_pan_of_food"<br> + @emoji shamrock @emoji :shamrock: from "shamrock"<br> + @emoji shark @emoji :shark: from "shark"<br> + @emoji shaved_ice @emoji :shaved_ice: from "shaved_ice"<br> + @emoji sheep @emoji :sheep: from "sheep"<br> + @emoji shell @emoji :shell: from "shell"<br> + @emoji shield @emoji :shield: from "shield"<br> + @emoji shinto_shrine @emoji :shinto_shrine: from "shinto_shrine"<br> + @emoji ship @emoji :ship: from "ship"<br> + @emoji shirt @emoji :shirt: from "shirt"<br> + @emoji shit @emoji :shit: from "shit"<br> + @emoji shoe @emoji :shoe: from "shoe"<br> + @emoji shopping @emoji :shopping: from "shopping"<br> + @emoji shopping_cart @emoji :shopping_cart: from "shopping_cart"<br> + @emoji shower @emoji :shower: from "shower"<br> + @emoji shrimp @emoji :shrimp: from "shrimp"<br> + @emoji sierra_leone @emoji :sierra_leone: from "sierra_leone"<br> + @emoji signal_strength @emoji :signal_strength: from "signal_strength"<br> + @emoji singapore @emoji :singapore: from "singapore"<br> + @emoji sint_maarten @emoji :sint_maarten: from "sint_maarten"<br> + @emoji six @emoji :six: from "six"<br> + @emoji six_pointed_star @emoji :six_pointed_star: from "six_pointed_star"<br> + @emoji ski @emoji :ski: from "ski"<br> + @emoji skier @emoji :skier: from "skier"<br> + @emoji skull @emoji :skull: from "skull"<br> + @emoji skull_and_crossbones @emoji :skull_and_crossbones: from "skull_and_crossbones"<br> + @emoji sleeping @emoji :sleeping: from "sleeping"<br> + @emoji sleeping_bed @emoji :sleeping_bed: from "sleeping_bed"<br> + @emoji sleepy @emoji :sleepy: from "sleepy"<br> + @emoji slightly_frowning_face @emoji :slightly_frowning_face: from "slightly_frowning_face"<br> + @emoji slightly_smiling_face @emoji :slightly_smiling_face: from "slightly_smiling_face"<br> + @emoji slot_machine @emoji :slot_machine: from "slot_machine"<br> + @emoji slovakia @emoji :slovakia: from "slovakia"<br> + @emoji slovenia @emoji :slovenia: from "slovenia"<br> + @emoji small_airplane @emoji :small_airplane: from "small_airplane"<br> + @emoji small_blue_diamond @emoji :small_blue_diamond: from "small_blue_diamond"<br> + @emoji small_orange_diamond @emoji :small_orange_diamond: from "small_orange_diamond"<br> + @emoji small_red_triangle @emoji :small_red_triangle: from "small_red_triangle"<br> + @emoji small_red_triangle_down @emoji :small_red_triangle_down: from "small_red_triangle_down"<br> + @emoji smile @emoji :smile: from "smile"<br> + @emoji smile_cat @emoji :smile_cat: from "smile_cat"<br> + @emoji smiley @emoji :smiley: from "smiley"<br> + @emoji smiley_cat @emoji :smiley_cat: from "smiley_cat"<br> + @emoji smiling_imp @emoji :smiling_imp: from "smiling_imp"<br> + @emoji smirk @emoji :smirk: from "smirk"<br> + @emoji smirk_cat @emoji :smirk_cat: from "smirk_cat"<br> + @emoji smoking @emoji :smoking: from "smoking"<br> + @emoji snail @emoji :snail: from "snail"<br> + @emoji snake @emoji :snake: from "snake"<br> + @emoji sneezing_face @emoji :sneezing_face: from "sneezing_face"<br> + @emoji snowboarder @emoji :snowboarder: from "snowboarder"<br> + @emoji snowflake @emoji :snowflake: from "snowflake"<br> + @emoji snowman @emoji :snowman: from "snowman"<br> + @emoji snowman_with_snow @emoji :snowman_with_snow: from "snowman_with_snow"<br> + @emoji sob @emoji :sob: from "sob"<br> + @emoji soccer @emoji :soccer: from "soccer"<br> + @emoji solomon_islands @emoji :solomon_islands: from "solomon_islands"<br> + @emoji somalia @emoji :somalia: from "somalia"<br> + @emoji soon @emoji :soon: from "soon"<br> + @emoji sos @emoji :sos: from "sos"<br> + @emoji sound @emoji :sound: from "sound"<br> + @emoji south_africa @emoji :south_africa: from "south_africa"<br> + @emoji south_georgia_south_sandwich_islands @emoji :south_georgia_south_sandwich_islands: from "south_georgia_south_sandwich_islands"<br> + @emoji south_sudan @emoji :south_sudan: from "south_sudan"<br> + @emoji space_invader @emoji :space_invader: from "space_invader"<br> + @emoji spades @emoji :spades: from "spades"<br> + @emoji spaghetti @emoji :spaghetti: from "spaghetti"<br> + @emoji sparkle @emoji :sparkle: from "sparkle"<br> + @emoji sparkler @emoji :sparkler: from "sparkler"<br> + @emoji sparkles @emoji :sparkles: from "sparkles"<br> + @emoji sparkling_heart @emoji :sparkling_heart: from "sparkling_heart"<br> + @emoji speak_no_evil @emoji :speak_no_evil: from "speak_no_evil"<br> + @emoji speaker @emoji :speaker: from "speaker"<br> + @emoji speaking_head @emoji :speaking_head: from "speaking_head"<br> + @emoji speech_balloon @emoji :speech_balloon: from "speech_balloon"<br> + @emoji speedboat @emoji :speedboat: from "speedboat"<br> + @emoji spider @emoji :spider: from "spider"<br> + @emoji spider_web @emoji :spider_web: from "spider_web"<br> + @emoji spiral_calendar @emoji :spiral_calendar: from "spiral_calendar"<br> + @emoji spiral_notepad @emoji :spiral_notepad: from "spiral_notepad"<br> + @emoji spoon @emoji :spoon: from "spoon"<br> + @emoji squid @emoji :squid: from "squid"<br> + @emoji sri_lanka @emoji :sri_lanka: from "sri_lanka"<br> + @emoji st_barthelemy @emoji :st_barthelemy: from "st_barthelemy"<br> + @emoji st_helena @emoji :st_helena: from "st_helena"<br> + @emoji st_kitts_nevis @emoji :st_kitts_nevis: from "st_kitts_nevis"<br> + @emoji st_lucia @emoji :st_lucia: from "st_lucia"<br> + @emoji st_pierre_miquelon @emoji :st_pierre_miquelon: from "st_pierre_miquelon"<br> + @emoji st_vincent_grenadines @emoji :st_vincent_grenadines: from "st_vincent_grenadines"<br> + @emoji stadium @emoji :stadium: from "stadium"<br> + @emoji star @emoji :star: from "star"<br> + @emoji star2 @emoji :star2: from "star2"<br> + @emoji star_and_crescent @emoji :star_and_crescent: from "star_and_crescent"<br> + @emoji star_of_david @emoji :star_of_david: from "star_of_david"<br> + @emoji stars @emoji :stars: from "stars"<br> + @emoji station @emoji :station: from "station"<br> + @emoji statue_of_liberty @emoji :statue_of_liberty: from "statue_of_liberty"<br> + @emoji steam_locomotive @emoji :steam_locomotive: from "steam_locomotive"<br> + @emoji stew @emoji :stew: from "stew"<br> + @emoji stop_button @emoji :stop_button: from "stop_button"<br> + @emoji stop_sign @emoji :stop_sign: from "stop_sign"<br> + @emoji stopwatch @emoji :stopwatch: from "stopwatch"<br> + @emoji straight_ruler @emoji :straight_ruler: from "straight_ruler"<br> + @emoji strawberry @emoji :strawberry: from "strawberry"<br> + @emoji stuck_out_tongue @emoji :stuck_out_tongue: from "stuck_out_tongue"<br> + @emoji stuck_out_tongue_closed_eyes @emoji :stuck_out_tongue_closed_eyes: from "stuck_out_tongue_closed_eyes"<br> + @emoji stuck_out_tongue_winking_eye @emoji :stuck_out_tongue_winking_eye: from "stuck_out_tongue_winking_eye"<br> + @emoji studio_microphone @emoji :studio_microphone: from "studio_microphone"<br> + @emoji stuffed_flatbread @emoji :stuffed_flatbread: from "stuffed_flatbread"<br> + @emoji sudan @emoji :sudan: from "sudan"<br> + @emoji sun_behind_large_cloud @emoji :sun_behind_large_cloud: from "sun_behind_large_cloud"<br> + @emoji sun_behind_rain_cloud @emoji :sun_behind_rain_cloud: from "sun_behind_rain_cloud"<br> + @emoji sun_behind_small_cloud @emoji :sun_behind_small_cloud: from "sun_behind_small_cloud"<br> + @emoji sun_with_face @emoji :sun_with_face: from "sun_with_face"<br> + @emoji sunflower @emoji :sunflower: from "sunflower"<br> + @emoji sunglasses @emoji :sunglasses: from "sunglasses"<br> + @emoji sunny @emoji :sunny: from "sunny"<br> + @emoji sunrise @emoji :sunrise: from "sunrise"<br> + @emoji sunrise_over_mountains @emoji :sunrise_over_mountains: from "sunrise_over_mountains"<br> + @emoji surfer @emoji :surfer: from "surfer"<br> + @emoji surfing_man @emoji :surfing_man: from "surfing_man"<br> + @emoji surfing_woman @emoji :surfing_woman: from "surfing_woman"<br> + @emoji suriname @emoji :suriname: from "suriname"<br> + @emoji sushi @emoji :sushi: from "sushi"<br> + @emoji suspension_railway @emoji :suspension_railway: from "suspension_railway"<br> + @emoji swaziland @emoji :swaziland: from "swaziland"<br> + @emoji sweat @emoji :sweat: from "sweat"<br> + @emoji sweat_drops @emoji :sweat_drops: from "sweat_drops"<br> + @emoji sweat_smile @emoji :sweat_smile: from "sweat_smile"<br> + @emoji sweden @emoji :sweden: from "sweden"<br> + @emoji sweet_potato @emoji :sweet_potato: from "sweet_potato"<br> + @emoji swimmer @emoji :swimmer: from "swimmer"<br> + @emoji swimming_man @emoji :swimming_man: from "swimming_man"<br> + @emoji swimming_woman @emoji :swimming_woman: from "swimming_woman"<br> + @emoji switzerland @emoji :switzerland: from "switzerland"<br> + @emoji symbols @emoji :symbols: from "symbols"<br> + @emoji synagogue @emoji :synagogue: from "synagogue"<br> + @emoji syria @emoji :syria: from "syria"<br> + @emoji syringe @emoji :syringe: from "syringe"<br> + @emoji taco @emoji :taco: from "taco"<br> + @emoji tada @emoji :tada: from "tada"<br> + @emoji taiwan @emoji :taiwan: from "taiwan"<br> + @emoji tajikistan @emoji :tajikistan: from "tajikistan"<br> + @emoji tanabata_tree @emoji :tanabata_tree: from "tanabata_tree"<br> + @emoji tangerine @emoji :tangerine: from "tangerine"<br> + @emoji tanzania @emoji :tanzania: from "tanzania"<br> + @emoji taurus @emoji :taurus: from "taurus"<br> + @emoji taxi @emoji :taxi: from "taxi"<br> + @emoji tea @emoji :tea: from "tea"<br> + @emoji telephone @emoji :telephone: from "telephone"<br> + @emoji telephone_receiver @emoji :telephone_receiver: from "telephone_receiver"<br> + @emoji telescope @emoji :telescope: from "telescope"<br> + @emoji tennis @emoji :tennis: from "tennis"<br> + @emoji tent @emoji :tent: from "tent"<br> + @emoji thailand @emoji :thailand: from "thailand"<br> + @emoji thermometer @emoji :thermometer: from "thermometer"<br> + @emoji thinking @emoji :thinking: from "thinking"<br> + @emoji thought_balloon @emoji :thought_balloon: from "thought_balloon"<br> + @emoji three @emoji :three: from "three"<br> + @emoji thumbsdown @emoji :thumbsdown: from "thumbsdown"<br> + @emoji thumbsup @emoji :thumbsup: from "thumbsup"<br> + @emoji ticket @emoji :ticket: from "ticket"<br> + @emoji tickets @emoji :tickets: from "tickets"<br> + @emoji tiger @emoji :tiger: from "tiger"<br> + @emoji tiger2 @emoji :tiger2: from "tiger2"<br> + @emoji timer_clock @emoji :timer_clock: from "timer_clock"<br> + @emoji timor_leste @emoji :timor_leste: from "timor_leste"<br> + @emoji tipping_hand_man @emoji :tipping_hand_man: from "tipping_hand_man"<br> + @emoji tipping_hand_woman @emoji :tipping_hand_woman: from "tipping_hand_woman"<br> + @emoji tired_face @emoji :tired_face: from "tired_face"<br> + @emoji tm @emoji :tm: from "tm"<br> + @emoji togo @emoji :togo: from "togo"<br> + @emoji toilet @emoji :toilet: from "toilet"<br> + @emoji tokelau @emoji :tokelau: from "tokelau"<br> + @emoji tokyo_tower @emoji :tokyo_tower: from "tokyo_tower"<br> + @emoji tomato @emoji :tomato: from "tomato"<br> + @emoji tonga @emoji :tonga: from "tonga"<br> + @emoji tongue @emoji :tongue: from "tongue"<br> + @emoji top @emoji :top: from "top"<br> + @emoji tophat @emoji :tophat: from "tophat"<br> + @emoji tornado @emoji :tornado: from "tornado"<br> + @emoji tr @emoji :tr: from "tr"<br> + @emoji trackball @emoji :trackball: from "trackball"<br> + @emoji tractor @emoji :tractor: from "tractor"<br> + @emoji traffic_light @emoji :traffic_light: from "traffic_light"<br> + @emoji train @emoji :train: from "train"<br> + @emoji train2 @emoji :train2: from "train2"<br> + @emoji tram @emoji :tram: from "tram"<br> + @emoji triangular_flag_on_post @emoji :triangular_flag_on_post: from "triangular_flag_on_post"<br> + @emoji triangular_ruler @emoji :triangular_ruler: from "triangular_ruler"<br> + @emoji trident @emoji :trident: from "trident"<br> + @emoji trinidad_tobago @emoji :trinidad_tobago: from "trinidad_tobago"<br> + @emoji triumph @emoji :triumph: from "triumph"<br> + @emoji trolleybus @emoji :trolleybus: from "trolleybus"<br> + @emoji trophy @emoji :trophy: from "trophy"<br> + @emoji tropical_drink @emoji :tropical_drink: from "tropical_drink"<br> + @emoji tropical_fish @emoji :tropical_fish: from "tropical_fish"<br> + @emoji truck @emoji :truck: from "truck"<br> + @emoji trumpet @emoji :trumpet: from "trumpet"<br> + @emoji tshirt @emoji :tshirt: from "tshirt"<br> + @emoji tulip @emoji :tulip: from "tulip"<br> + @emoji tumbler_glass @emoji :tumbler_glass: from "tumbler_glass"<br> + @emoji tunisia @emoji :tunisia: from "tunisia"<br> + @emoji turkey @emoji :turkey: from "turkey"<br> + @emoji turkmenistan @emoji :turkmenistan: from "turkmenistan"<br> + @emoji turks_caicos_islands @emoji :turks_caicos_islands: from "turks_caicos_islands"<br> + @emoji turtle @emoji :turtle: from "turtle"<br> + @emoji tuvalu @emoji :tuvalu: from "tuvalu"<br> + @emoji tv @emoji :tv: from "tv"<br> + @emoji twisted_rightwards_arrows @emoji :twisted_rightwards_arrows: from "twisted_rightwards_arrows"<br> + @emoji two @emoji :two: from "two"<br> + @emoji two_hearts @emoji :two_hearts: from "two_hearts"<br> + @emoji two_men_holding_hands @emoji :two_men_holding_hands: from "two_men_holding_hands"<br> + @emoji two_women_holding_hands @emoji :two_women_holding_hands: from "two_women_holding_hands"<br> + @emoji u5272 @emoji :u5272: from "u5272"<br> + @emoji u5408 @emoji :u5408: from "u5408"<br> + @emoji u55b6 @emoji :u55b6: from "u55b6"<br> + @emoji u6307 @emoji :u6307: from "u6307"<br> + @emoji u6708 @emoji :u6708: from "u6708"<br> + @emoji u6709 @emoji :u6709: from "u6709"<br> + @emoji u6e80 @emoji :u6e80: from "u6e80"<br> + @emoji u7121 @emoji :u7121: from "u7121"<br> + @emoji u7533 @emoji :u7533: from "u7533"<br> + @emoji u7981 @emoji :u7981: from "u7981"<br> + @emoji u7a7a @emoji :u7a7a: from "u7a7a"<br> + @emoji uganda @emoji :uganda: from "uganda"<br> + @emoji uk @emoji :uk: from "uk"<br> + @emoji ukraine @emoji :ukraine: from "ukraine"<br> + @emoji umbrella @emoji :umbrella: from "umbrella"<br> + @emoji unamused @emoji :unamused: from "unamused"<br> + @emoji underage @emoji :underage: from "underage"<br> + @emoji unicorn @emoji :unicorn: from "unicorn"<br> + @emoji united_arab_emirates @emoji :united_arab_emirates: from "united_arab_emirates"<br> + @emoji unlock @emoji :unlock: from "unlock"<br> + @emoji up @emoji :up: from "up"<br> + @emoji upside_down_face @emoji :upside_down_face: from "upside_down_face"<br> + @emoji uruguay @emoji :uruguay: from "uruguay"<br> + @emoji us @emoji :us: from "us"<br> + @emoji us_virgin_islands @emoji :us_virgin_islands: from "us_virgin_islands"<br> + @emoji uzbekistan @emoji :uzbekistan: from "uzbekistan"<br> + @emoji v @emoji :v: from "v"<br> + @emoji vanuatu @emoji :vanuatu: from "vanuatu"<br> + @emoji vatican_city @emoji :vatican_city: from "vatican_city"<br> + @emoji venezuela @emoji :venezuela: from "venezuela"<br> + @emoji vertical_traffic_light @emoji :vertical_traffic_light: from "vertical_traffic_light"<br> + @emoji vhs @emoji :vhs: from "vhs"<br> + @emoji vibration_mode @emoji :vibration_mode: from "vibration_mode"<br> + @emoji video_camera @emoji :video_camera: from "video_camera"<br> + @emoji video_game @emoji :video_game: from "video_game"<br> + @emoji vietnam @emoji :vietnam: from "vietnam"<br> + @emoji violin @emoji :violin: from "violin"<br> + @emoji virgo @emoji :virgo: from "virgo"<br> + @emoji volcano @emoji :volcano: from "volcano"<br> + @emoji volleyball @emoji :volleyball: from "volleyball"<br> + @emoji vs @emoji :vs: from "vs"<br> + @emoji vulcan_salute @emoji :vulcan_salute: from "vulcan_salute"<br> + @emoji walking @emoji :walking: from "walking"<br> + @emoji walking_man @emoji :walking_man: from "walking_man"<br> + @emoji walking_woman @emoji :walking_woman: from "walking_woman"<br> + @emoji wallis_futuna @emoji :wallis_futuna: from "wallis_futuna"<br> + @emoji waning_crescent_moon @emoji :waning_crescent_moon: from "waning_crescent_moon"<br> + @emoji waning_gibbous_moon @emoji :waning_gibbous_moon: from "waning_gibbous_moon"<br> + @emoji warning @emoji :warning: from "warning"<br> + @emoji wastebasket @emoji :wastebasket: from "wastebasket"<br> + @emoji watch @emoji :watch: from "watch"<br> + @emoji water_buffalo @emoji :water_buffalo: from "water_buffalo"<br> + @emoji watermelon @emoji :watermelon: from "watermelon"<br> + @emoji wave @emoji :wave: from "wave"<br> + @emoji wavy_dash @emoji :wavy_dash: from "wavy_dash"<br> + @emoji waxing_crescent_moon @emoji :waxing_crescent_moon: from "waxing_crescent_moon"<br> + @emoji waxing_gibbous_moon @emoji :waxing_gibbous_moon: from "waxing_gibbous_moon"<br> + @emoji wc @emoji :wc: from "wc"<br> + @emoji weary @emoji :weary: from "weary"<br> + @emoji wedding @emoji :wedding: from "wedding"<br> + @emoji weight_lifting_man @emoji :weight_lifting_man: from "weight_lifting_man"<br> + @emoji weight_lifting_woman @emoji :weight_lifting_woman: from "weight_lifting_woman"<br> + @emoji western_sahara @emoji :western_sahara: from "western_sahara"<br> + @emoji whale @emoji :whale: from "whale"<br> + @emoji whale2 @emoji :whale2: from "whale2"<br> + @emoji wheel_of_dharma @emoji :wheel_of_dharma: from "wheel_of_dharma"<br> + @emoji wheelchair @emoji :wheelchair: from "wheelchair"<br> + @emoji white_check_mark @emoji :white_check_mark: from "white_check_mark"<br> + @emoji white_circle @emoji :white_circle: from "white_circle"<br> + @emoji white_flag @emoji :white_flag: from "white_flag"<br> + @emoji white_flower @emoji :white_flower: from "white_flower"<br> + @emoji white_large_square @emoji :white_large_square: from "white_large_square"<br> + @emoji white_medium_small_square @emoji :white_medium_small_square: from "white_medium_small_square"<br> + @emoji white_medium_square @emoji :white_medium_square: from "white_medium_square"<br> + @emoji white_small_square @emoji :white_small_square: from "white_small_square"<br> + @emoji white_square_button @emoji :white_square_button: from "white_square_button"<br> + @emoji wilted_flower @emoji :wilted_flower: from "wilted_flower"<br> + @emoji wind_chime @emoji :wind_chime: from "wind_chime"<br> + @emoji wind_face @emoji :wind_face: from "wind_face"<br> + @emoji wine_glass @emoji :wine_glass: from "wine_glass"<br> + @emoji wink @emoji :wink: from "wink"<br> + @emoji wolf @emoji :wolf: from "wolf"<br> + @emoji woman @emoji :woman: from "woman"<br> + @emoji woman_artist @emoji :woman_artist: from "woman_artist"<br> + @emoji woman_astronaut @emoji :woman_astronaut: from "woman_astronaut"<br> + @emoji woman_cartwheeling @emoji :woman_cartwheeling: from "woman_cartwheeling"<br> + @emoji woman_cook @emoji :woman_cook: from "woman_cook"<br> + @emoji woman_facepalming @emoji :woman_facepalming: from "woman_facepalming"<br> + @emoji woman_factory_worker @emoji :woman_factory_worker: from "woman_factory_worker"<br> + @emoji woman_farmer @emoji :woman_farmer: from "woman_farmer"<br> + @emoji woman_firefighter @emoji :woman_firefighter: from "woman_firefighter"<br> + @emoji woman_health_worker @emoji :woman_health_worker: from "woman_health_worker"<br> + @emoji woman_judge @emoji :woman_judge: from "woman_judge"<br> + @emoji woman_juggling @emoji :woman_juggling: from "woman_juggling"<br> + @emoji woman_mechanic @emoji :woman_mechanic: from "woman_mechanic"<br> + @emoji woman_office_worker @emoji :woman_office_worker: from "woman_office_worker"<br> + @emoji woman_pilot @emoji :woman_pilot: from "woman_pilot"<br> + @emoji woman_playing_handball @emoji :woman_playing_handball: from "woman_playing_handball"<br> + @emoji woman_playing_water_polo @emoji :woman_playing_water_polo: from "woman_playing_water_polo"<br> + @emoji woman_scientist @emoji :woman_scientist: from "woman_scientist"<br> + @emoji woman_shrugging @emoji :woman_shrugging: from "woman_shrugging"<br> + @emoji woman_singer @emoji :woman_singer: from "woman_singer"<br> + @emoji woman_student @emoji :woman_student: from "woman_student"<br> + @emoji woman_teacher @emoji :woman_teacher: from "woman_teacher"<br> + @emoji woman_technologist @emoji :woman_technologist: from "woman_technologist"<br> + @emoji woman_with_turban @emoji :woman_with_turban: from "woman_with_turban"<br> + @emoji womans_clothes @emoji :womans_clothes: from "womans_clothes"<br> + @emoji womans_hat @emoji :womans_hat: from "womans_hat"<br> + @emoji women_wrestling @emoji :women_wrestling: from "women_wrestling"<br> + @emoji womens @emoji :womens: from "womens"<br> + @emoji world_map @emoji :world_map: from "world_map"<br> + @emoji worried @emoji :worried: from "worried"<br> + @emoji wrench @emoji :wrench: from "wrench"<br> + @emoji writing_hand @emoji :writing_hand: from "writing_hand"<br> + @emoji x @emoji :x: from "x"<br> + @emoji yellow_heart @emoji :yellow_heart: from "yellow_heart"<br> + @emoji yemen @emoji :yemen: from "yemen"<br> + @emoji yen @emoji :yen: from "yen"<br> + @emoji yin_yang @emoji :yin_yang: from "yin_yang"<br> + @emoji yum @emoji :yum: from "yum"<br> + @emoji zambia @emoji :zambia: from "zambia"<br> + @emoji zap @emoji :zap: from "zap"<br> + @emoji zero @emoji :zero: from "zero"<br> + @emoji zimbabwe @emoji :zimbabwe: from "zimbabwe"<br> + @emoji zipper_mouth_face @emoji :zipper_mouth_face: from "zipper_mouth_face"<br> + @emoji zzz @emoji :zzz: from "zzz"<br> + */ diff --git a/testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml b/testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml new file mode 100644 index 0000000..9825cc1 --- /dev/null +++ b/testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="077__no__xml__namespace__members__in__file__scope_8h" kind="file" language="C++"> + <compoundname>077_no_xml_namespace_members_in_file_scope.h</compoundname> + <innernamespace refid="namespace_namespace">Namespace</innernamespace> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="077_no_xml_namespace_members_in_file_scope.h"/> + </compounddef> +</doxygen> diff --git a/testing/077_no_xml_namespace_members_in_file_scope.h b/testing/077_no_xml_namespace_members_in_file_scope.h new file mode 100644 index 0000000..bf3dc64 --- /dev/null +++ b/testing/077_no_xml_namespace_members_in_file_scope.h @@ -0,0 +1,16 @@ +// objective: test that namespace members are not put to file docs by default +// check: 077__no__xml__namespace__members__in__file__scope_8h.xml + +namespace Namespace { + +/** +@brief A function + +Detailed documentation. +*/ +void foo(); + +/** @brief An enum */ +enum class Enum {}; + +} diff --git a/testing/078/078__xml__namespace__members__in__file__scope_8h.xml b/testing/078/078__xml__namespace__members__in__file__scope_8h.xml new file mode 100644 index 0000000..e0a0343 --- /dev/null +++ b/testing/078/078__xml__namespace__members__in__file__scope_8h.xml @@ -0,0 +1,43 @@ +<?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="078__xml__namespace__members__in__file__scope_8h" kind="file" language="C++"> + <compoundname>078_xml_namespace_members_in_file_scope.h</compoundname> + <innernamespace refid="namespace_namespace">Namespace</innernamespace> + <sectiondef kind="enum"> + <memberdef kind="enum" id="078__xml__namespace__members__in__file__scope_8h_1add172b93283b1ab7612c3ca6cc5dcfea" prot="public" static="no" strong="yes"> + <type/> + <name>Enum</name> + <briefdescription> + <para>An enum. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="078_xml_namespace_members_in_file_scope.h" line="15" column="1" bodyfile="078_xml_namespace_members_in_file_scope.h" bodystart="15" bodyend="15"/> + </memberdef> + </sectiondef> + <sectiondef kind="func"> + <memberdef kind="function" id="078__xml__namespace__members__in__file__scope_8h_1a0f1fe1a972c7c4196988a1bdde63ec77" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Namespace::foo</definition> + <argsstring>()</argsstring> + <name>foo</name> + <briefdescription> + <para>A function. </para> + </briefdescription> + <detaileddescription> + <para>Detailed documentation. </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="078_xml_namespace_members_in_file_scope.h" line="12" column="1"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="078_xml_namespace_members_in_file_scope.h"/> + </compounddef> +</doxygen> diff --git a/testing/078_xml_namespace_members_in_file_scope.h b/testing/078_xml_namespace_members_in_file_scope.h new file mode 100644 index 0000000..f456464 --- /dev/null +++ b/testing/078_xml_namespace_members_in_file_scope.h @@ -0,0 +1,17 @@ +// objective: test that namespace members are put to file docs when enabled +// check: 078__xml__namespace__members__in__file__scope_8h.xml +// config: XML_NS_MEMB_FILE_SCOPE = YES + +namespace Namespace { + +/** +@brief A function + +Detailed documentation. +*/ +void foo(); + +/** @brief An enum */ +enum class Enum {}; + +} diff --git a/testing/CMakeLists.txt b/testing/CMakeLists.txt index 97b4868..40cb40b 100644 --- a/testing/CMakeLists.txt +++ b/testing/CMakeLists.txt @@ -1,9 +1,9 @@ add_custom_target(tests COMMENT "Running doxygen tests..." - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/runtests.py --all --doxygen ${PROJECT_BINARY_DIR}/bin/doxygen --inputdir ${CMAKE_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/runtests.py --doxygen ${PROJECT_BINARY_DIR}/bin/doxygen --inputdir ${CMAKE_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing DEPENDS doxygen ) add_test(NAME suite - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/runtests.py --all --doxygen $<TARGET_FILE:doxygen> --inputdir ${CMAKE_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/runtests.py --doxygen $<TARGET_FILE:doxygen> --inputdir ${CMAKE_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing ) diff --git a/testing/README.txt b/testing/README.txt index ee3de59..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,19 +7,36 @@ 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 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. The runtest.py script responsible for running the tests takes a number of optional parameters: --id n: run test with number n only (the option may be specified - multiple times) default is to run all tests. --updateref: update the reference files. Should be used in combination - with -id to update the reference file(s) for the given test. --all: can be used in combination with -updateref to update the - reference files for all tests. --doxygen exe: run the specified doxygen executable. --xmllint exe: run the specified xmllint executable. - -The runtest.pl has the following dependenies on 3rd party tools: + --updateref update the reference data for a test + --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 + --outputdir [OUTPUTDIR] + 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 + --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 - xmllint to normalize the XML output - diff to show the differences in case a test fails @@ -44,5 +61,6 @@ Example to update the reference files for a test python runtest.py -updateref -id 10 There is also a CMakeLists.txt, which can be used from the build directory -to run all tests by simply invoking 'make tests'. - +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/xhtml-lat1.ent b/testing/dtd/xhtml-lat1.ent new file mode 100755 index 0000000..ffee223 --- /dev/null +++ b/testing/dtd/xhtml-lat1.ent @@ -0,0 +1,196 @@ +<!-- Portions (C) International Organization for Standardization 1986 + Permission to copy in any form is granted for use with + conforming SGML systems and applications as defined in + ISO 8879, provided this notice is included in all copies. +--> +<!-- Character entity set. Typical invocation: + <!ENTITY % HTMLlat1 PUBLIC + "-//W3C//ENTITIES Latin 1 for XHTML//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"> + %HTMLlat1; +--> + +<!ENTITY nbsp " "> <!-- no-break space = non-breaking space, + U+00A0 ISOnum --> +<!ENTITY iexcl "¡"> <!-- inverted exclamation mark, U+00A1 ISOnum --> +<!ENTITY cent "¢"> <!-- cent sign, U+00A2 ISOnum --> +<!ENTITY pound "£"> <!-- pound sign, U+00A3 ISOnum --> +<!ENTITY curren "¤"> <!-- currency sign, U+00A4 ISOnum --> +<!ENTITY yen "¥"> <!-- yen sign = yuan sign, U+00A5 ISOnum --> +<!ENTITY brvbar "¦"> <!-- broken bar = broken vertical bar, + U+00A6 ISOnum --> +<!ENTITY sect "§"> <!-- section sign, U+00A7 ISOnum --> +<!ENTITY uml "¨"> <!-- diaeresis = spacing diaeresis, + U+00A8 ISOdia --> +<!ENTITY copy "©"> <!-- copyright sign, U+00A9 ISOnum --> +<!ENTITY ordf "ª"> <!-- feminine ordinal indicator, U+00AA ISOnum --> +<!ENTITY laquo "«"> <!-- left-pointing double angle quotation mark + = left pointing guillemet, U+00AB ISOnum --> +<!ENTITY not "¬"> <!-- not sign = angled dash, + U+00AC ISOnum --> +<!ENTITY shy "­"> <!-- soft hyphen = discretionary hyphen, + U+00AD ISOnum --> +<!ENTITY reg "®"> <!-- registered sign = registered trade mark sign, + U+00AE ISOnum --> +<!ENTITY macr "¯"> <!-- macron = spacing macron = overline + = APL overbar, U+00AF ISOdia --> +<!ENTITY deg "°"> <!-- degree sign, U+00B0 ISOnum --> +<!ENTITY plusmn "±"> <!-- plus-minus sign = plus-or-minus sign, + U+00B1 ISOnum --> +<!ENTITY sup2 "²"> <!-- superscript two = superscript digit two + = squared, U+00B2 ISOnum --> +<!ENTITY sup3 "³"> <!-- superscript three = superscript digit three + = cubed, U+00B3 ISOnum --> +<!ENTITY acute "´"> <!-- acute accent = spacing acute, + U+00B4 ISOdia --> +<!ENTITY micro "µ"> <!-- micro sign, U+00B5 ISOnum --> +<!ENTITY para "¶"> <!-- pilcrow sign = paragraph sign, + U+00B6 ISOnum --> +<!ENTITY middot "·"> <!-- middle dot = Georgian comma + = Greek middle dot, U+00B7 ISOnum --> +<!ENTITY cedil "¸"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia --> +<!ENTITY sup1 "¹"> <!-- superscript one = superscript digit one, + U+00B9 ISOnum --> +<!ENTITY ordm "º"> <!-- masculine ordinal indicator, + U+00BA ISOnum --> +<!ENTITY raquo "»"> <!-- right-pointing double angle quotation mark + = right pointing guillemet, U+00BB ISOnum --> +<!ENTITY frac14 "¼"> <!-- vulgar fraction one quarter + = fraction one quarter, U+00BC ISOnum --> +<!ENTITY frac12 "½"> <!-- vulgar fraction one half + = fraction one half, U+00BD ISOnum --> +<!ENTITY frac34 "¾"> <!-- vulgar fraction three quarters + = fraction three quarters, U+00BE ISOnum --> +<!ENTITY iquest "¿"> <!-- inverted question mark + = turned question mark, U+00BF ISOnum --> +<!ENTITY Agrave "À"> <!-- latin capital letter A with grave + = latin capital letter A grave, + U+00C0 ISOlat1 --> +<!ENTITY Aacute "Á"> <!-- latin capital letter A with acute, + U+00C1 ISOlat1 --> +<!ENTITY Acirc "Â"> <!-- latin capital letter A with circumflex, + U+00C2 ISOlat1 --> +<!ENTITY Atilde "Ã"> <!-- latin capital letter A with tilde, + U+00C3 ISOlat1 --> +<!ENTITY Auml "Ä"> <!-- latin capital letter A with diaeresis, + U+00C4 ISOlat1 --> +<!ENTITY Aring "Å"> <!-- latin capital letter A with ring above + = latin capital letter A ring, + U+00C5 ISOlat1 --> +<!ENTITY AElig "Æ"> <!-- latin capital letter AE + = latin capital ligature AE, + U+00C6 ISOlat1 --> +<!ENTITY Ccedil "Ç"> <!-- latin capital letter C with cedilla, + U+00C7 ISOlat1 --> +<!ENTITY Egrave "È"> <!-- latin capital letter E with grave, + U+00C8 ISOlat1 --> +<!ENTITY Eacute "É"> <!-- latin capital letter E with acute, + U+00C9 ISOlat1 --> +<!ENTITY Ecirc "Ê"> <!-- latin capital letter E with circumflex, + U+00CA ISOlat1 --> +<!ENTITY Euml "Ë"> <!-- latin capital letter E with diaeresis, + U+00CB ISOlat1 --> +<!ENTITY Igrave "Ì"> <!-- latin capital letter I with grave, + U+00CC ISOlat1 --> +<!ENTITY Iacute "Í"> <!-- latin capital letter I with acute, + U+00CD ISOlat1 --> +<!ENTITY Icirc "Î"> <!-- latin capital letter I with circumflex, + U+00CE ISOlat1 --> +<!ENTITY Iuml "Ï"> <!-- latin capital letter I with diaeresis, + U+00CF ISOlat1 --> +<!ENTITY ETH "Ð"> <!-- latin capital letter ETH, U+00D0 ISOlat1 --> +<!ENTITY Ntilde "Ñ"> <!-- latin capital letter N with tilde, + U+00D1 ISOlat1 --> +<!ENTITY Ograve "Ò"> <!-- latin capital letter O with grave, + U+00D2 ISOlat1 --> +<!ENTITY Oacute "Ó"> <!-- latin capital letter O with acute, + U+00D3 ISOlat1 --> +<!ENTITY Ocirc "Ô"> <!-- latin capital letter O with circumflex, + U+00D4 ISOlat1 --> +<!ENTITY Otilde "Õ"> <!-- latin capital letter O with tilde, + U+00D5 ISOlat1 --> +<!ENTITY Ouml "Ö"> <!-- latin capital letter O with diaeresis, + U+00D6 ISOlat1 --> +<!ENTITY times "×"> <!-- multiplication sign, U+00D7 ISOnum --> +<!ENTITY Oslash "Ø"> <!-- latin capital letter O with stroke + = latin capital letter O slash, + U+00D8 ISOlat1 --> +<!ENTITY Ugrave "Ù"> <!-- latin capital letter U with grave, + U+00D9 ISOlat1 --> +<!ENTITY Uacute "Ú"> <!-- latin capital letter U with acute, + U+00DA ISOlat1 --> +<!ENTITY Ucirc "Û"> <!-- latin capital letter U with circumflex, + U+00DB ISOlat1 --> +<!ENTITY Uuml "Ü"> <!-- latin capital letter U with diaeresis, + U+00DC ISOlat1 --> +<!ENTITY Yacute "Ý"> <!-- latin capital letter Y with acute, + U+00DD ISOlat1 --> +<!ENTITY THORN "Þ"> <!-- latin capital letter THORN, + U+00DE ISOlat1 --> +<!ENTITY szlig "ß"> <!-- latin small letter sharp s = ess-zed, + U+00DF ISOlat1 --> +<!ENTITY agrave "à"> <!-- latin small letter a with grave + = latin small letter a grave, + U+00E0 ISOlat1 --> +<!ENTITY aacute "á"> <!-- latin small letter a with acute, + U+00E1 ISOlat1 --> +<!ENTITY acirc "â"> <!-- latin small letter a with circumflex, + U+00E2 ISOlat1 --> +<!ENTITY atilde "ã"> <!-- latin small letter a with tilde, + U+00E3 ISOlat1 --> +<!ENTITY auml "ä"> <!-- latin small letter a with diaeresis, + U+00E4 ISOlat1 --> +<!ENTITY aring "å"> <!-- latin small letter a with ring above + = latin small letter a ring, + U+00E5 ISOlat1 --> +<!ENTITY aelig "æ"> <!-- latin small letter ae + = latin small ligature ae, U+00E6 ISOlat1 --> +<!ENTITY ccedil "ç"> <!-- latin small letter c with cedilla, + U+00E7 ISOlat1 --> +<!ENTITY egrave "è"> <!-- latin small letter e with grave, + U+00E8 ISOlat1 --> +<!ENTITY eacute "é"> <!-- latin small letter e with acute, + U+00E9 ISOlat1 --> +<!ENTITY ecirc "ê"> <!-- latin small letter e with circumflex, + U+00EA ISOlat1 --> +<!ENTITY euml "ë"> <!-- latin small letter e with diaeresis, + U+00EB ISOlat1 --> +<!ENTITY igrave "ì"> <!-- latin small letter i with grave, + U+00EC ISOlat1 --> +<!ENTITY iacute "í"> <!-- latin small letter i with acute, + U+00ED ISOlat1 --> +<!ENTITY icirc "î"> <!-- latin small letter i with circumflex, + U+00EE ISOlat1 --> +<!ENTITY iuml "ï"> <!-- latin small letter i with diaeresis, + U+00EF ISOlat1 --> +<!ENTITY eth "ð"> <!-- latin small letter eth, U+00F0 ISOlat1 --> +<!ENTITY ntilde "ñ"> <!-- latin small letter n with tilde, + U+00F1 ISOlat1 --> +<!ENTITY ograve "ò"> <!-- latin small letter o with grave, + U+00F2 ISOlat1 --> +<!ENTITY oacute "ó"> <!-- latin small letter o with acute, + U+00F3 ISOlat1 --> +<!ENTITY ocirc "ô"> <!-- latin small letter o with circumflex, + U+00F4 ISOlat1 --> +<!ENTITY otilde "õ"> <!-- latin small letter o with tilde, + U+00F5 ISOlat1 --> +<!ENTITY ouml "ö"> <!-- latin small letter o with diaeresis, + U+00F6 ISOlat1 --> +<!ENTITY divide "÷"> <!-- division sign, U+00F7 ISOnum --> +<!ENTITY oslash "ø"> <!-- latin small letter o with stroke, + = latin small letter o slash, + U+00F8 ISOlat1 --> +<!ENTITY ugrave "ù"> <!-- latin small letter u with grave, + U+00F9 ISOlat1 --> +<!ENTITY uacute "ú"> <!-- latin small letter u with acute, + U+00FA ISOlat1 --> +<!ENTITY ucirc "û"> <!-- latin small letter u with circumflex, + U+00FB ISOlat1 --> +<!ENTITY uuml "ü"> <!-- latin small letter u with diaeresis, + U+00FC ISOlat1 --> +<!ENTITY yacute "ý"> <!-- latin small letter y with acute, + U+00FD ISOlat1 --> +<!ENTITY thorn "þ"> <!-- latin small letter thorn, + U+00FE ISOlat1 --> +<!ENTITY yuml "ÿ"> <!-- latin small letter y with diaeresis, + U+00FF ISOlat1 --> diff --git a/testing/dtd/xhtml-special.ent b/testing/dtd/xhtml-special.ent new file mode 100755 index 0000000..ca358b2 --- /dev/null +++ b/testing/dtd/xhtml-special.ent @@ -0,0 +1,80 @@ +<!-- Special characters for XHTML --> + +<!-- Character entity set. Typical invocation: + <!ENTITY % HTMLspecial PUBLIC + "-//W3C//ENTITIES Special for XHTML//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"> + %HTMLspecial; +--> + +<!-- Portions (C) International Organization for Standardization 1986: + Permission to copy in any form is granted for use with + conforming SGML systems and applications as defined in + ISO 8879, provided this notice is included in all copies. +--> + +<!-- Relevant ISO entity set is given unless names are newly introduced. + New names (i.e., not in ISO 8879 list) do not clash with any + existing ISO 8879 entity names. ISO 10646 character numbers + are given for each character, in hex. values are decimal + conversions of the ISO 10646 values and refer to the document + character set. Names are Unicode names. +--> + +<!-- C0 Controls and Basic Latin --> +<!ENTITY quot """> <!-- quotation mark, U+0022 ISOnum --> +<!ENTITY amp "&#38;"> <!-- ampersand, U+0026 ISOnum --> +<!ENTITY lt "&#60;"> <!-- less-than sign, U+003C ISOnum --> +<!ENTITY gt ">"> <!-- greater-than sign, U+003E ISOnum --> +<!ENTITY apos "'"> <!-- apostrophe = APL quote, U+0027 ISOnum --> + +<!-- Latin Extended-A --> +<!ENTITY OElig "Œ"> <!-- latin capital ligature OE, + U+0152 ISOlat2 --> +<!ENTITY oelig "œ"> <!-- latin small ligature oe, U+0153 ISOlat2 --> +<!-- ligature is a misnomer, this is a separate character in some languages --> +<!ENTITY Scaron "Š"> <!-- latin capital letter S with caron, + U+0160 ISOlat2 --> +<!ENTITY scaron "š"> <!-- latin small letter s with caron, + U+0161 ISOlat2 --> +<!ENTITY Yuml "Ÿ"> <!-- latin capital letter Y with diaeresis, + U+0178 ISOlat2 --> + +<!-- Spacing Modifier Letters --> +<!ENTITY circ "ˆ"> <!-- modifier letter circumflex accent, + U+02C6 ISOpub --> +<!ENTITY tilde "˜"> <!-- small tilde, U+02DC ISOdia --> + +<!-- General Punctuation --> +<!ENTITY ensp " "> <!-- en space, U+2002 ISOpub --> +<!ENTITY emsp " "> <!-- em space, U+2003 ISOpub --> +<!ENTITY thinsp " "> <!-- thin space, U+2009 ISOpub --> +<!ENTITY zwnj "‌"> <!-- zero width non-joiner, + U+200C NEW RFC 2070 --> +<!ENTITY zwj "‍"> <!-- zero width joiner, U+200D NEW RFC 2070 --> +<!ENTITY lrm "‎"> <!-- left-to-right mark, U+200E NEW RFC 2070 --> +<!ENTITY rlm "‏"> <!-- right-to-left mark, U+200F NEW RFC 2070 --> +<!ENTITY ndash "–"> <!-- en dash, U+2013 ISOpub --> +<!ENTITY mdash "—"> <!-- em dash, U+2014 ISOpub --> +<!ENTITY lsquo "‘"> <!-- left single quotation mark, + U+2018 ISOnum --> +<!ENTITY rsquo "’"> <!-- right single quotation mark, + U+2019 ISOnum --> +<!ENTITY sbquo "‚"> <!-- single low-9 quotation mark, U+201A NEW --> +<!ENTITY ldquo "“"> <!-- left double quotation mark, + U+201C ISOnum --> +<!ENTITY rdquo "”"> <!-- right double quotation mark, + U+201D ISOnum --> +<!ENTITY bdquo "„"> <!-- double low-9 quotation mark, U+201E NEW --> +<!ENTITY dagger "†"> <!-- dagger, U+2020 ISOpub --> +<!ENTITY Dagger "‡"> <!-- double dagger, U+2021 ISOpub --> +<!ENTITY permil "‰"> <!-- per mille sign, U+2030 ISOtech --> +<!ENTITY lsaquo "‹"> <!-- single left-pointing angle quotation mark, + U+2039 ISO proposed --> +<!-- lsaquo is proposed but not yet ISO standardized --> +<!ENTITY rsaquo "›"> <!-- single right-pointing angle quotation mark, + U+203A ISO proposed --> +<!-- rsaquo is proposed but not yet ISO standardized --> + +<!-- Currency Symbols --> +<!ENTITY euro "€"> <!-- euro sign, U+20AC NEW --> diff --git a/testing/dtd/xhtml-symbol.ent b/testing/dtd/xhtml-symbol.ent new file mode 100755 index 0000000..63c2abf --- /dev/null +++ b/testing/dtd/xhtml-symbol.ent @@ -0,0 +1,237 @@ +<!-- Mathematical, Greek and Symbolic characters for XHTML --> + +<!-- Character entity set. Typical invocation: + <!ENTITY % HTMLsymbol PUBLIC + "-//W3C//ENTITIES Symbols for XHTML//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"> + %HTMLsymbol; +--> + +<!-- Portions (C) International Organization for Standardization 1986: + Permission to copy in any form is granted for use with + conforming SGML systems and applications as defined in + ISO 8879, provided this notice is included in all copies. +--> + +<!-- Relevant ISO entity set is given unless names are newly introduced. + New names (i.e., not in ISO 8879 list) do not clash with any + existing ISO 8879 entity names. ISO 10646 character numbers + are given for each character, in hex. values are decimal + conversions of the ISO 10646 values and refer to the document + character set. Names are Unicode names. +--> + +<!-- Latin Extended-B --> +<!ENTITY fnof "ƒ"> <!-- latin small letter f with hook = function + = florin, U+0192 ISOtech --> + +<!-- Greek --> +<!ENTITY Alpha "Α"> <!-- greek capital letter alpha, U+0391 --> +<!ENTITY Beta "Β"> <!-- greek capital letter beta, U+0392 --> +<!ENTITY Gamma "Γ"> <!-- greek capital letter gamma, + U+0393 ISOgrk3 --> +<!ENTITY Delta "Δ"> <!-- greek capital letter delta, + U+0394 ISOgrk3 --> +<!ENTITY Epsilon "Ε"> <!-- greek capital letter epsilon, U+0395 --> +<!ENTITY Zeta "Ζ"> <!-- greek capital letter zeta, U+0396 --> +<!ENTITY Eta "Η"> <!-- greek capital letter eta, U+0397 --> +<!ENTITY Theta "Θ"> <!-- greek capital letter theta, + U+0398 ISOgrk3 --> +<!ENTITY Iota "Ι"> <!-- greek capital letter iota, U+0399 --> +<!ENTITY Kappa "Κ"> <!-- greek capital letter kappa, U+039A --> +<!ENTITY Lambda "Λ"> <!-- greek capital letter lamda, + U+039B ISOgrk3 --> +<!ENTITY Mu "Μ"> <!-- greek capital letter mu, U+039C --> +<!ENTITY Nu "Ν"> <!-- greek capital letter nu, U+039D --> +<!ENTITY Xi "Ξ"> <!-- greek capital letter xi, U+039E ISOgrk3 --> +<!ENTITY Omicron "Ο"> <!-- greek capital letter omicron, U+039F --> +<!ENTITY Pi "Π"> <!-- greek capital letter pi, U+03A0 ISOgrk3 --> +<!ENTITY Rho "Ρ"> <!-- greek capital letter rho, U+03A1 --> +<!-- there is no Sigmaf, and no U+03A2 character either --> +<!ENTITY Sigma "Σ"> <!-- greek capital letter sigma, + U+03A3 ISOgrk3 --> +<!ENTITY Tau "Τ"> <!-- greek capital letter tau, U+03A4 --> +<!ENTITY Upsilon "Υ"> <!-- greek capital letter upsilon, + U+03A5 ISOgrk3 --> +<!ENTITY Phi "Φ"> <!-- greek capital letter phi, + U+03A6 ISOgrk3 --> +<!ENTITY Chi "Χ"> <!-- greek capital letter chi, U+03A7 --> +<!ENTITY Psi "Ψ"> <!-- greek capital letter psi, + U+03A8 ISOgrk3 --> +<!ENTITY Omega "Ω"> <!-- greek capital letter omega, + U+03A9 ISOgrk3 --> + +<!ENTITY alpha "α"> <!-- greek small letter alpha, + U+03B1 ISOgrk3 --> +<!ENTITY beta "β"> <!-- greek small letter beta, U+03B2 ISOgrk3 --> +<!ENTITY gamma "γ"> <!-- greek small letter gamma, + U+03B3 ISOgrk3 --> +<!ENTITY delta "δ"> <!-- greek small letter delta, + U+03B4 ISOgrk3 --> +<!ENTITY epsilon "ε"> <!-- greek small letter epsilon, + U+03B5 ISOgrk3 --> +<!ENTITY zeta "ζ"> <!-- greek small letter zeta, U+03B6 ISOgrk3 --> +<!ENTITY eta "η"> <!-- greek small letter eta, U+03B7 ISOgrk3 --> +<!ENTITY theta "θ"> <!-- greek small letter theta, + U+03B8 ISOgrk3 --> +<!ENTITY iota "ι"> <!-- greek small letter iota, U+03B9 ISOgrk3 --> +<!ENTITY kappa "κ"> <!-- greek small letter kappa, + U+03BA ISOgrk3 --> +<!ENTITY lambda "λ"> <!-- greek small letter lamda, + U+03BB ISOgrk3 --> +<!ENTITY mu "μ"> <!-- greek small letter mu, U+03BC ISOgrk3 --> +<!ENTITY nu "ν"> <!-- greek small letter nu, U+03BD ISOgrk3 --> +<!ENTITY xi "ξ"> <!-- greek small letter xi, U+03BE ISOgrk3 --> +<!ENTITY omicron "ο"> <!-- greek small letter omicron, U+03BF NEW --> +<!ENTITY pi "π"> <!-- greek small letter pi, U+03C0 ISOgrk3 --> +<!ENTITY rho "ρ"> <!-- greek small letter rho, U+03C1 ISOgrk3 --> +<!ENTITY sigmaf "ς"> <!-- greek small letter final sigma, + U+03C2 ISOgrk3 --> +<!ENTITY sigma "σ"> <!-- greek small letter sigma, + U+03C3 ISOgrk3 --> +<!ENTITY tau "τ"> <!-- greek small letter tau, U+03C4 ISOgrk3 --> +<!ENTITY upsilon "υ"> <!-- greek small letter upsilon, + U+03C5 ISOgrk3 --> +<!ENTITY phi "φ"> <!-- greek small letter phi, U+03C6 ISOgrk3 --> +<!ENTITY chi "χ"> <!-- greek small letter chi, U+03C7 ISOgrk3 --> +<!ENTITY psi "ψ"> <!-- greek small letter psi, U+03C8 ISOgrk3 --> +<!ENTITY omega "ω"> <!-- greek small letter omega, + U+03C9 ISOgrk3 --> +<!ENTITY thetasym "ϑ"> <!-- greek theta symbol, + U+03D1 NEW --> +<!ENTITY upsih "ϒ"> <!-- greek upsilon with hook symbol, + U+03D2 NEW --> +<!ENTITY piv "ϖ"> <!-- greek pi symbol, U+03D6 ISOgrk3 --> + +<!-- General Punctuation --> +<!ENTITY bull "•"> <!-- bullet = black small circle, + U+2022 ISOpub --> +<!-- bullet is NOT the same as bullet operator, U+2219 --> +<!ENTITY hellip "…"> <!-- horizontal ellipsis = three dot leader, + U+2026 ISOpub --> +<!ENTITY prime "′"> <!-- prime = minutes = feet, U+2032 ISOtech --> +<!ENTITY Prime "″"> <!-- double prime = seconds = inches, + U+2033 ISOtech --> +<!ENTITY oline "‾"> <!-- overline = spacing overscore, + U+203E NEW --> +<!ENTITY frasl "⁄"> <!-- fraction slash, U+2044 NEW --> + +<!-- Letterlike Symbols --> +<!ENTITY weierp "℘"> <!-- script capital P = power set + = Weierstrass p, U+2118 ISOamso --> +<!ENTITY image "ℑ"> <!-- black-letter capital I = imaginary part, + U+2111 ISOamso --> +<!ENTITY real "ℜ"> <!-- black-letter capital R = real part symbol, + U+211C ISOamso --> +<!ENTITY trade "™"> <!-- trade mark sign, U+2122 ISOnum --> +<!ENTITY alefsym "ℵ"> <!-- alef symbol = first transfinite cardinal, + U+2135 NEW --> +<!-- alef symbol is NOT the same as hebrew letter alef, + U+05D0 although the same glyph could be used to depict both characters --> + +<!-- Arrows --> +<!ENTITY larr "←"> <!-- leftwards arrow, U+2190 ISOnum --> +<!ENTITY uarr "↑"> <!-- upwards arrow, U+2191 ISOnum--> +<!ENTITY rarr "→"> <!-- rightwards arrow, U+2192 ISOnum --> +<!ENTITY darr "↓"> <!-- downwards arrow, U+2193 ISOnum --> +<!ENTITY harr "↔"> <!-- left right arrow, U+2194 ISOamsa --> +<!ENTITY crarr "↵"> <!-- downwards arrow with corner leftwards + = carriage return, U+21B5 NEW --> +<!ENTITY lArr "⇐"> <!-- leftwards double arrow, U+21D0 ISOtech --> +<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow + but also does not have any other character for that function. So lArr can + be used for 'is implied by' as ISOtech suggests --> +<!ENTITY uArr "⇑"> <!-- upwards double arrow, U+21D1 ISOamsa --> +<!ENTITY rArr "⇒"> <!-- rightwards double arrow, + U+21D2 ISOtech --> +<!-- Unicode does not say this is the 'implies' character but does not have + another character with this function so rArr can be used for 'implies' + as ISOtech suggests --> +<!ENTITY dArr "⇓"> <!-- downwards double arrow, U+21D3 ISOamsa --> +<!ENTITY hArr "⇔"> <!-- left right double arrow, + U+21D4 ISOamsa --> + +<!-- Mathematical Operators --> +<!ENTITY forall "∀"> <!-- for all, U+2200 ISOtech --> +<!ENTITY part "∂"> <!-- partial differential, U+2202 ISOtech --> +<!ENTITY exist "∃"> <!-- there exists, U+2203 ISOtech --> +<!ENTITY empty "∅"> <!-- empty set = null set, U+2205 ISOamso --> +<!ENTITY nabla "∇"> <!-- nabla = backward difference, + U+2207 ISOtech --> +<!ENTITY isin "∈"> <!-- element of, U+2208 ISOtech --> +<!ENTITY notin "∉"> <!-- not an element of, U+2209 ISOtech --> +<!ENTITY ni "∋"> <!-- contains as member, U+220B ISOtech --> +<!ENTITY prod "∏"> <!-- n-ary product = product sign, + U+220F ISOamsb --> +<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though + the same glyph might be used for both --> +<!ENTITY sum "∑"> <!-- n-ary summation, U+2211 ISOamsb --> +<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma' + though the same glyph might be used for both --> +<!ENTITY minus "−"> <!-- minus sign, U+2212 ISOtech --> +<!ENTITY lowast "∗"> <!-- asterisk operator, U+2217 ISOtech --> +<!ENTITY radic "√"> <!-- square root = radical sign, + U+221A ISOtech --> +<!ENTITY prop "∝"> <!-- proportional to, U+221D ISOtech --> +<!ENTITY infin "∞"> <!-- infinity, U+221E ISOtech --> +<!ENTITY ang "∠"> <!-- angle, U+2220 ISOamso --> +<!ENTITY and "∧"> <!-- logical and = wedge, U+2227 ISOtech --> +<!ENTITY or "∨"> <!-- logical or = vee, U+2228 ISOtech --> +<!ENTITY cap "∩"> <!-- intersection = cap, U+2229 ISOtech --> +<!ENTITY cup "∪"> <!-- union = cup, U+222A ISOtech --> +<!ENTITY int "∫"> <!-- integral, U+222B ISOtech --> +<!ENTITY there4 "∴"> <!-- therefore, U+2234 ISOtech --> +<!ENTITY sim "∼"> <!-- tilde operator = varies with = similar to, + U+223C ISOtech --> +<!-- tilde operator is NOT the same character as the tilde, U+007E, + although the same glyph might be used to represent both --> +<!ENTITY cong "≅"> <!-- approximately equal to, U+2245 ISOtech --> +<!ENTITY asymp "≈"> <!-- almost equal to = asymptotic to, + U+2248 ISOamsr --> +<!ENTITY ne "≠"> <!-- not equal to, U+2260 ISOtech --> +<!ENTITY equiv "≡"> <!-- identical to, U+2261 ISOtech --> +<!ENTITY le "≤"> <!-- less-than or equal to, U+2264 ISOtech --> +<!ENTITY ge "≥"> <!-- greater-than or equal to, + U+2265 ISOtech --> +<!ENTITY sub "⊂"> <!-- subset of, U+2282 ISOtech --> +<!ENTITY sup "⊃"> <!-- superset of, U+2283 ISOtech --> +<!ENTITY nsub "⊄"> <!-- not a subset of, U+2284 ISOamsn --> +<!ENTITY sube "⊆"> <!-- subset of or equal to, U+2286 ISOtech --> +<!ENTITY supe "⊇"> <!-- superset of or equal to, + U+2287 ISOtech --> +<!ENTITY oplus "⊕"> <!-- circled plus = direct sum, + U+2295 ISOamsb --> +<!ENTITY otimes "⊗"> <!-- circled times = vector product, + U+2297 ISOamsb --> +<!ENTITY perp "⊥"> <!-- up tack = orthogonal to = perpendicular, + U+22A5 ISOtech --> +<!ENTITY sdot "⋅"> <!-- dot operator, U+22C5 ISOamsb --> +<!-- dot operator is NOT the same character as U+00B7 middle dot --> + +<!-- Miscellaneous Technical --> +<!ENTITY lceil "⌈"> <!-- left ceiling = APL upstile, + U+2308 ISOamsc --> +<!ENTITY rceil "⌉"> <!-- right ceiling, U+2309 ISOamsc --> +<!ENTITY lfloor "⌊"> <!-- left floor = APL downstile, + U+230A ISOamsc --> +<!ENTITY rfloor "⌋"> <!-- right floor, U+230B ISOamsc --> +<!ENTITY lang "〈"> <!-- left-pointing angle bracket = bra, + U+2329 ISOtech --> +<!-- lang is NOT the same character as U+003C 'less than sign' + or U+2039 'single left-pointing angle quotation mark' --> +<!ENTITY rang "〉"> <!-- right-pointing angle bracket = ket, + U+232A ISOtech --> +<!-- rang is NOT the same character as U+003E 'greater than sign' + or U+203A 'single right-pointing angle quotation mark' --> + +<!-- Geometric Shapes --> +<!ENTITY loz "◊"> <!-- lozenge, U+25CA ISOpub --> + +<!-- Miscellaneous Symbols --> +<!ENTITY spades "♠"> <!-- black spade suit, U+2660 ISOpub --> +<!-- black here seems to mean filled as opposed to hollow --> +<!ENTITY clubs "♣"> <!-- black club suit = shamrock, + U+2663 ISOpub --> +<!ENTITY hearts "♥"> <!-- black heart suit = valentine, + U+2665 ISOpub --> +<!ENTITY diams "♦"> <!-- black diamond suit, U+2666 ISOpub --> diff --git a/testing/dtd/xhtml1-strict.dtd b/testing/dtd/xhtml1-strict.dtd new file mode 100755 index 0000000..2927b9e --- /dev/null +++ b/testing/dtd/xhtml1-strict.dtd @@ -0,0 +1,978 @@ +<!-- + Extensible HTML version 1.0 Strict DTD + + This is the same as HTML 4 Strict except for + changes due to the differences between XML and SGML. + + Namespace = http://www.w3.org/1999/xhtml + + For further information, see: http://www.w3.org/TR/xhtml1 + + Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio), + All Rights Reserved. + + This DTD module is identified by the PUBLIC and SYSTEM identifiers: + + PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" + + $Revision: 1.1 $ + $Date: 2002/08/01 13:56:03 $ + +--> + +<!--================ Character mnemonic entities =========================--> + +<!ENTITY % HTMLlat1 PUBLIC + "-//W3C//ENTITIES Latin 1 for XHTML//EN" + "xhtml-lat1.ent"> +%HTMLlat1; + +<!ENTITY % HTMLsymbol PUBLIC + "-//W3C//ENTITIES Symbols for XHTML//EN" + "xhtml-symbol.ent"> +%HTMLsymbol; + +<!ENTITY % HTMLspecial PUBLIC + "-//W3C//ENTITIES Special for XHTML//EN" + "xhtml-special.ent"> +%HTMLspecial; + +<!--================== Imported Names ====================================--> + +<!ENTITY % ContentType "CDATA"> + <!-- media type, as per [RFC2045] --> + +<!ENTITY % ContentTypes "CDATA"> + <!-- comma-separated list of media types, as per [RFC2045] --> + +<!ENTITY % Charset "CDATA"> + <!-- a character encoding, as per [RFC2045] --> + +<!ENTITY % Charsets "CDATA"> + <!-- a space separated list of character encodings, as per [RFC2045] --> + +<!ENTITY % LanguageCode "NMTOKEN"> + <!-- a language code, as per [RFC3066] --> + +<!ENTITY % Character "CDATA"> + <!-- a single character, as per section 2.2 of [XML] --> + +<!ENTITY % Number "CDATA"> + <!-- one or more digits --> + +<!ENTITY % LinkTypes "CDATA"> + <!-- space-separated list of link types --> + +<!ENTITY % MediaDesc "CDATA"> + <!-- single or comma-separated list of media descriptors --> + +<!ENTITY % URI "CDATA"> + <!-- a Uniform Resource Identifier, see [RFC2396] --> + +<!ENTITY % UriList "CDATA"> + <!-- a space separated list of Uniform Resource Identifiers --> + +<!ENTITY % Datetime "CDATA"> + <!-- date and time information. ISO date format --> + +<!ENTITY % Script "CDATA"> + <!-- script expression --> + +<!ENTITY % StyleSheet "CDATA"> + <!-- style sheet data --> + +<!ENTITY % Text "CDATA"> + <!-- used for titles etc. --> + +<!ENTITY % Length "CDATA"> + <!-- nn for pixels or nn% for percentage length --> + +<!ENTITY % MultiLength "CDATA"> + <!-- pixel, percentage, or relative --> + +<!ENTITY % Pixels "CDATA"> + <!-- integer representing length in pixels --> + +<!-- these are used for image maps --> + +<!ENTITY % Shape "(rect|circle|poly|default)"> + +<!ENTITY % Coords "CDATA"> + <!-- comma separated list of lengths --> + +<!--=================== Generic Attributes ===============================--> + +<!-- core attributes common to most elements + id document-wide unique id + class space separated list of classes + style associated style info + title advisory title/amplification +--> +<!ENTITY % coreattrs + "id ID #IMPLIED + class CDATA #IMPLIED + style %StyleSheet; #IMPLIED + title %Text; #IMPLIED" + > + +<!-- internationalization attributes + lang language code (backwards compatible) + xml:lang language code (as per XML 1.0 spec) + dir direction for weak/neutral text +--> +<!ENTITY % i18n + "lang %LanguageCode; #IMPLIED + xml:lang %LanguageCode; #IMPLIED + dir (ltr|rtl) #IMPLIED" + > + +<!-- attributes for common UI events + onclick a pointer button was clicked + ondblclick a pointer button was double clicked + onmousedown a pointer button was pressed down + onmouseup a pointer button was released + onmousemove a pointer was moved onto the element + onmouseout a pointer was moved away from the element + onkeypress a key was pressed and released + onkeydown a key was pressed down + onkeyup a key was released +--> +<!ENTITY % events + "onclick %Script; #IMPLIED + ondblclick %Script; #IMPLIED + onmousedown %Script; #IMPLIED + onmouseup %Script; #IMPLIED + onmouseover %Script; #IMPLIED + onmousemove %Script; #IMPLIED + onmouseout %Script; #IMPLIED + onkeypress %Script; #IMPLIED + onkeydown %Script; #IMPLIED + onkeyup %Script; #IMPLIED" + > + +<!-- attributes for elements that can get the focus + accesskey accessibility key character + tabindex position in tabbing order + onfocus the element got the focus + onblur the element lost the focus +--> +<!ENTITY % focus + "accesskey %Character; #IMPLIED + tabindex %Number; #IMPLIED + onfocus %Script; #IMPLIED + onblur %Script; #IMPLIED" + > + +<!ENTITY % attrs "%coreattrs; %i18n; %events;"> + +<!--=================== Text Elements ====================================--> + +<!ENTITY % special.pre + "br | span | bdo | map"> + + +<!ENTITY % special + "%special.pre; | object | img "> + +<!ENTITY % fontstyle "tt | i | b | big | small "> + +<!ENTITY % phrase "em | strong | dfn | code | q | + samp | kbd | var | cite | abbr | acronym | sub | sup "> + +<!ENTITY % inline.forms "input | select | textarea | label | button"> + +<!-- these can occur at block or inline level --> +<!ENTITY % misc.inline "ins | del | script"> + +<!-- these can only occur at block level --> +<!ENTITY % misc "noscript | %misc.inline;"> + +<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;"> + +<!-- %Inline; covers inline or "text-level" elements --> +<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*"> + +<!--================== Block level elements ==============================--> + +<!ENTITY % heading "h1|h2|h3|h4|h5|h6"> +<!ENTITY % lists "ul | ol | dl"> +<!ENTITY % blocktext "pre | hr | blockquote | address"> + +<!ENTITY % block + "p | %heading; | div | %lists; | %blocktext; | fieldset | table"> + +<!ENTITY % Block "(%block; | form | %misc;)*"> + +<!-- %Flow; mixes block and inline and is used for list items etc. --> +<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*"> + +<!--================== Content models for exclusions =====================--> + +<!-- a elements use %Inline; excluding a --> + +<!ENTITY % a.content + "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*"> + +<!-- pre uses %Inline excluding big, small, sup or sup --> + +<!ENTITY % pre.content + "(#PCDATA | a | %fontstyle; | %phrase; | %special.pre; | %misc.inline; + | %inline.forms;)*"> + +<!-- form uses %Block; excluding form --> + +<!ENTITY % form.content "(%block; | %misc;)*"> + +<!-- button uses %Flow; but excludes a, form and form controls --> + +<!ENTITY % button.content + "(#PCDATA | p | %heading; | div | %lists; | %blocktext; | + table | %special; | %fontstyle; | %phrase; | %misc;)*"> + +<!--================ Document Structure ==================================--> + +<!-- the namespace URI designates the document profile --> + +<!ELEMENT html (head, body)> +<!ATTLIST html + %i18n; + id ID #IMPLIED + xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml' + > + +<!--================ Document Head =======================================--> + +<!ENTITY % head.misc "(script|style|meta|link|object)*"> + +<!-- content model is %head.misc; combined with a single + title and an optional base element in any order --> + +<!ELEMENT head (%head.misc;, + ((title, %head.misc;, (base, %head.misc;)?) | + (base, %head.misc;, (title, %head.misc;))))> + +<!ATTLIST head + %i18n; + id ID #IMPLIED + profile %URI; #IMPLIED + > + +<!-- The title element is not considered part of the flow of text. + It should be displayed, for example as the page header or + window title. Exactly one title is required per document. + --> +<!ELEMENT title (#PCDATA)> +<!ATTLIST title + %i18n; + id ID #IMPLIED + > + +<!-- document base URI --> + +<!ELEMENT base EMPTY> +<!ATTLIST base + href %URI; #REQUIRED + id ID #IMPLIED + > + +<!-- generic metainformation --> +<!ELEMENT meta EMPTY> +<!ATTLIST meta + %i18n; + id ID #IMPLIED + http-equiv CDATA #IMPLIED + name CDATA #IMPLIED + content CDATA #REQUIRED + scheme CDATA #IMPLIED + > + +<!-- + Relationship values can be used in principle: + + a) for document specific toolbars/menus when used + with the link element in document head e.g. + start, contents, previous, next, index, end, help + b) to link to a separate style sheet (rel="stylesheet") + c) to make a link to a script (rel="script") + d) by stylesheets to control how collections of + html nodes are rendered into printed documents + e) to make a link to a printable version of this document + e.g. a PostScript or PDF version (rel="alternate" media="print") +--> + +<!ELEMENT link EMPTY> +<!ATTLIST link + %attrs; + charset %Charset; #IMPLIED + href %URI; #IMPLIED + hreflang %LanguageCode; #IMPLIED + type %ContentType; #IMPLIED + rel %LinkTypes; #IMPLIED + rev %LinkTypes; #IMPLIED + media %MediaDesc; #IMPLIED + > + +<!-- style info, which may include CDATA sections --> +<!ELEMENT style (#PCDATA)> +<!ATTLIST style + %i18n; + id ID #IMPLIED + type %ContentType; #REQUIRED + media %MediaDesc; #IMPLIED + title %Text; #IMPLIED + xml:space (preserve) #FIXED 'preserve' + > + +<!-- script statements, which may include CDATA sections --> +<!ELEMENT script (#PCDATA)> +<!ATTLIST script + id ID #IMPLIED + charset %Charset; #IMPLIED + type %ContentType; #REQUIRED + src %URI; #IMPLIED + defer (defer) #IMPLIED + xml:space (preserve) #FIXED 'preserve' + > + +<!-- alternate content container for non script-based rendering --> + +<!ELEMENT noscript %Block;> +<!ATTLIST noscript + %attrs; + > + +<!--=================== Document Body ====================================--> + +<!ELEMENT body %Block;> +<!ATTLIST body + %attrs; + onload %Script; #IMPLIED + onunload %Script; #IMPLIED + > + +<!ELEMENT div %Flow;> <!-- generic language/style container --> +<!ATTLIST div + %attrs; + > + +<!--=================== Paragraphs =======================================--> + +<!ELEMENT p %Inline;> +<!ATTLIST p + %attrs; + > + +<!--=================== Headings =========================================--> + +<!-- + There are six levels of headings from h1 (the most important) + to h6 (the least important). +--> + +<!ELEMENT h1 %Inline;> +<!ATTLIST h1 + %attrs; + > + +<!ELEMENT h2 %Inline;> +<!ATTLIST h2 + %attrs; + > + +<!ELEMENT h3 %Inline;> +<!ATTLIST h3 + %attrs; + > + +<!ELEMENT h4 %Inline;> +<!ATTLIST h4 + %attrs; + > + +<!ELEMENT h5 %Inline;> +<!ATTLIST h5 + %attrs; + > + +<!ELEMENT h6 %Inline;> +<!ATTLIST h6 + %attrs; + > + +<!--=================== Lists ============================================--> + +<!-- Unordered list --> + +<!ELEMENT ul (li)+> +<!ATTLIST ul + %attrs; + > + +<!-- Ordered (numbered) list --> + +<!ELEMENT ol (li)+> +<!ATTLIST ol + %attrs; + > + +<!-- list item --> + +<!ELEMENT li %Flow;> +<!ATTLIST li + %attrs; + > + +<!-- definition lists - dt for term, dd for its definition --> + +<!ELEMENT dl (dt|dd)+> +<!ATTLIST dl + %attrs; + > + +<!ELEMENT dt %Inline;> +<!ATTLIST dt + %attrs; + > + +<!ELEMENT dd %Flow;> +<!ATTLIST dd + %attrs; + > + +<!--=================== Address ==========================================--> + +<!-- information on author --> + +<!ELEMENT address %Inline;> +<!ATTLIST address + %attrs; + > + +<!--=================== Horizontal Rule ==================================--> + +<!ELEMENT hr EMPTY> +<!ATTLIST hr + %attrs; + > + +<!--=================== Preformatted Text ================================--> + +<!-- content is %Inline; excluding "img|object|big|small|sub|sup" --> + +<!ELEMENT pre %pre.content;> +<!ATTLIST pre + %attrs; + xml:space (preserve) #FIXED 'preserve' + > + +<!--=================== Block-like Quotes ================================--> + +<!ELEMENT blockquote %Block;> +<!ATTLIST blockquote + %attrs; + cite %URI; #IMPLIED + > + +<!--=================== Inserted/Deleted Text ============================--> + +<!-- + ins/del are allowed in block and inline content, but its + inappropriate to include block content within an ins element + occurring in inline content. +--> +<!ELEMENT ins %Flow;> +<!ATTLIST ins + %attrs; + cite %URI; #IMPLIED + datetime %Datetime; #IMPLIED + > + +<!ELEMENT del %Flow;> +<!ATTLIST del + %attrs; + cite %URI; #IMPLIED + datetime %Datetime; #IMPLIED + > + +<!--================== The Anchor Element ================================--> + +<!-- content is %Inline; except that anchors shouldn't be nested --> + +<!ELEMENT a %a.content;> +<!ATTLIST a + %attrs; + %focus; + charset %Charset; #IMPLIED + type %ContentType; #IMPLIED + name NMTOKEN #IMPLIED + href %URI; #IMPLIED + hreflang %LanguageCode; #IMPLIED + rel %LinkTypes; #IMPLIED + rev %LinkTypes; #IMPLIED + shape %Shape; "rect" + coords %Coords; #IMPLIED + > + +<!--===================== Inline Elements ================================--> + +<!ELEMENT span %Inline;> <!-- generic language/style container --> +<!ATTLIST span + %attrs; + > + +<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride --> +<!ATTLIST bdo + %coreattrs; + %events; + lang %LanguageCode; #IMPLIED + xml:lang %LanguageCode; #IMPLIED + dir (ltr|rtl) #REQUIRED + > + +<!ELEMENT br EMPTY> <!-- forced line break --> +<!ATTLIST br + %coreattrs; + > + +<!ELEMENT em %Inline;> <!-- emphasis --> +<!ATTLIST em %attrs;> + +<!ELEMENT strong %Inline;> <!-- strong emphasis --> +<!ATTLIST strong %attrs;> + +<!ELEMENT dfn %Inline;> <!-- definitional --> +<!ATTLIST dfn %attrs;> + +<!ELEMENT code %Inline;> <!-- program code --> +<!ATTLIST code %attrs;> + +<!ELEMENT samp %Inline;> <!-- sample --> +<!ATTLIST samp %attrs;> + +<!ELEMENT kbd %Inline;> <!-- something user would type --> +<!ATTLIST kbd %attrs;> + +<!ELEMENT var %Inline;> <!-- variable --> +<!ATTLIST var %attrs;> + +<!ELEMENT cite %Inline;> <!-- citation --> +<!ATTLIST cite %attrs;> + +<!ELEMENT abbr %Inline;> <!-- abbreviation --> +<!ATTLIST abbr %attrs;> + +<!ELEMENT acronym %Inline;> <!-- acronym --> +<!ATTLIST acronym %attrs;> + +<!ELEMENT q %Inline;> <!-- inlined quote --> +<!ATTLIST q + %attrs; + cite %URI; #IMPLIED + > + +<!ELEMENT sub %Inline;> <!-- subscript --> +<!ATTLIST sub %attrs;> + +<!ELEMENT sup %Inline;> <!-- superscript --> +<!ATTLIST sup %attrs;> + +<!ELEMENT tt %Inline;> <!-- fixed pitch font --> +<!ATTLIST tt %attrs;> + +<!ELEMENT i %Inline;> <!-- italic font --> +<!ATTLIST i %attrs;> + +<!ELEMENT b %Inline;> <!-- bold font --> +<!ATTLIST b %attrs;> + +<!ELEMENT big %Inline;> <!-- bigger font --> +<!ATTLIST big %attrs;> + +<!ELEMENT small %Inline;> <!-- smaller font --> +<!ATTLIST small %attrs;> + +<!--==================== Object ======================================--> +<!-- + object is used to embed objects as part of HTML pages. + param elements should precede other content. Parameters + can also be expressed as attribute/value pairs on the + object element itself when brevity is desired. +--> + +<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*> +<!ATTLIST object + %attrs; + declare (declare) #IMPLIED + classid %URI; #IMPLIED + codebase %URI; #IMPLIED + data %URI; #IMPLIED + type %ContentType; #IMPLIED + codetype %ContentType; #IMPLIED + archive %UriList; #IMPLIED + standby %Text; #IMPLIED + height %Length; #IMPLIED + width %Length; #IMPLIED + usemap %URI; #IMPLIED + name NMTOKEN #IMPLIED + tabindex %Number; #IMPLIED + > + +<!-- + param is used to supply a named property value. + In XML it would seem natural to follow RDF and support an + abbreviated syntax where the param elements are replaced + by attribute value pairs on the object start tag. +--> +<!ELEMENT param EMPTY> +<!ATTLIST param + id ID #IMPLIED + name CDATA #IMPLIED + value CDATA #IMPLIED + valuetype (data|ref|object) "data" + type %ContentType; #IMPLIED + > + +<!--=================== Images ===========================================--> + +<!-- + To avoid accessibility problems for people who aren't + able to see the image, you should provide a text + description using the alt and longdesc attributes. + In addition, avoid the use of server-side image maps. + Note that in this DTD there is no name attribute. That + is only available in the transitional and frameset DTD. +--> + +<!ELEMENT img EMPTY> +<!ATTLIST img + %attrs; + src %URI; #REQUIRED + alt %Text; #REQUIRED + longdesc %URI; #IMPLIED + height %Length; #IMPLIED + width %Length; #IMPLIED + usemap %URI; #IMPLIED + ismap (ismap) #IMPLIED + > + +<!-- usemap points to a map element which may be in this document + or an external document, although the latter is not widely supported --> + +<!--================== Client-side image maps ============================--> + +<!-- These can be placed in the same document or grouped in a + separate document although this isn't yet widely supported --> + +<!ELEMENT map ((%block; | form | %misc;)+ | area+)> +<!ATTLIST map + %i18n; + %events; + id ID #REQUIRED + class CDATA #IMPLIED + style %StyleSheet; #IMPLIED + title %Text; #IMPLIED + name NMTOKEN #IMPLIED + > + +<!ELEMENT area EMPTY> +<!ATTLIST area + %attrs; + %focus; + shape %Shape; "rect" + coords %Coords; #IMPLIED + href %URI; #IMPLIED + nohref (nohref) #IMPLIED + alt %Text; #REQUIRED + > + +<!--================ Forms ===============================================--> +<!ELEMENT form %form.content;> <!-- forms shouldn't be nested --> + +<!ATTLIST form + %attrs; + action %URI; #REQUIRED + method (get|post) "get" + enctype %ContentType; "application/x-www-form-urlencoded" + onsubmit %Script; #IMPLIED + onreset %Script; #IMPLIED + accept %ContentTypes; #IMPLIED + accept-charset %Charsets; #IMPLIED + > + +<!-- + Each label must not contain more than ONE field + Label elements shouldn't be nested. +--> +<!ELEMENT label %Inline;> +<!ATTLIST label + %attrs; + for IDREF #IMPLIED + accesskey %Character; #IMPLIED + onfocus %Script; #IMPLIED + onblur %Script; #IMPLIED + > + +<!ENTITY % InputType + "(text | password | checkbox | + radio | submit | reset | + file | hidden | image | button)" + > + +<!-- the name attribute is required for all but submit & reset --> + +<!ELEMENT input EMPTY> <!-- form control --> +<!ATTLIST input + %attrs; + %focus; + type %InputType; "text" + name CDATA #IMPLIED + value CDATA #IMPLIED + checked (checked) #IMPLIED + disabled (disabled) #IMPLIED + readonly (readonly) #IMPLIED + size CDATA #IMPLIED + maxlength %Number; #IMPLIED + src %URI; #IMPLIED + alt CDATA #IMPLIED + usemap %URI; #IMPLIED + onselect %Script; #IMPLIED + onchange %Script; #IMPLIED + accept %ContentTypes; #IMPLIED + > + +<!ELEMENT select (optgroup|option)+> <!-- option selector --> +<!ATTLIST select + %attrs; + name CDATA #IMPLIED + size %Number; #IMPLIED + multiple (multiple) #IMPLIED + disabled (disabled) #IMPLIED + tabindex %Number; #IMPLIED + onfocus %Script; #IMPLIED + onblur %Script; #IMPLIED + onchange %Script; #IMPLIED + > + +<!ELEMENT optgroup (option)+> <!-- option group --> +<!ATTLIST optgroup + %attrs; + disabled (disabled) #IMPLIED + label %Text; #REQUIRED + > + +<!ELEMENT option (#PCDATA)> <!-- selectable choice --> +<!ATTLIST option + %attrs; + selected (selected) #IMPLIED + disabled (disabled) #IMPLIED + label %Text; #IMPLIED + value CDATA #IMPLIED + > + +<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field --> +<!ATTLIST textarea + %attrs; + %focus; + name CDATA #IMPLIED + rows %Number; #REQUIRED + cols %Number; #REQUIRED + disabled (disabled) #IMPLIED + readonly (readonly) #IMPLIED + onselect %Script; #IMPLIED + onchange %Script; #IMPLIED + > + +<!-- + The fieldset element is used to group form fields. + Only one legend element should occur in the content + and if present should only be preceded by whitespace. +--> +<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*> +<!ATTLIST fieldset + %attrs; + > + +<!ELEMENT legend %Inline;> <!-- fieldset label --> +<!ATTLIST legend + %attrs; + accesskey %Character; #IMPLIED + > + +<!-- + Content is %Flow; excluding a, form and form controls +--> +<!ELEMENT button %button.content;> <!-- push button --> +<!ATTLIST button + %attrs; + %focus; + name CDATA #IMPLIED + value CDATA #IMPLIED + type (button|submit|reset) "submit" + disabled (disabled) #IMPLIED + > + +<!--======================= Tables =======================================--> + +<!-- Derived from IETF HTML table standard, see [RFC1942] --> + +<!-- + The border attribute sets the thickness of the frame around the + table. The default units are screen pixels. + + The frame attribute specifies which parts of the frame around + the table should be rendered. The values are not the same as + CALS to avoid a name clash with the valign attribute. +--> +<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)"> + +<!-- + The rules attribute defines which rules to draw between cells: + + If rules is absent then assume: + "none" if border is absent or border="0" otherwise "all" +--> + +<!ENTITY % TRules "(none | groups | rows | cols | all)"> + +<!-- horizontal alignment attributes for cell contents + + char alignment char, e.g. char=':' + charoff offset for alignment char +--> +<!ENTITY % cellhalign + "align (left|center|right|justify|char) #IMPLIED + char %Character; #IMPLIED + charoff %Length; #IMPLIED" + > + +<!-- vertical alignment attributes for cell contents --> +<!ENTITY % cellvalign + "valign (top|middle|bottom|baseline) #IMPLIED" + > + +<!ELEMENT table + (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))> +<!ELEMENT caption %Inline;> +<!ELEMENT thead (tr)+> +<!ELEMENT tfoot (tr)+> +<!ELEMENT tbody (tr)+> +<!ELEMENT colgroup (col)*> +<!ELEMENT col EMPTY> +<!ELEMENT tr (th|td)+> +<!ELEMENT th %Flow;> +<!ELEMENT td %Flow;> + +<!ATTLIST table + %attrs; + summary %Text; #IMPLIED + width %Length; #IMPLIED + border %Pixels; #IMPLIED + frame %TFrame; #IMPLIED + rules %TRules; #IMPLIED + cellspacing %Length; #IMPLIED + cellpadding %Length; #IMPLIED + > + +<!ATTLIST caption + %attrs; + > + +<!-- +colgroup groups a set of col elements. It allows you to group +several semantically related columns together. +--> +<!ATTLIST colgroup + %attrs; + span %Number; "1" + width %MultiLength; #IMPLIED + %cellhalign; + %cellvalign; + > + +<!-- + col elements define the alignment properties for cells in + one or more columns. + + The width attribute specifies the width of the columns, e.g. + + width=64 width in screen pixels + width=0.5* relative width of 0.5 + + The span attribute causes the attributes of one + col element to apply to more than one column. +--> +<!ATTLIST col + %attrs; + span %Number; "1" + width %MultiLength; #IMPLIED + %cellhalign; + %cellvalign; + > + +<!-- + Use thead to duplicate headers when breaking table + across page boundaries, or for static headers when + tbody sections are rendered in scrolling panel. + + Use tfoot to duplicate footers when breaking table + across page boundaries, or for static footers when + tbody sections are rendered in scrolling panel. + + Use multiple tbody sections when rules are needed + between groups of table rows. +--> +<!ATTLIST thead + %attrs; + %cellhalign; + %cellvalign; + > + +<!ATTLIST tfoot + %attrs; + %cellhalign; + %cellvalign; + > + +<!ATTLIST tbody + %attrs; + %cellhalign; + %cellvalign; + > + +<!ATTLIST tr + %attrs; + %cellhalign; + %cellvalign; + > + + +<!-- Scope is simpler than headers attribute for common tables --> +<!ENTITY % Scope "(row|col|rowgroup|colgroup)"> + +<!-- th is for headers, td for data and for cells acting as both --> + +<!ATTLIST th + %attrs; + abbr %Text; #IMPLIED + axis CDATA #IMPLIED + headers IDREFS #IMPLIED + scope %Scope; #IMPLIED + rowspan %Number; "1" + colspan %Number; "1" + %cellhalign; + %cellvalign; + > + +<!ATTLIST td + %attrs; + abbr %Text; #IMPLIED + axis CDATA #IMPLIED + headers IDREFS #IMPLIED + scope %Scope; #IMPLIED + rowspan %Number; "1" + colspan %Number; "1" + %cellhalign; + %cellvalign; + > + diff --git a/testing/dtd/xhtml1-transitional.dtd b/testing/dtd/xhtml1-transitional.dtd new file mode 100755 index 0000000..4ac1571 --- /dev/null +++ b/testing/dtd/xhtml1-transitional.dtd @@ -0,0 +1,1220 @@ +<!-- + Extensible HTML version 1.0 Transitional DTD + + This is the same as HTML 4 Transitional except for + changes due to the differences between XML and SGML. + + Namespace = http://www.w3.org/1999/xhtml + + For further information, see: http://www.w3.org/TR/xhtml1 + + Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio), + All Rights Reserved. + + This DTD module is identified by the PUBLIC and SYSTEM identifiers: + + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" + + $Revision: 1.2 $ + $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 =========================--> + +<!ENTITY % HTMLlat1 PUBLIC + "-//W3C//ENTITIES Latin 1 for XHTML//EN" + "xhtml-lat1.ent"> +%HTMLlat1; + +<!ENTITY % HTMLsymbol PUBLIC + "-//W3C//ENTITIES Symbols for XHTML//EN" + "xhtml-symbol.ent"> +%HTMLsymbol; + +<!ENTITY % HTMLspecial PUBLIC + "-//W3C//ENTITIES Special for XHTML//EN" + "xhtml-special.ent"> +%HTMLspecial; + +<!--================== Imported Names ====================================--> + +<!ENTITY % ContentType "CDATA"> + <!-- media type, as per [RFC2045] --> + +<!ENTITY % ContentTypes "CDATA"> + <!-- comma-separated list of media types, as per [RFC2045] --> + +<!ENTITY % Charset "CDATA"> + <!-- a character encoding, as per [RFC2045] --> + +<!ENTITY % Charsets "CDATA"> + <!-- a space separated list of character encodings, as per [RFC2045] --> + +<!ENTITY % LanguageCode "NMTOKEN"> + <!-- a language code, as per [RFC3066] --> + +<!ENTITY % Character "CDATA"> + <!-- a single character, as per section 2.2 of [XML] --> + +<!ENTITY % Number "CDATA"> + <!-- one or more digits --> + +<!ENTITY % LinkTypes "CDATA"> + <!-- space-separated list of link types --> + +<!ENTITY % MediaDesc "CDATA"> + <!-- single or comma-separated list of media descriptors --> + +<!ENTITY % URI "CDATA"> + <!-- a Uniform Resource Identifier, see [RFC2396] --> + +<!ENTITY % UriList "CDATA"> + <!-- a space separated list of Uniform Resource Identifiers --> + +<!ENTITY % Datetime "CDATA"> + <!-- date and time information. ISO date format --> + +<!ENTITY % Script "CDATA"> + <!-- script expression --> + +<!ENTITY % StyleSheet "CDATA"> + <!-- style sheet data --> + +<!ENTITY % Text "CDATA"> + <!-- used for titles etc. --> + +<!ENTITY % FrameTarget "NMTOKEN"> + <!-- render in this frame --> + +<!ENTITY % Length "CDATA"> + <!-- nn for pixels or nn% for percentage length --> + +<!ENTITY % MultiLength "CDATA"> + <!-- pixel, percentage, or relative --> + +<!ENTITY % Pixels "CDATA"> + <!-- integer representing length in pixels --> + +<!-- these are used for image maps --> + +<!ENTITY % Shape "(rect|circle|poly|default)"> + +<!ENTITY % Coords "CDATA"> + <!-- comma separated list of lengths --> + +<!-- used for object, applet, img, input and iframe --> +<!ENTITY % ImgAlign "(top|middle|bottom|left|right)"> + +<!-- a color using sRGB: #RRGGBB as Hex values --> +<!ENTITY % Color "CDATA"> + +<!-- There are also 16 widely known color names with their sRGB values: + + Black = #000000 Green = #008000 + Silver = #C0C0C0 Lime = #00FF00 + Gray = #808080 Olive = #808000 + White = #FFFFFF Yellow = #FFFF00 + Maroon = #800000 Navy = #000080 + Red = #FF0000 Blue = #0000FF + Purple = #800080 Teal = #008080 + Fuchsia= #FF00FF Aqua = #00FFFF +--> + +<!--=================== Generic Attributes ===============================--> + +<!-- core attributes common to most elements + id document-wide unique id + class space separated list of classes + style associated style info + title advisory title/amplification +--> +<!ENTITY % coreattrs + "id ID #IMPLIED + class CDATA #IMPLIED + style %StyleSheet; #IMPLIED + title %Text; #IMPLIED" + > + +<!-- internationalization attributes + lang language code (backwards compatible) + xml:lang language code (as per XML 1.0 spec) + dir direction for weak/neutral text +--> +<!ENTITY % i18n + "lang %LanguageCode; #IMPLIED + xml:lang %LanguageCode; #IMPLIED + dir (ltr|rtl) #IMPLIED" + > + +<!-- attributes for common UI events + onclick a pointer button was clicked + ondblclick a pointer button was double clicked + onmousedown a pointer button was pressed down + onmouseup a pointer button was released + onmousemove a pointer was moved onto the element + onmouseout a pointer was moved away from the element + onkeypress a key was pressed and released + onkeydown a key was pressed down + onkeyup a key was released +--> +<!ENTITY % events + "onclick %Script; #IMPLIED + ondblclick %Script; #IMPLIED + onmousedown %Script; #IMPLIED + onmouseup %Script; #IMPLIED + onmouseover %Script; #IMPLIED + onmousemove %Script; #IMPLIED + onmouseout %Script; #IMPLIED + onkeypress %Script; #IMPLIED + onkeydown %Script; #IMPLIED + onkeyup %Script; #IMPLIED" + > + +<!-- attributes for elements that can get the focus + accesskey accessibility key character + tabindex position in tabbing order + onfocus the element got the focus + onblur the element lost the focus +--> +<!ENTITY % focus + "accesskey %Character; #IMPLIED + tabindex %Number; #IMPLIED + onfocus %Script; #IMPLIED + onblur %Script; #IMPLIED" + > + +<!ENTITY % attrs "%coreattrs; %i18n; %events;"> + +<!-- text alignment for p, div, h1-h6. The default is + align="left" for ltr headings, "right" for rtl --> + +<!ENTITY % TextAlign "align (left|center|right|justify) #IMPLIED"> + +<!--=================== Text Elements ====================================--> + +<!ENTITY % special.extra + "object | applet | img | map | iframe"> + +<!ENTITY % special.basic + "br | span | bdo"> + +<!ENTITY % special + "%special.basic; | %special.extra;"> + +<!ENTITY % fontstyle.extra "big | small | font | basefont"> + +<!ENTITY % fontstyle.basic "tt | i | b | u + | s | strike "> + +<!ENTITY % fontstyle "%fontstyle.basic; | %fontstyle.extra;"> + +<!ENTITY % phrase.extra "sub | sup"> +<!ENTITY % phrase.basic "em | strong | dfn | code | q | + samp | kbd | var | cite | abbr | acronym"> + +<!ENTITY % phrase "%phrase.basic; | %phrase.extra;"> + +<!ENTITY % inline.forms "input | select | textarea | label | button"> + +<!-- these can occur at block or inline level --> +<!ENTITY % misc.inline "ins | del | script"> + +<!-- these can only occur at block level --> +<!ENTITY % misc "noscript | %misc.inline;"> + +<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;"> + +<!-- %Inline; covers inline or "text-level" elements --> +<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*"> + +<!--================== Block level elements ==============================--> + +<!ENTITY % heading "h1|h2|h3|h4|h5|h6"> +<!ENTITY % lists "ul | ol | dl | menu | dir"> +<!ENTITY % blocktext "pre | hr | blockquote | address | center | noframes"> + +<!ENTITY % block + "p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table"> + +<!-- %Flow; mixes block and inline and is used for list items etc. --> +<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*"> + +<!--================== Content models for exclusions =====================--> + +<!-- a elements use %Inline; excluding a --> + +<!ENTITY % a.content + "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*"> + +<!-- pre uses %Inline excluding img, object, applet, big, small, + font, or basefont --> + +<!ENTITY % pre.content + "(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; | + %inline.forms; | %misc.inline;)*"> + +<!-- form uses %Flow; excluding form --> + +<!ENTITY % form.content "(#PCDATA | %block; | %inline; | %misc;)*"> + +<!-- button uses %Flow; but excludes a, form, form controls, iframe --> + +<!ENTITY % button.content + "(#PCDATA | p | %heading; | div | %lists; | %blocktext; | + table | br | span | bdo | object | applet | img | map | + %fontstyle; | %phrase; | %misc;)*"> + +<!--================ Document Structure ==================================--> + +<!-- the namespace URI designates the document profile --> + +<!ELEMENT html (head, body)> +<!ATTLIST html + %i18n; + id ID #IMPLIED + xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml' + > + +<!--================ Document Head =======================================--> + +<!ENTITY % head.misc "(script|style|meta|link|object|isindex)*"> + +<!-- content model is %head.misc; combined with a single + title and an optional base element in any order --> + +<!ELEMENT head (%head.misc;, + ((title, %head.misc;, (base, %head.misc;)?) | + (base, %head.misc;, (title, %head.misc;))))> + +<!ATTLIST head + %i18n; + id ID #IMPLIED + profile %URI; #IMPLIED + > + +<!-- The title element is not considered part of the flow of text. + It should be displayed, for example as the page header or + window title. Exactly one title is required per document. + --> +<!ELEMENT title (#PCDATA)> +<!ATTLIST title + %i18n; + id ID #IMPLIED + > + +<!-- document base URI --> + +<!ELEMENT base EMPTY> +<!ATTLIST base + id ID #IMPLIED + href %URI; #IMPLIED + target %FrameTarget; #IMPLIED + > + +<!-- generic metainformation --> +<!ELEMENT meta EMPTY> +<!ATTLIST meta + %i18n; + id ID #IMPLIED + http-equiv CDATA #IMPLIED + name CDATA #IMPLIED + content CDATA #REQUIRED + scheme CDATA #IMPLIED + > + +<!-- + Relationship values can be used in principle: + + a) for document specific toolbars/menus when used + with the link element in document head e.g. + start, contents, previous, next, index, end, help + b) to link to a separate style sheet (rel="stylesheet") + c) to make a link to a script (rel="script") + d) by stylesheets to control how collections of + html nodes are rendered into printed documents + e) to make a link to a printable version of this document + e.g. a PostScript or PDF version (rel="alternate" media="print") +--> + +<!ELEMENT link EMPTY> +<!ATTLIST link + %attrs; + charset %Charset; #IMPLIED + href %URI; #IMPLIED + hreflang %LanguageCode; #IMPLIED + type %ContentType; #IMPLIED + rel %LinkTypes; #IMPLIED + rev %LinkTypes; #IMPLIED + media %MediaDesc; #IMPLIED + target %FrameTarget; #IMPLIED + > + +<!-- style info, which may include CDATA sections --> +<!ELEMENT style (#PCDATA)> +<!ATTLIST style + %i18n; + id ID #IMPLIED + type %ContentType; #REQUIRED + media %MediaDesc; #IMPLIED + title %Text; #IMPLIED + xml:space (preserve) #FIXED 'preserve' + > + +<!-- script statements, which may include CDATA sections --> +<!-- added for doxygen: async (async) #IMPLIED --> +<!ELEMENT script (#PCDATA)> +<!ATTLIST script + id ID #IMPLIED + charset %Charset; #IMPLIED + type %ContentType; #REQUIRED + language CDATA #IMPLIED + src %URI; #IMPLIED + async (async) #IMPLIED + defer (defer) #IMPLIED + xml:space (preserve) #FIXED 'preserve' + > + +<!-- alternate content container for non script-based rendering --> + +<!ELEMENT noscript %Flow;> +<!ATTLIST noscript + %attrs; + > + +<!--======================= Frames =======================================--> + +<!-- inline subwindow --> + +<!ELEMENT iframe %Flow;> +<!ATTLIST iframe + %coreattrs; + longdesc %URI; #IMPLIED + name NMTOKEN #IMPLIED + src %URI; #IMPLIED + frameborder (1|0) "1" + marginwidth %Pixels; #IMPLIED + marginheight %Pixels; #IMPLIED + scrolling (yes|no|auto) "auto" + align %ImgAlign; #IMPLIED + height %Length; #IMPLIED + width %Length; #IMPLIED + > + +<!-- alternate content container for non frame-based rendering --> + +<!ELEMENT noframes %Flow;> +<!ATTLIST noframes + %attrs; + > + +<!--=================== Document Body ====================================--> + +<!ELEMENT body %Flow;> +<!ATTLIST body + %attrs; + onload %Script; #IMPLIED + onunload %Script; #IMPLIED + background %URI; #IMPLIED + bgcolor %Color; #IMPLIED + text %Color; #IMPLIED + link %Color; #IMPLIED + vlink %Color; #IMPLIED + alink %Color; #IMPLIED + > + +<!ELEMENT div %Flow;> <!-- generic language/style container --> +<!ATTLIST div + %attrs; + %TextAlign; + > + +<!--=================== Paragraphs =======================================--> + +<!ELEMENT p %Inline;> +<!ATTLIST p + %attrs; + %TextAlign; + > + +<!--=================== Headings =========================================--> + +<!-- + There are six levels of headings from h1 (the most important) + to h6 (the least important). +--> + +<!ELEMENT h1 %Inline;> +<!ATTLIST h1 + %attrs; + %TextAlign; + > + +<!ELEMENT h2 %Inline;> +<!ATTLIST h2 + %attrs; + %TextAlign; + > + +<!ELEMENT h3 %Inline;> +<!ATTLIST h3 + %attrs; + %TextAlign; + > + +<!ELEMENT h4 %Inline;> +<!ATTLIST h4 + %attrs; + %TextAlign; + > + +<!ELEMENT h5 %Inline;> +<!ATTLIST h5 + %attrs; + %TextAlign; + > + +<!ELEMENT h6 %Inline;> +<!ATTLIST h6 + %attrs; + %TextAlign; + > + +<!--=================== Lists ============================================--> + +<!-- Unordered list bullet styles --> + +<!ENTITY % ULStyle "(disc|square|circle)"> + +<!-- Unordered list --> + +<!ELEMENT ul (li)+> +<!ATTLIST ul + %attrs; + type %ULStyle; #IMPLIED + compact (compact) #IMPLIED + > + +<!-- Ordered list numbering style + + 1 arabic numbers 1, 2, 3, ... + a lower alpha a, b, c, ... + A upper alpha A, B, C, ... + i lower roman i, ii, iii, ... + I upper roman I, II, III, ... + + The style is applied to the sequence number which by default + is reset to 1 for the first list item in an ordered list. +--> +<!ENTITY % OLStyle "CDATA"> + +<!-- Ordered (numbered) list --> + +<!ELEMENT ol (li)+> +<!ATTLIST ol + %attrs; + type %OLStyle; #IMPLIED + compact (compact) #IMPLIED + start %Number; #IMPLIED + > + +<!-- single column list (DEPRECATED) --> +<!ELEMENT menu (li)+> +<!ATTLIST menu + %attrs; + compact (compact) #IMPLIED + > + +<!-- multiple column list (DEPRECATED) --> +<!ELEMENT dir (li)+> +<!ATTLIST dir + %attrs; + compact (compact) #IMPLIED + > + +<!-- LIStyle is constrained to: "(%ULStyle;|%OLStyle;)" --> +<!ENTITY % LIStyle "CDATA"> + +<!-- list item --> + +<!ELEMENT li %Flow;> +<!ATTLIST li + %attrs; + type %LIStyle; #IMPLIED + value %Number; #IMPLIED + > + +<!-- definition lists - dt for term, dd for its definition --> + +<!ELEMENT dl (dt|dd)+> +<!ATTLIST dl + %attrs; + compact (compact) #IMPLIED + > + +<!ELEMENT dt %Inline;> +<!ATTLIST dt + %attrs; + > + +<!ELEMENT dd %Flow;> +<!ATTLIST dd + %attrs; + > + +<!--=================== Address ==========================================--> + +<!-- information on author --> + +<!ELEMENT address (#PCDATA | %inline; | %misc.inline; | p)*> +<!ATTLIST address + %attrs; + > + +<!--=================== Horizontal Rule ==================================--> + +<!ELEMENT hr EMPTY> +<!ATTLIST hr + %attrs; + align (left|center|right) #IMPLIED + noshade (noshade) #IMPLIED + size %Pixels; #IMPLIED + width %Length; #IMPLIED + > + +<!--=================== Preformatted Text ================================--> + +<!-- content is %Inline; excluding + "img|object|applet|big|small|sub|sup|font|basefont" --> + +<!ELEMENT pre %pre.content;> +<!ATTLIST pre + %attrs; + width %Number; #IMPLIED + xml:space (preserve) #FIXED 'preserve' + > + +<!--=================== Block-like Quotes ================================--> + +<!ELEMENT blockquote %Flow;> +<!ATTLIST blockquote + %attrs; + cite %URI; #IMPLIED + > + +<!--=================== Text alignment ===================================--> + +<!-- center content --> +<!ELEMENT center %Flow;> +<!ATTLIST center + %attrs; + > + +<!--=================== Inserted/Deleted Text ============================--> + +<!-- + ins/del are allowed in block and inline content, but its + inappropriate to include block content within an ins element + occurring in inline content. +--> +<!ELEMENT ins %Flow;> +<!ATTLIST ins + %attrs; + cite %URI; #IMPLIED + datetime %Datetime; #IMPLIED + > + +<!ELEMENT del %Flow;> +<!ATTLIST del + %attrs; + cite %URI; #IMPLIED + datetime %Datetime; #IMPLIED + > + +<!--================== 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 + %attrs; + %focus; + charset %Charset; #IMPLIED + type %ContentType; #IMPLIED + name NMTOKEN #IMPLIED + doxygen %URI; #IMPLIED + href %URI; #IMPLIED + hreflang %LanguageCode; #IMPLIED + rel %LinkTypes; #IMPLIED + rev %LinkTypes; #IMPLIED + shape %Shape; "rect" + coords %Coords; #IMPLIED + target %FrameTarget; #IMPLIED + > + +<!--===================== Inline Elements ================================--> + +<!ELEMENT span %Inline;> <!-- generic language/style container --> +<!ATTLIST span + %attrs; + > + +<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride --> +<!ATTLIST bdo + %coreattrs; + %events; + lang %LanguageCode; #IMPLIED + xml:lang %LanguageCode; #IMPLIED + dir (ltr|rtl) #REQUIRED + > + +<!ELEMENT br EMPTY> <!-- forced line break --> +<!ATTLIST br + %coreattrs; + clear (left|all|right|none) "none" + > + +<!ELEMENT em %Inline;> <!-- emphasis --> +<!ATTLIST em %attrs;> + +<!ELEMENT strong %Inline;> <!-- strong emphasis --> +<!ATTLIST strong %attrs;> + +<!ELEMENT dfn %Inline;> <!-- definitional --> +<!ATTLIST dfn %attrs;> + +<!ELEMENT code %Inline;> <!-- program code --> +<!ATTLIST code %attrs;> + +<!ELEMENT samp %Inline;> <!-- sample --> +<!ATTLIST samp %attrs;> + +<!ELEMENT kbd %Inline;> <!-- something user would type --> +<!ATTLIST kbd %attrs;> + +<!ELEMENT var %Inline;> <!-- variable --> +<!ATTLIST var %attrs;> + +<!ELEMENT cite %Inline;> <!-- citation --> +<!ATTLIST cite %attrs;> + +<!ELEMENT abbr %Inline;> <!-- abbreviation --> +<!ATTLIST abbr %attrs;> + +<!ELEMENT acronym %Inline;> <!-- acronym --> +<!ATTLIST acronym %attrs;> + +<!ELEMENT q %Inline;> <!-- inlined quote --> +<!ATTLIST q + %attrs; + cite %URI; #IMPLIED + > + +<!ELEMENT sub %Inline;> <!-- subscript --> +<!ATTLIST sub %attrs;> + +<!ELEMENT sup %Inline;> <!-- superscript --> +<!ATTLIST sup %attrs;> + +<!ELEMENT tt %Inline;> <!-- fixed pitch font --> +<!ATTLIST tt %attrs;> + +<!ELEMENT i %Inline;> <!-- italic font --> +<!ATTLIST i %attrs;> + +<!ELEMENT b %Inline;> <!-- bold font --> +<!ATTLIST b %attrs;> + +<!ELEMENT big %Inline;> <!-- bigger font --> +<!ATTLIST big %attrs;> + +<!ELEMENT small %Inline;> <!-- smaller font --> +<!ATTLIST small %attrs;> + +<!ELEMENT u %Inline;> <!-- underline --> +<!ATTLIST u %attrs;> + +<!ELEMENT s %Inline;> <!-- strike-through --> +<!ATTLIST s %attrs;> + +<!ELEMENT strike %Inline;> <!-- strike-through --> +<!ATTLIST strike %attrs;> + +<!ELEMENT basefont EMPTY> <!-- base font size --> +<!ATTLIST basefont + id ID #IMPLIED + size CDATA #REQUIRED + color %Color; #IMPLIED + face CDATA #IMPLIED + > + +<!ELEMENT font %Inline;> <!-- local change to font --> +<!ATTLIST font + %coreattrs; + %i18n; + size CDATA #IMPLIED + color %Color; #IMPLIED + face CDATA #IMPLIED + > + +<!--==================== Object ======================================--> +<!-- + object is used to embed objects as part of HTML pages. + param elements should precede other content. Parameters + can also be expressed as attribute/value pairs on the + object element itself when brevity is desired. +--> + +<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*> +<!ATTLIST object + %attrs; + declare (declare) #IMPLIED + classid %URI; #IMPLIED + codebase %URI; #IMPLIED + data %URI; #IMPLIED + type %ContentType; #IMPLIED + codetype %ContentType; #IMPLIED + archive %UriList; #IMPLIED + standby %Text; #IMPLIED + height %Length; #IMPLIED + width %Length; #IMPLIED + usemap %URI; #IMPLIED + name NMTOKEN #IMPLIED + tabindex %Number; #IMPLIED + align %ImgAlign; #IMPLIED + border %Pixels; #IMPLIED + hspace %Pixels; #IMPLIED + vspace %Pixels; #IMPLIED + > + +<!-- + param is used to supply a named property value. + In XML it would seem natural to follow RDF and support an + abbreviated syntax where the param elements are replaced + by attribute value pairs on the object start tag. +--> +<!ELEMENT param EMPTY> +<!ATTLIST param + id ID #IMPLIED + name CDATA #REQUIRED + value CDATA #IMPLIED + valuetype (data|ref|object) "data" + type %ContentType; #IMPLIED + > + +<!--=================== Java applet ==================================--> +<!-- + One of code or object attributes must be present. + Place param elements before other content. +--> +<!ELEMENT applet (#PCDATA | param | %block; | form | %inline; | %misc;)*> +<!ATTLIST applet + %coreattrs; + codebase %URI; #IMPLIED + archive CDATA #IMPLIED + code CDATA #IMPLIED + object CDATA #IMPLIED + alt %Text; #IMPLIED + name NMTOKEN #IMPLIED + width %Length; #REQUIRED + height %Length; #REQUIRED + align %ImgAlign; #IMPLIED + hspace %Pixels; #IMPLIED + vspace %Pixels; #IMPLIED + > + +<!--=================== Images ===========================================--> + +<!-- + To avoid accessibility problems for people who aren't + able to see the image, you should provide a text + description using the alt and longdesc attributes. + In addition, avoid the use of server-side image maps. +--> + +<!ELEMENT img EMPTY> +<!ATTLIST img + %attrs; + src %URI; #REQUIRED + alt %Text; #REQUIRED + name NMTOKEN #IMPLIED + longdesc %URI; #IMPLIED + height %Length; #IMPLIED + width %Length; #IMPLIED + usemap %URI; #IMPLIED + ismap (ismap) #IMPLIED + align %ImgAlign; #IMPLIED + border %Length; #IMPLIED + hspace %Pixels; #IMPLIED + vspace %Pixels; #IMPLIED + > + +<!-- usemap points to a map element which may be in this document + or an external document, although the latter is not widely supported --> + +<!--================== Client-side image maps ============================--> + +<!-- These can be placed in the same document or grouped in a + separate document although this isn't yet widely supported --> + +<!ELEMENT map ((%block; | form | %misc;)+ | area+)> +<!ATTLIST map + %i18n; + %events; + id ID #REQUIRED + class CDATA #IMPLIED + style %StyleSheet; #IMPLIED + title %Text; #IMPLIED + name CDATA #IMPLIED + > + +<!ELEMENT area EMPTY> +<!ATTLIST area + %attrs; + %focus; + shape %Shape; "rect" + coords %Coords; #IMPLIED + href %URI; #IMPLIED + nohref (nohref) #IMPLIED + alt %Text; #REQUIRED + target %FrameTarget; #IMPLIED + > + +<!--================ Forms ===============================================--> + +<!ELEMENT form %form.content;> <!-- forms shouldn't be nested --> + +<!ATTLIST form + %attrs; + action %URI; #REQUIRED + method (get|post) "get" + name NMTOKEN #IMPLIED + enctype %ContentType; "application/x-www-form-urlencoded" + onsubmit %Script; #IMPLIED + onreset %Script; #IMPLIED + accept %ContentTypes; #IMPLIED + accept-charset %Charsets; #IMPLIED + target %FrameTarget; #IMPLIED + > + +<!-- + Each label must not contain more than ONE field + Label elements shouldn't be nested. +--> +<!ELEMENT label %Inline;> +<!ATTLIST label + %attrs; + for IDREF #IMPLIED + accesskey %Character; #IMPLIED + onfocus %Script; #IMPLIED + onblur %Script; #IMPLIED + > + +<!ENTITY % InputType + "(text | password | checkbox | + radio | submit | reset | + file | hidden | image | button)" + > + +<!-- the name attribute is required for all but submit & reset --> + +<!ELEMENT input EMPTY> <!-- form control --> +<!ATTLIST input + %attrs; + %focus; + type %InputType; "text" + name CDATA #IMPLIED + value CDATA #IMPLIED + checked (checked) #IMPLIED + disabled (disabled) #IMPLIED + readonly (readonly) #IMPLIED + size CDATA #IMPLIED + maxlength %Number; #IMPLIED + src %URI; #IMPLIED + alt CDATA #IMPLIED + usemap %URI; #IMPLIED + onselect %Script; #IMPLIED + onchange %Script; #IMPLIED + accept %ContentTypes; #IMPLIED + align %ImgAlign; #IMPLIED + > + +<!ELEMENT select (optgroup|option)+> <!-- option selector --> +<!ATTLIST select + %attrs; + name CDATA #IMPLIED + size %Number; #IMPLIED + multiple (multiple) #IMPLIED + disabled (disabled) #IMPLIED + tabindex %Number; #IMPLIED + onfocus %Script; #IMPLIED + onblur %Script; #IMPLIED + onchange %Script; #IMPLIED + > + +<!ELEMENT optgroup (option)+> <!-- option group --> +<!ATTLIST optgroup + %attrs; + disabled (disabled) #IMPLIED + label %Text; #REQUIRED + > + +<!ELEMENT option (#PCDATA)> <!-- selectable choice --> +<!ATTLIST option + %attrs; + selected (selected) #IMPLIED + disabled (disabled) #IMPLIED + label %Text; #IMPLIED + value CDATA #IMPLIED + > + +<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field --> +<!ATTLIST textarea + %attrs; + %focus; + name CDATA #IMPLIED + rows %Number; #REQUIRED + cols %Number; #REQUIRED + disabled (disabled) #IMPLIED + readonly (readonly) #IMPLIED + onselect %Script; #IMPLIED + onchange %Script; #IMPLIED + > + +<!-- + The fieldset element is used to group form fields. + Only one legend element should occur in the content + and if present should only be preceded by whitespace. +--> +<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*> +<!ATTLIST fieldset + %attrs; + > + +<!ENTITY % LAlign "(top|bottom|left|right)"> + +<!ELEMENT legend %Inline;> <!-- fieldset label --> +<!ATTLIST legend + %attrs; + accesskey %Character; #IMPLIED + align %LAlign; #IMPLIED + > + +<!-- + Content is %Flow; excluding a, form, form controls, iframe +--> +<!ELEMENT button %button.content;> <!-- push button --> +<!ATTLIST button + %attrs; + %focus; + name CDATA #IMPLIED + value CDATA #IMPLIED + type (button|submit|reset) "submit" + disabled (disabled) #IMPLIED + > + +<!-- single-line text input control (DEPRECATED) --> +<!ELEMENT isindex EMPTY> +<!ATTLIST isindex + %coreattrs; + %i18n; + prompt %Text; #IMPLIED + > + +<!--======================= Tables =======================================--> + +<!-- Derived from IETF HTML table standard, see [RFC1942] --> + +<!-- + The border attribute sets the thickness of the frame around the + table. The default units are screen pixels. + + The frame attribute specifies which parts of the frame around + the table should be rendered. The values are not the same as + CALS to avoid a name clash with the valign attribute. +--> +<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)"> + +<!-- + The rules attribute defines which rules to draw between cells: + + If rules is absent then assume: + "none" if border is absent or border="0" otherwise "all" +--> + +<!ENTITY % TRules "(none | groups | rows | cols | all)"> + +<!-- horizontal placement of table relative to document --> +<!ENTITY % TAlign "(left|center|right)"> + +<!-- horizontal alignment attributes for cell contents + + char alignment char, e.g. char=':' + charoff offset for alignment char +--> +<!ENTITY % cellhalign + "align (left|center|right|justify|char) #IMPLIED + char %Character; #IMPLIED + charoff %Length; #IMPLIED" + > + +<!-- vertical alignment attributes for cell contents --> +<!ENTITY % cellvalign + "valign (top|middle|bottom|baseline) #IMPLIED" + > + +<!ELEMENT table + (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))> +<!ELEMENT caption %Inline;> +<!ELEMENT thead (tr)+> +<!ELEMENT tfoot (tr)+> +<!ELEMENT tbody (tr)+> +<!ELEMENT colgroup (col)*> +<!ELEMENT col EMPTY> +<!ELEMENT tr (th|td)+> +<!ELEMENT th %Flow;> +<!ELEMENT td %Flow;> + +<!ATTLIST table + %attrs; + summary %Text; #IMPLIED + width %Length; #IMPLIED + border %Pixels; #IMPLIED + frame %TFrame; #IMPLIED + rules %TRules; #IMPLIED + cellspacing %Length; #IMPLIED + cellpadding %Length; #IMPLIED + align %TAlign; #IMPLIED + bgcolor %Color; #IMPLIED + > + +<!ENTITY % CAlign "(top|bottom|left|right)"> + +<!ATTLIST caption + %attrs; + align %CAlign; #IMPLIED + > + +<!-- +colgroup groups a set of col elements. It allows you to group +several semantically related columns together. +--> +<!ATTLIST colgroup + %attrs; + span %Number; "1" + width %MultiLength; #IMPLIED + %cellhalign; + %cellvalign; + > + +<!-- + col elements define the alignment properties for cells in + one or more columns. + + The width attribute specifies the width of the columns, e.g. + + width=64 width in screen pixels + width=0.5* relative width of 0.5 + + The span attribute causes the attributes of one + col element to apply to more than one column. +--> +<!ATTLIST col + %attrs; + span %Number; "1" + width %MultiLength; #IMPLIED + %cellhalign; + %cellvalign; + > + +<!-- + Use thead to duplicate headers when breaking table + across page boundaries, or for static headers when + tbody sections are rendered in scrolling panel. + + Use tfoot to duplicate footers when breaking table + across page boundaries, or for static footers when + tbody sections are rendered in scrolling panel. + + Use multiple tbody sections when rules are needed + between groups of table rows. +--> +<!ATTLIST thead + %attrs; + %cellhalign; + %cellvalign; + > + +<!ATTLIST tfoot + %attrs; + %cellhalign; + %cellvalign; + > + +<!ATTLIST tbody + %attrs; + %cellhalign; + %cellvalign; + > + +<!ATTLIST tr + %attrs; + %cellhalign; + %cellvalign; + bgcolor %Color; #IMPLIED + > + +<!-- Scope is simpler than headers attribute for common tables --> +<!ENTITY % Scope "(row|col|rowgroup|colgroup)"> + +<!-- th is for headers, td for data and for cells acting as both --> + +<!ATTLIST th + %attrs; + abbr %Text; #IMPLIED + axis CDATA #IMPLIED + headers IDREFS #IMPLIED + scope %Scope; #IMPLIED + rowspan %Number; "1" + colspan %Number; "1" + %cellhalign; + %cellvalign; + nowrap (nowrap) #IMPLIED + bgcolor %Color; #IMPLIED + width %Length; #IMPLIED + height %Length; #IMPLIED + > + +<!ATTLIST td + %attrs; + abbr %Text; #IMPLIED + axis CDATA #IMPLIED + headers IDREFS #IMPLIED + scope %Scope; #IMPLIED + rowspan %Number; "1" + colspan %Number; "1" + %cellhalign; + %cellvalign; + nowrap (nowrap) #IMPLIED + bgcolor %Color; #IMPLIED + width %Length; #IMPLIED + height %Length; #IMPLIED + > + diff --git a/testing/runtests.py b/testing/runtests.py index 83647c6..452c36e 100644 --- a/testing/runtests.py +++ b/testing/runtests.py @@ -30,6 +30,41 @@ class Tester: return (True,'Difference between generated output and reference:\n%s' % diff) return (False,'') + def cleanup_xmllint(self,errmsg): + msg = errmsg.split('\n') + rtnmsg = "" + for o in msg: + if (o): + if (o.startswith("I/O error : Attempt")): + pass + else: + if (rtnmsg): + rtnmsg += '\n' + rtnmsg += o + return rtnmsg + + def cleanup_xmllint_docbook(self,errmsg): + # For future work, first get everything valid XML + msg = self.cleanup_xmllint(errmsg).split('\n') + rtnmsg = "" + cnt = 0 + for o in msg: + if (o): + if (cnt): + cnt -= 1 + pass + elif (o.endswith("does not validate")): + pass + elif (o.find("no DTD found!")!=-1): + pass + elif (o.find("is not an NCName")!=-1): + cnt = 2 + else: + if (rtnmsg): + rtnmsg += '\n' + rtnmsg += o + return rtnmsg + def get_config(self): config = {} with open(self.args.inputdir+'/'+self.test,'r') as f: @@ -40,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 @@ -52,11 +87,41 @@ class Tester: with open(self.test_out+'/Doxyfile','a') as f: print('INPUT=%s/%s' % (self.args.inputdir,self.test), file=f) print('STRIP_FROM_PATH=%s' % self.args.inputdir, file=f) - print('XML_OUTPUT=%s/out' % self.test_out, file=f) print('EXAMPLE_PATH=%s' % self.args.inputdir, file=f) if 'config' in self.config: for option in self.config['config']: print(option, file=f) + if (self.args.xml): + print('GENERATE_XML=YES', file=f) + print('XML_OUTPUT=%s/out' % self.test_out, file=f) + else: + print('GENERATE_XML=NO', file=f) + if (self.args.rtf): + print('GENERATE_RTF=YES', file=f) + print('RTF_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 + print('HTML_OUTPUT=%s/html' % self.test_out, file=f) + print('HTML_FILE_EXTENSION=.xhtml', file=f) + if (self.args.pdf): + print('GENERATE_LATEX=YES', file=f) + print('LATEX_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') @@ -64,11 +129,15 @@ class Tester: # run doxygen if (sys.platform == 'win32'): - redir=' > nul:' + redir=' > nul:' else: - redir=' 2> /dev/null' - 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)); + redir=' 2> /dev/null > /dev/null' + + if (self.args.noredir): + redir='' + + if os.system('%s %s/Doxyfile %s' % (self.args.doxygen,self.test_out,redir))!=0: + print('Error: failed to run %s on %s/Doxyfile' % (self.args.doxygen,self.test_out)) sys.exit(1) # update the reference data for this test @@ -98,32 +167,128 @@ class Tester: # check the relevant files of a doxygen run with the reference material def perform_test(self,testmgr): + if (sys.platform == 'win32'): + redir=' > nul:' + separ='&' + else: + redir=' 2> /dev/null' + separ=';' + + if (self.args.noredir): + redir='' + + failed_xml=False + failed_html=False + failed_latex=False + failed_docbook=False + failed_rtf=False + msg = () # look for files to check against the reference - if 'check' in self.config: - for check in self.config['check']: - check_file='%s/out/%s' % (self.test_out,check) - # check if the file we need to check is actually generated - if not os.path.isfile(check_file): - testmgr.ok(False,self.test_name,msg='Non-existing file %s after \'check:\' statement' % check_file) - return - # convert output to canonical form - data = os.popen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file)).read() - if data: - # strip version - data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n') - else: - testmgr.ok(False,self.test_name,msg='Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out)) - return - out_file='%s/%s' % (self.test_out,check) - with open(out_file,'w') as f: - print(data,file=f) - ref_file='%s/%s/%s' % (self.args.inputdir,self.test_id,check) - (failed,msg) = self.compare_ok(out_file,ref_file,self.test_name) - if failed: - testmgr.ok(False,self.test_name,msg) - return - shutil.rmtree(self.test_out,ignore_errors=True) + if self.args.xml: + failed_xml=True + if 'check' in self.config: + for check in self.config['check']: + check_file='%s/out/%s' % (self.test_out,check) + # check if the file we need to check is actually generated + if not os.path.isfile(check_file): + # 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: + # strip version + data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n') + else: + msg += ('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out),) + break + out_file='%s/%s' % (self.test_out,check) + with open(out_file,'w') as f: + print(data,file=f) + ref_file='%s/%s/%s' % (self.args.inputdir,self.test_id,check) + (failed_xml,xml_msg) = self.compare_ok(out_file,ref_file,self.test_name) + if failed_xml: + msg+= (xml_msg,) + break + if not failed_xml and not self.args.keep: + 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'): + redirx=' 2> %s/temp >nul:'%html_output + else: + redirx='2>%s/temp >/dev/null'%html_output + exe_string = '%s --path dtd --nonet --postvalid %s/*xhtml %s %s ' % (self.args.xmllint,html_output,redirx,separ) + exe_string += 'more "%s/temp"' % (html_output) + failed_html=False + xmllint_out = os.popen(exe_string).read() + xmllint_out = self.cleanup_xmllint(xmllint_out) + if xmllint_out: + msg += (xmllint_out,) + failed_html=True + elif not self.args.keep: + shutil.rmtree(html_output,ignore_errors=True) + if (self.args.pdf): + failed_latex=False + latex_output='%s/latex' % self.test_out + if (sys.platform == 'win32'): + redirl='>nul: 2>temp' + else: + redirl='>/dev/null 2>temp' + exe_string = 'cd %s %s echo "q" | make %s %s' % (latex_output,separ,redirl,separ) + exe_string += 'more temp' + latex_out = os.popen(exe_string).read() + if latex_out.find("Error")!=-1: + msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",) + failed_html=True + elif open(latex_output + "/refman.log",'r').read().find("Emergency stop")!= -1: + msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",) + failed_html=True + elif not self.args.keep: + shutil.rmtree(latex_output,ignore_errors=True) + + if failed_xml or failed_html or failed_latex or failed_docbook or failed_rtf: + testmgr.ok(False,self.test_name,msg) + return + testmgr.ok(True,self.test_name) + if not self.args.keep: + shutil.rmtree(self.test_out,ignore_errors=True) def run(self,testmgr): if self.update: @@ -138,6 +303,8 @@ class TestManager: self.num_tests = len(tests) self.count=1 self.passed=0 + if self.args.xhtml: + self.prepare_dtd() print('1..%d' % self.num_tests) def ok(self,result,test_name,msg='Ok'): @@ -147,8 +314,9 @@ class TestManager: else: print('not ok %s - %s' % (self.count,test_name)) print('-------------------------------------') - print(msg) - print('-------------------------------------') + for o in msg: + print(o) + print('-------------------------------------') self.count = self.count + 1 def result(self): @@ -162,36 +330,90 @@ class TestManager: for test in self.tests: tester = Tester(self.args,test) tester.run(self) - return 0 if self.args.updateref else self.result() + res=self.result() + if self.args.xhtml and not res and not self.args.keep: + shutil.rmtree("dtd",ignore_errors=True) + return 0 if self.args.updateref else res + + def prepare_dtd(self): + shutil.rmtree("dtd",ignore_errors=True) + shutil.copytree(self.args.inputdir+"/dtd", "dtd") def main(): # argument handling parser = argparse.ArgumentParser(description='run doxygen tests') - parser.add_argument('--updateref',help='update the reference data for a 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='id of the test to perform') - parser.add_argument('--all',help='perform all tests',action="store_true") - parser.add_argument('--inputdir',nargs='?',default='.',help='input directory containing the tests') - parser.add_argument('--outputdir',nargs='?',default='.',help='output directory to write the doxygen output to') - args = parser.parse_args() - - # sanity check + parser.add_argument('--updateref',help= + 'update the reference files. Should be used in combination with -id to ' + 'update the reference file(s) for the given test',action="store_true") + parser.add_argument('--doxygen',nargs='?',default='doxygen',help= + 'path/name of the doxygen executable') + parser.add_argument('--xmllint',nargs='?',default='xmllint',help= + 'path/name of the xmllint executable') + parser.add_argument('--id',nargs='+',dest='ids',action='append',type=int,help= + 'run test with number n only (the option can be specified to run test with ' + 'number n only (the option can be specified multiple times') + parser.add_argument('--start_id',dest='start_id',type=int,help= + 'run tests starting with number n') + parser.add_argument('--end_id',dest='end_id',type=int,help= + 'run tests ending with number n') + parser.add_argument('--all',help= + 'can be used in combination with -updateref to update the reference files ' + 'for all tests.',action="store_true") + parser.add_argument('--inputdir',nargs='?',default='.',help= + 'input directory containing the tests') + parser.add_argument('--outputdir',nargs='?',default='.',help= + 'output directory to write the doxygen output to') + parser.add_argument('--noredir',help= + 'disable redirection of doxygen warnings',action="store_true") + parser.add_argument('--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) 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') starting_directory = os.getcwd() os.chdir(args.inputdir) - # find the tests to run - if args.ids: # test ids are given by user - tests = [] + # find the tests to run + tests = [] + if args.start_id: + if args.end_id: + for id in range(args.start_id, args.end_id + 1): + tests.append(glob.glob('%s_*'%id)) + tests.append(glob.glob('0%s_*'%id)) + tests.append(glob.glob('00%s_*'%id)) + else: + parser.error('--start_id requires --end_id') + elif args.end_id: + parser.error('--end_id requires --start_id') + if args.ids: # test ids are given by user for id in list(itertools.chain.from_iterable(args.ids)): tests.append(glob.glob('%s_*'%id)) tests.append(glob.glob('0%s_*'%id)) tests.append(glob.glob('00%s_*'%id)) - 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 Binary files differindex 3ff17d8..5c9f51f 100644 --- a/testing/sample.png +++ b/testing/sample.png diff --git a/vhdlparser/ErrorHandler.h b/vhdlparser/ErrorHandler.h index 55286b4..7500a5f 100644 --- a/vhdlparser/ErrorHandler.h +++ b/vhdlparser/ErrorHandler.h @@ -30,7 +30,7 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str); // Called when the parser cannot continue parsing. // last - the last token successfully parsed. // unexpected - the token at which the error occurs. - // production - the production in which this error occurrs. + // production - the production in which this error occurs. virtual void handleParseError(Token *last, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *parser) { error_count++; fprintf(stderr, "Encountered: %s at: %d:%d while parsing: %s\n", addUnicodeEscapes(unexpected->image).c_str(), unexpected->beginLine, unexpected->beginColumn, production.c_str()); diff --git a/vhdlparser/Makefile b/vhdlparser/Makefile index 4725470..84bdccf 100644 --- a/vhdlparser/Makefile +++ b/vhdlparser/Makefile @@ -7,16 +7,48 @@ # 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 +# Documents produced by doxygen are derivative works derived from the # input used in their production; they are not affected by this license. # -regenerate: - rm -f CharStream.cc CharStream.h ErrorHandler.h ParseException.cc ParseException.h \ +# +# Files generated by javacc +# +GEN_FILES=CharStream.cc CharStream.h ErrorHandler.h ParseException.cc ParseException.h \ Token.cc Token.h TokenManager.h TokenMgrError.cc TokenMgrError.h VhdlParser.cc VhdlParser.h \ VhdlParserConstants.h VhdlParserTokenManager.cc VhdlParserTokenManager.h \ JavaCC.h - javacc vhdlparser.jj - cp JavaCC.h.in JavaCC.h +# +# Generate parser (default target) +# +# when generating the parser with debug options it will look like: +# make JAVACC_FLAGS=-debug_parser +# or +# make JAVACC_FLAGS="-debug_parser -debug_lookahead" +# +# Available debug options: +# -debug_parser +# -debug_token_manager +# -debug_lookahead +# +# For other javacc settings / options consult the documentation of javacc. + +regenerate: + @rm -f $(GEN_FILES) + @javacc $(JAVACC_FLAGS) vhdlparser.jj + @cp JavaCC.h.in JavaCC.h + +# +# reset the generated files back to their versions from git. +# + +reset_gen_files: + @rm -f $(GEN_FILES) + @git checkout $(GEN_FILES) + +help: + @echo "Targets:" + @echo " regenerate (default)" + @echo " reset_gen_files" FORCE: diff --git a/vhdlparser/ParseException.cc b/vhdlparser/ParseException.cc index 31ee7a3..99649af 100644 --- a/vhdlparser/ParseException.cc +++ b/vhdlparser/ParseException.cc @@ -53,7 +53,7 @@ namespace parser { /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token - * followng this token will (therefore) be the first error token. + * following this token will (therefore) be the first error token. */ Token currentToken; diff --git a/vhdlparser/ParseException.h b/vhdlparser/ParseException.h index 1f3a3dc..b025912 100644 --- a/vhdlparser/ParseException.h +++ b/vhdlparser/ParseException.h @@ -50,7 +50,7 @@ class ParseException { /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token - * followng this token will (therefore) be the first error token. + * following this token will (therefore) be the first error token. */ Token currentToken; diff --git a/vhdlparser/VhdlParser.cc b/vhdlparser/VhdlParser.cc index a3de14a..4cf8ec0 100644 --- a/vhdlparser/VhdlParser.cc +++ b/vhdlparser/VhdlParser.cc @@ -10398,11 +10398,11 @@ s+=",";s+=s1; jj_consume_token(SEMI_T); } -QStringList ql1=QStringList::split(",",s,FALSE); +QCStringList ql1=QCStringList::split(",",s); for (uint j=0;j<ql1.count();j++) { - QStringList ql=QStringList::split(".",ql1[j],FALSE); - QCString it=ql[1].utf8(); + QCStringList ql=QCStringList::split(".",ql1[j]); + QCString it=ql[1]; if ( parse_sec==0 && Config_getBool(SHOW_INCLUDE_FILES) ) { VhdlParser::addVhdlType(it.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::USE,it.data(),"_use_",Public); diff --git a/vhdlparser/VhdlParserErrorHandler.hpp b/vhdlparser/VhdlParserErrorHandler.hpp index d98f029..9576ce6 100644 --- a/vhdlparser/VhdlParserErrorHandler.hpp +++ b/vhdlparser/VhdlParserErrorHandler.hpp @@ -7,32 +7,47 @@ #include "VhdlParser.h" #include "ErrorHandler.h" #include "vhdlstring.h" +#include "message.h" + +const char *getVhdlFileName(void); namespace vhdl { namespace parser { -class VhdlErrorHandler: public ErrorHandler +class VhdlErrorHandler: public ErrorHandler { - virtual void handleUnexpectedToken(int expectedKind, JAVACC_STRING_TYPE expectedToken, Token *actual, VhdlParser *parser) + virtual void handleUnexpectedToken(int expectedKind, JAVACC_STRING_TYPE expectedToken, Token *actual, VhdlParser *parser) { - fprintf(stderr,"\n\n syntax error at line: %d : %s\n", actual->beginLine,actual->image.data()); + warn(getVhdlFileName(),actual->beginLine,"syntax error '%s'",actual->image.data()); error_count++; throw std::exception(); } - virtual void handleParseError(Token *last, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *parser) + virtual void handleParseError(Token *last, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *parser) { - fprintf(stderr,"\n\n unexpected token at line: %d %s\n", last->beginLine,unexpected->image.data()); + warn(getVhdlFileName(),last->beginLine,"unexpected token: '%s'", unexpected->image.data()); error_count++; throw std::exception(); } virtual void handleOtherError(JAVACC_STRING_TYPE message, VhdlParser *parser) { - fprintf(stderr, "\n\n unexpected error: %s\n", (char*)message.c_str()); + warn(getVhdlFileName(), -1, "unexpected error: '%s'", (char*)message.c_str()); error_count++; throw std::exception(); } }; + +class VhdlTokenManagerErrorHandler: public TokenManagerErrorHandler { + virtual void lexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, VhdlParserTokenManager* token_manager) + { + warn(getVhdlFileName(),errorLine,"Lexical error, Encountered: '%c' after: '%s'",curChar, (EOFSeen? "EOF" : (const char*)errorAfter.c_str())); + } + + virtual void lexicalError(JAVACC_STRING_TYPE errorMessage, VhdlParserTokenManager* token_manager) + { + warn(getVhdlFileName(),-1,"Unknown error: '%s'", (char*)errorMessage.c_str()); + } + }; } } diff --git a/vhdlparser/VhdlParserIF.cpp b/vhdlparser/VhdlParserIF.cpp index f9f689b..3a6746f 100644 --- a/vhdlparser/VhdlParserIF.cpp +++ b/vhdlparser/VhdlParserIF.cpp @@ -14,6 +14,8 @@ void VhdlParserIF::parseVhdlfile(const char* inputBuffer,bool inLine) JAVACC_STRING_TYPE s =inputBuffer; CharStream *stream = new CharStream(s.c_str(), (int)s.size(), 1, 1); VhdlParserTokenManager *tokenManager = new VhdlParserTokenManager(stream); + VhdlTokenManagerErrorHandler *myTokErr=new VhdlTokenManagerErrorHandler(); + tokenManager->setErrorHandler(myTokErr); myParser=new VhdlParser(tokenManager); VhdlErrorHandler *myErr=new VhdlErrorHandler(); myParser->setErrorHandler(myErr); diff --git a/vhdlparser/vhdlparser.jj b/vhdlparser/vhdlparser.jj index d21afe1..af1bd34 100644 --- a/vhdlparser/vhdlparser.jj +++ b/vhdlparser/vhdlparser.jj @@ -2412,11 +2412,11 @@ QCString unconstraint_array_definition() : {QCString s,s1,s2,s3;} { <USE_T> s=selected_name()(<COMMA_T> s1=selected_name(){s+=",";s+=s1;})* <SEMI_T> { - QStringList ql1=QStringList::split(",",s,FALSE); + QCStringList ql1=QCStringList::split(",",s); for (uint j=0;j<ql1.count();j++) { - QStringList ql=QStringList::split(".",ql1[j],FALSE); - QCString it=ql[1].utf8(); + QCStringList ql=QCStringList::split(".",ql1[j]); + QCString it=ql[1]; if ( parse_sec==0 && Config_getBool(SHOW_INCLUDE_FILES) ) { VhdlParser::addVhdlType(it.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::USE,it.data(),"_use_",Public); diff --git a/vhdlparser/vhdlstring.h b/vhdlparser/vhdlstring.h index fde6ce4..4c64440 100644 --- a/vhdlparser/vhdlstring.h +++ b/vhdlparser/vhdlstring.h @@ -9,6 +9,7 @@ /** @brief Minimal string class with std::string like behaviour that fulfills the JavaCC * string requirements. */ + class VhdlString { public: @@ -93,6 +94,8 @@ class VhdlString void clear() { free(m_str); init(); } VhdlString &operator+=(char c) { char s[2]; s[0]=c; s[1]=0; return append(s); } VhdlString &operator+=(const char *s) { return append(s); } + VhdlString &operator+=(VhdlString s) { return append(s); } + VhdlString operator+ (const char *s) { return append(s); } private: void init() { m_str=(char*)calloc(1,1); m_len=0; } @@ -100,4 +103,9 @@ class VhdlString int m_len; }; +// declare it static otherwise we will get: +// multiple definition of `operator+(char const*, VhdlString)' +// as we are in an include file +static VhdlString operator+ (const char *s, VhdlString v) { return VhdlString(s).append(v); } + #endif |