diff options
51 files changed, 1378 insertions, 513 deletions
@@ -1,7 +1,7 @@ -DOXYGEN Version 1.5.9 +DOXYGEN Version 1.5.9-20090522 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (30 April 2009) +Dimitri van Heesch (22 May 2009) @@ -1,4 +1,4 @@ -DOXYGEN Version 1.5.9 +DOXYGEN Version 1.5.9_20090522 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (30 April 2009) +Dimitri van Heesch (dimitri@stack.nl) (22 May 2009) diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index 63d7efe..5928524 100644 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -8,8 +8,8 @@ const int messageTimeout = 5000; //!< status bar message timeout in millisec. MainWindow &MainWindow::instance() { - static MainWindow theInstance; - return theInstance; + static MainWindow *theInstance = new MainWindow; + return *theInstance; } MainWindow::MainWindow() diff --git a/doc/commands.doc b/doc/commands.doc index 4d8e5f7..6e9c2e8 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -181,9 +181,14 @@ documentation: The following subsections provide a list of all commands that are recognized by doxygen. Unrecognized commands are treated as normal text. -<h2>\htmlonly <center> --- \endhtmlonly - Structural indicators - \htmlonly --- </center>\endhtmlonly</h2> + +\htmlonly <center> \endhtmlonly +<h2> +\htmlonly --- \endhtmlonly +Structural indicators +\htmlonly --- \endhtmlonly +</h2> +\htmlonly </center> \endhtmlonly \section cmdaddtogroup \\addtogroup <name> [(title)] \addindex \\addtogroup @@ -383,6 +388,7 @@ doxygen. Unrecognized commands are treated as normal text. (e.g. C). The file \c manual.c in the example directory shows how to use this command. + \htmlonly Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> for the corresponding HTML documentation that is generated by doxygen. @@ -484,6 +490,7 @@ doxygen. Unrecognized commands are treated as normal text. (e.g. C). The file \c manual.c in the example directory shows how to use this command. + \htmlonly Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> for the corresponding HTML documentation that is generated by doxygen. @@ -581,6 +588,7 @@ doxygen. Unrecognized commands are treated as normal text. \ref cmdprivate "\\private". The file \c manual.c in the example directory shows how to use this command. + \htmlonly Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> for the corresponding HTML documentation that is generated by doxygen. @@ -856,9 +864,13 @@ doxygen. Unrecognized commands are treated as normal text. <hr> -<h2>\htmlonly <center> --- \endhtmlonly - Section indicators - \htmlonly --- </center>\endhtmlonly</h2> +\htmlonly <center> \endhtmlonly +<h2> +\htmlonly --- \endhtmlonly +Section indicators +\htmlonly --- \endhtmlonly +</h2> +\htmlonly </center>\endhtmlonly <hr> \section cmdattention \\attention { attention text } @@ -1125,7 +1137,9 @@ class Example { }; \endverbatim - <p>Where the following aliases are defined in the configuration file:<p> + + Where the following aliases are defined in the configuration file: + \verbatim ALIASES = "english=\if english" \ "endenglish=\endif" \ @@ -1442,9 +1456,14 @@ void memcpy(void *dest, const void *src, size_t n); \\xrefitem command. <hr> -<h2>\htmlonly <center> --- \endhtmlonly - Commands to create links - \htmlonly --- </center>\endhtmlonly</h2> + +\htmlonly <center> \endhtmlonly +<h2> +\htmlonly --- \endhtmlonly +Commands to create links +\htmlonly --- \endhtmlonly +</h2> +\htmlonly </center>\endhtmlonly \section cmdaddindex \\addindex (text) @@ -1617,9 +1636,13 @@ Make sure you have first read \ref intro "the introduction". <hr> -<h2>\htmlonly <center> --- \endhtmlonly - Commands for displaying examples - \htmlonly --- </center>\endhtmlonly</h2> +\htmlonly <center> \endhtmlonly +<h2> +\htmlonly --- \endhtmlonly +Commands for displaying examples +\htmlonly --- \endhtmlonly +</h2> +\htmlonly </center>\endhtmlonly \section cmddontinclude \\dontinclude <file-name> @@ -1786,9 +1809,14 @@ Make sure you have first read \ref intro "the introduction". \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file. <hr> -<h2>\htmlonly <center> --- \endhtmlonly - Commands for visual enhancements - \htmlonly --- </center>\endhtmlonly</h2> + +\htmlonly <center> \endhtmlonly +<h2> +\htmlonly --- \endhtmlonly +Commands for visual enhancements +\htmlonly --- \endhtmlonly +</h2> +\htmlonly </center>\endhtmlonly \section cmda \\a <word> @@ -2432,11 +2460,16 @@ class Receiver character has to be escaped in some cases, because it is used to prevent auto-linking to word that is also a documented class or struct. -<h2>\htmlonly <center> --- \endhtmlonly - Commands included for Qt compatibility - \htmlonly --- </center>\endhtmlonly</h2> <hr> +\htmlonly <center> \endhtmlonly +<h2> +\htmlonly --- \endhtmlonly +Commands included for Qt compatibility +\htmlonly --- \endhtmlonly +</h2> +\htmlonly </center>\endhtmlonly + The following commands are supported to remain compatible to the Qt class browser generator. Do \e not use these commands in your own documentation. <ul> diff --git a/doc/diagrams.doc b/doc/diagrams.doc index 9295360..7e07cef 100644 --- a/doc/diagrams.doc +++ b/doc/diagrams.doc @@ -135,7 +135,7 @@ that doxygen can generate: \htmlonly Click <a href="$(DOXYGEN_DOCDIR)/examples/diagrams/html/index.html">here</a> - for the corresponding HTML documentation that is generated by doxygen<br> + for the corresponding HTML documentation that is generated by doxygen<br/> (<code>EXTRACT_ALL</code> = <code>YES</code> is used here). \endhtmlonly diff --git a/doc/index.doc b/doc/index.doc index 0debece..ed1abbf 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -18,8 +18,7 @@ \if logo_on <center> \htmlonly -<img align=center lowsrc="doxygen_logo_low.gif" src="doxygen_logo.gif" - width=634 height=197 alt="doxygen"><br> +<img src="doxygen_logo.gif" width="634" height="197" alt="doxygen"/><br/> Version: $(VERSION) \endhtmlonly </center> @@ -118,7 +117,7 @@ The third part provides information for developers: \addindex license \addindex GPL -Copyright © 1997-2008 by +Copyright © 1997-2009 by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p> Permission to use, copy, modify, and distribute this software and its @@ -177,7 +176,6 @@ Thanks go to: given me a good start in writing doxygen. <li>All people at Qt Software, for creating a beautiful GUI Toolkit (which is very useful as a Windows/Unix platform abstraction layer :-) -<li>Kevin McBride for maintaining the subversion reporsitory for doxygen. <li>My brother Frank for rendering the logos. <li>Harm van der Heijden for adding HTML help support. @@ -187,8 +185,6 @@ Thanks go to: <li>Parker Waechter for adding the RTF output generator. <li>Joerg Baumann, for adding conditional documentation blocks, PDF links, and the configuration generator. -<li>Matthias Andree for providing a .spec script for building rpms from the - sources. <li>Tim Mensch for adding the todo command. <li>Christian Hammond for redesigning the web-site. <li>Ken Wong for providing the HTML tree view code. diff --git a/doc/language.doc b/doc/language.doc index 884fce8..a7da0df 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other than English (the default). The output language is chosen through the configuration file (with default name and known as Doxyfile). -Currently (version 1.5.8), 38 languages +Currently (version 1.5.9), 38 languages are supported (sorted alphabetically): Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, @@ -39,16 +39,16 @@ was generated from sources and shows approximately the last version when the translator was updated. \htmlonly -<table align=center cellspacing=0 cellpadding=0 border=0> +<table align="center" cellspacing="0" cellpadding="0" border="0"> <tr bgcolor="#000000"> <td> - <table cellspacing=1 cellpadding=2 border=0> + <table cellspacing="1" cellpadding="2" border="0"> <tr bgcolor="#4040c0"> - <td ><b><font size=+1 color="#ffffff"> Language </font></b></td> - <td ><b><font size=+1 color="#ffffff"> Maintainer </font></b></td> - <td ><b><font size=+1 color="#ffffff"> Contact address </font> - <font size=-2 color="#ffffff">(replace the at and dot)</font></b></td> - <td ><b><font size=+1 color="#ffffff"> Status </font></b></td> + <td ><b><font size="+1" color="#ffffff"> Language </font></b></td> + <td ><b><font size="+1" color="#ffffff"> Maintainer </font></b></td> + <td ><b><font size="+1" color="#ffffff"> Contact address </font> + <font size="-2" color="#ffffff">(replace the at and dot)</font></b></td> + <td ><b><font size="+1" color="#ffffff"> Status </font></b></td> </tr> <!-- table content begin --> @@ -72,20 +72,20 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Catalan</td> - <td>Maximiliano Pin<br>Albert Mora</td> - <td>max.pin at bitroit dot com<br>amora at iua dot upf dot es</td> + <td>Maximiliano Pin<br/>Albert Mora</td> + <td>max.pin at bitroit dot com<br/>amora at iua dot upf dot es</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> <td>Chinese</td> - <td>Li Daobing<br>Wei Liu</td> - <td>lidaobing at gmail dot com<br>liuwei at asiainfo dot com</td> + <td>Li Daobing<br/>Wei Liu</td> + <td>lidaobing at gmail dot com<br/>liuwei at asiainfo dot com</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> <td>Chinese Traditional</td> - <td>Daniel YC Lin<br>Gary Lee</td> - <td>dlin.tw at gmail dot com<br>garywlee at gmail dot com</td> + <td>Daniel YC Lin<br/>Gary Lee</td> + <td>dlin.tw at gmail dot com<br/>garywlee at gmail dot com</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> @@ -150,8 +150,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Hungarian</td> - <td>Ákos Kiss<br>Földvári György</td> - <td>akiss at users dot sourceforge dot net<br>foldvari lost at cyberspace</td> + <td>Ákos Kiss<br/>Földvári György</td> + <td>akiss at users dot sourceforge dot net<br/>foldvari lost at cyberspace</td> <td>1.4.6</td> </tr> <tr bgcolor="#ffffff"> @@ -162,15 +162,15 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Italian</td> - <td>Alessandro Falappa<br>Ahmed Aldo Faisal</td> - <td>alessandro at falappa dot net<br>aaf23 at cam dot ac dot uk</td> + <td>Alessandro Falappa<br/>Ahmed Aldo Faisal</td> + <td>alessandro at falappa dot net<br/>aaf23 at cam dot ac dot uk</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> <td>Japanese</td> - <td>Ryunosuke Satoh<br>Kenji Nagamatsu<br>Iwasa Kazmi</td> - <td>sun594 at hotmail dot com<br>naga at joyful dot club dot ne dot jp<br>iwasa at cosmo-system dot jp</td> - <td>1.5.4</td> + <td>Hiroki Iseri<br/>Ryunosuke Satoh<br/>Kenji Nagamatsu<br/>Iwasa Kazmi</td> + <td>goyoki at gmail dot com<br/>sun594 at hotmail dot com<br/>naga at joyful dot club dot ne dot jp<br/>iwasa at cosmo-system dot jp</td> + <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> <td>JapaneseEn</td> @@ -180,8 +180,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Korean</td> - <td>Kim Taedong<br>SooYoung Jung<br>Richard Kim</td> - <td>fly1004 at gmail dot com<br>jung5000 at gmail dot com<br>ryk at dspwiz dot com</td> + <td>Kim Taedong<br/>SooYoung Jung<br/>Richard Kim</td> + <td>fly1004 at gmail dot com<br/>jung5000 at gmail dot com<br/>ryk at dspwiz dot com</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> @@ -192,8 +192,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Lithuanian</td> - <td>Tomas Simonaitis<br>Mindaugas Radzius<br>Aidas Berukstis</td> - <td>haden at homelan dot lt<br>mindaugasradzius at takas dot lt<br>aidasber at takas dot lt</td> + <td>Tomas Simonaitis<br/>Mindaugas Radzius<br/>Aidas Berukstis</td> + <td>haden at homelan dot lt<br/>mindaugasradzius at takas dot lt<br/>aidasber at takas dot lt</td> <td>1.4.6</td> </tr> <tr bgcolor="#ffffff"> @@ -216,8 +216,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Polish</td> - <td>Piotr Kaminski<br>Grzegorz Kowal</td> - <td>Piotr.Kaminski at ctm dot gdynia dot pl<br>g_kowal at poczta dot onet dot pl</td> + <td>Piotr Kaminski<br/>Grzegorz Kowal</td> + <td>Piotr.Kaminski at ctm dot gdynia dot pl<br/>g_kowal at poczta dot onet dot pl</td> <td>1.4.6</td> </tr> <tr bgcolor="#ffffff"> @@ -228,8 +228,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Romanian</td> - <td>Ionut Dumitrascu<br>Alexandru Iosup</td> - <td>reddumy at yahoo dot com<br>aiosup at yahoo dot com</td> + <td>Ionut Dumitrascu<br/>Alexandru Iosup</td> + <td>reddumy at yahoo dot com<br/>aiosup at yahoo dot com</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> @@ -264,15 +264,15 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Spanish</td> - <td>Bartomeu<br>Francisco Oltra Thennet<br>David Vaquero</td> - <td>bartomeu at loteria3cornella dot com<br>foltra at puc dot cl<br>david at grupoikusnet dot com</td> + <td>Bartomeu<br/>Francisco Oltra Thennet<br/>David Vaquero</td> + <td>bartomeu at loteria3cornella dot com<br/>foltra at puc dot cl<br/>david at grupoikusnet dot com</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> <td>Swedish</td> <td>Mikael Hallin</td> <td>mikaelhallin at yahoo dot se</td> - <td>1.4.6</td> + <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> <td>Turkish</td> @@ -350,7 +350,8 @@ when the translator was updated. Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & up-to-date \\ ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23@cam.ac.uk} & ~ \\ \hline - Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & 1.5.4 \\ + Japanese & Hiroki Iseri & {\tt\tiny goyoki@gmail.com} & up-to-date \\ + ~ & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & ~ \\ ~ & Kenji Nagamatsu & {\tt\tiny naga@joyful.club.ne.jp} & ~ \\ ~ & Iwasa Kazmi & {\tt\tiny iwasa@cosmo-system.jp} & ~ \\ \hline @@ -394,7 +395,7 @@ when the translator was updated. ~ & Francisco Oltra Thennet & {\tt\tiny foltra@puc.cl} & ~ \\ ~ & David Vaquero & {\tt\tiny david@grupoikusnet.com} & ~ \\ \hline - Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & 1.4.6 \\ + Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & up-to-date \\ \hline Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3@yahoo.com} & up-to-date \\ \hline @@ -623,7 +624,9 @@ script was developed (located in \c doxygen/doc directory). It extracts the important information about obsolete and new methods from the source files for each of the languages. The information is stored in the <em>translator report</em> ASCII file -(translator_report.txt). \htmlonly If you compiled this documentation +(translator_report.txt). + +\htmlonly If you compiled this documentation from sources and if you have also doxygen sources available the link <a href="../doc/translator_report.txt" ><code>doxygen/doc/translator_report.txt</code></a> should be valid.\endhtmlonly diff --git a/doc/language.tpl b/doc/language.tpl index ca1900e..5664bd4 100644 --- a/doc/language.tpl +++ b/doc/language.tpl @@ -255,7 +255,9 @@ script was developed (located in \c doxygen/doc directory). It extracts the important information about obsolete and new methods from the source files for each of the languages. The information is stored in the <em>translator report</em> ASCII file -(%(translatorReportFileName)s). \htmlonly If you compiled this documentation +(%(translatorReportFileName)s). + +\htmlonly If you compiled this documentation from sources and if you have also doxygen sources available the link %(translatorReportLink)s should be valid.\endhtmlonly diff --git a/doc/maintainers.txt b/doc/maintainers.txt index c5f9f50..754cb1b 100644 --- a/doc/maintainers.txt +++ b/doc/maintainers.txt @@ -99,6 +99,7 @@ Ali Nadalizadeh: nadalizadeh@gmail.com TranslatorPolish Piotr Kaminski: Piotr.Kaminski@ctm.gdynia.pl Grzegorz Kowal: g_kowal@poczta.onet.pl +Krzysztof Kral: krzysztof.kral@gmail.com TranslatorPortuguese Rui Godinho Lopes: ruiglopes@yahoo.com diff --git a/doc/output.doc b/doc/output.doc index 6e37f91..cd2bea3 100644 --- a/doc/output.doc +++ b/doc/output.doc @@ -16,7 +16,7 @@ */ /*! \page output Output Formats -\section output Output Formats +\section output_sec Output Formats \addindex output formats diff --git a/doc/translator.py b/doc/translator.py index af65706..c53fd71 100644 --- a/doc/translator.py +++ b/doc/translator.py @@ -49,6 +49,7 @@ 2005/08/15 - Doxygen's root directory determined primarily from DOXYGEN environment variable. When not found, then relatively to the script. 2007/03/20 - The "translate me!" searched in comments and reported if found. + 2009/05/09 - Changed HTML output to make it confirm to XHTML DTD """ from __future__ import generators @@ -1744,16 +1745,16 @@ class TrManager: # Define templates for HTML table parts of the documentation. htmlTableTpl = '''\ \\htmlonly - <table align=center cellspacing=0 cellpadding=0 border=0> + <table align="center" cellspacing="0" cellpadding="0" border="0"> <tr bgcolor="#000000"> <td> - <table cellspacing=1 cellpadding=2 border=0> + <table cellspacing="1" cellpadding="2" border="0"> <tr bgcolor="#4040c0"> - <td ><b><font size=+1 color="#ffffff"> Language </font></b></td> - <td ><b><font size=+1 color="#ffffff"> Maintainer </font></b></td> - <td ><b><font size=+1 color="#ffffff"> Contact address </font> - <font size=-2 color="#ffffff">(replace the at and dot)</font></b></td> - <td ><b><font size=+1 color="#ffffff"> Status </font></b></td> + <td ><b><font size="+1" color="#ffffff"> Language </font></b></td> + <td ><b><font size="+1" color="#ffffff"> Maintainer </font></b></td> + <td ><b><font size="+1" color="#ffffff"> Contact address </font> + <font size="-2" color="#ffffff">(replace the at and dot)</font></b></td> + <td ><b><font size="+1" color="#ffffff"> Status </font></b></td> </tr> <!-- table content begin --> %s @@ -1792,20 +1793,20 @@ class TrManager: if not mm and self.__maintainersDic.has_key(obj.classId): lm = [ m[0] for m in self.__maintainersDic[obj.classId] ] - mm = '<br>'.join(lm) + mm = '<br/>'.join(lm) le = [ m[1] for m in self.__maintainersDic[obj.classId] ] - ee = '<br>'.join(le) + ee = '<br/>'.join(le) # Mangle the e-mail and replace the entity references. if ee and ee != ' ': # More than one maintainer address separated by <br> can be used. - emails = ee.split('<br>') + emails = ee.split('<br/>') mangled_list = [] for email in emails: name, domain = email.split('@') domain = domain.replace('.', ' dot ') mangled_list.append(name + ' at ' + domain) - ee = '<br>'.join(mangled_list) + ee = '<br/>'.join(mangled_list) if mm: mm = mm.replace('č', 'č') diff --git a/doc/translator_report.txt b/doc/translator_report.txt index 771633d..c6c721d 100644 --- a/doc/translator_report.txt +++ b/doc/translator_report.txt @@ -1,4 +1,4 @@ -(1.5.8) +(1.5.9) Doxygen supports the following 38 languages (sorted alphabetically): @@ -10,7 +10,7 @@ Persian, Polish, Portuguese, Romanian, Russian, Serbian, SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian, and Vietnamese. -Of them, 22 translators are up-to-date, 16 translators are based on +Of them, 24 translators are up-to-date, 14 translators are based on some adapter class, and 2 are English based. ---------------------------------------------------------------------- @@ -31,6 +31,7 @@ still may be some details listed even for them: TranslatorFinnish TranslatorGerman TranslatorItalian + TranslatorJapanese -- Remove the obsolete methods (never used). TranslatorKorean TranslatorMacedonian TranslatorPersian @@ -39,6 +40,7 @@ still may be some details listed even for them: TranslatorSerbianCyrilic TranslatorSerbian TranslatorSpanish + TranslatorSwedish -- The "translate me!" found in a comment. TranslatorTurkish TranslatorVietnamese @@ -48,11 +50,9 @@ obsolete at the end). The other info shows the estimation of Doxygen version when the class was last updated and number of methods that must be implemented to become up-to-date: - TranslatorJapanese 1.5.4 22 methods to implement TranslatorGreek 1.5.4 22 methods to implement TranslatorFrench 1.5.4 22 methods to implement TranslatorDanish 1.5.4 22 methods to implement - TranslatorSwedish 1.4.6 24 methods to implement TranslatorSlovene 1.4.6 24 methods to implement TranslatorPolish 1.4.6 23 methods to implement TranslatorNorwegian 1.4.6 23 methods to implement @@ -349,35 +349,10 @@ TranslatorIndonesian (TranslatorAdapter_1_4_6) 23 methods to implement virtual QCString trNoDescriptionAvailable() -TranslatorJapanese (TranslatorAdapter_1_5_4) 22 methods to implement +TranslatorJapanese (Translator) ------------------ - Implements 194 of the required methods. - - Missing methods (should be implemented): - - virtual QCString trCompoundMembersDescriptionFortran(bool extractAll) - virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single) - virtual QCString trSubprograms() - virtual QCString trModulesListDescription(bool extractAll) - virtual QCString trModulesList() - virtual QCString trTypeConstraints() - virtual QCString trMemberFunctionDocumentationFortran() - virtual QCString trCompoundListDescriptionFortran() - virtual QCString trTypeDocumentation() - virtual QCString trModuleReference(const char * namespaceName) - virtual QCString trModulesMemberDescription(bool extractAll) - virtual QCString trModulesMembers() - virtual QCString trModulesIndex() - virtual QCString trCompoundListFortran() - virtual QCString trDataTypes() - virtual QCString trCompoundIndexFortran() - virtual QCString trSubprogram(bool first_capital, bool singular) - virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate) - virtual QCString trType(bool first_capital, bool singular) - virtual QCString trModule(bool first_capital, bool singular) - virtual QCString trCompoundMembersFortran() - virtual QCString trSubprogramDocumentation() + Implements 216 of the required methods. Obsolete methods (should be removed, never used): @@ -695,37 +670,10 @@ TranslatorSlovene (TranslatorAdapter_1_4_6) 24 methods to implement virtual QCString trSubprogramDocumentation() -TranslatorSwedish (TranslatorAdapter_1_4_6) 24 methods to implement +TranslatorSwedish (Translator) ----------------- - Implements 192 of the required methods. - - Missing methods (should be implemented): - - virtual QCString trCompoundMembersDescriptionFortran(bool extractAll) - virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single) - virtual QCString trSubprograms() - virtual QCString trModulesListDescription(bool extractAll) - virtual QCString trModulesList() - virtual QCString trTypeConstraints() - virtual QCString trMemberFunctionDocumentationFortran() - virtual QCString trCompoundListDescriptionFortran() - virtual QCString trTypeDocumentation() - virtual QCString trModuleReference(const char * namespaceName) - virtual QCString trModulesMemberDescription(bool extractAll) - virtual QCString trModulesMembers() - virtual QCString trModulesIndex() - virtual QCString trCompoundListFortran() - virtual QCString trDataTypes() - virtual QCString trCompoundIndexFortran() - virtual QCString trSubprogram(bool first_capital, bool singular) - virtual QCString trCallerGraph() - virtual QCString trEnumerationValueDocumentation() - virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate) - virtual QCString trType(bool first_capital, bool singular) - virtual QCString trModule(bool first_capital, bool singular) - virtual QCString trCompoundMembersFortran() - virtual QCString trSubprogramDocumentation() + Implements 216 of the required methods. TranslatorUkrainian (TranslatorAdapter_1_4_1) 24 methods to implement diff --git a/src/classdef.cpp b/src/classdef.cpp index 7bd4b48..198fc4d 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -844,7 +844,9 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -862,10 +864,11 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag) } ol.popGeneratorState(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); // FIXME:PARA + //ol.popGeneratorState(); + ol.endParagraph(); } ol.writeSynopsis(); } @@ -903,7 +906,7 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -912,7 +915,6 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType // write documentation if (!documentation().isEmpty()) { - //ol.newParagraph(); ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE); } // write type constraints @@ -922,9 +924,11 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType if (exampleFlag && m_impl->exampleSDict) { ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); - ol.writeDescItem(); - ol.newParagraph(); + ol.startDescForItem(); + ol.startParagraph(); writeExample(ol,m_impl->exampleSDict); + ol.endParagraph(); + ol.endDescForItem(); ol.endSimpleSect(); } //ol.newParagraph(); @@ -972,7 +976,7 @@ void ClassDef::showUsedFiles(OutputList &ol) ol.startItemList(); } - ol.writeListItem(); + ol.startItemListItem(); QCString path=fd->getPath(); if (Config_getBool("FULL_PATH_NAMES")) { @@ -1015,8 +1019,9 @@ void ClassDef::showUsedFiles(OutputList &ol) { ol.docify(fname); } - ol.popGeneratorState(); + + ol.endItemListItem(); } file=m_impl->files.next(); } @@ -1089,6 +1094,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) if (m_impl->inherits && (count=m_impl->inherits->count())>0) { + ol.startParagraph(); //parseText(ol,theTranslator->trInherits()+" "); QCString inheritLine = theTranslator->trInheritsList(m_impl->inherits->count()); @@ -1147,12 +1153,13 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) index=newIndex+matchLen; } ol.parseText(inheritLine.right(inheritLine.length()-index)); - ol.newParagraph(); + ol.endParagraph(); } // write subclasses if (m_impl->inheritedBy && (count=m_impl->inheritedBy->count())>0) { + ol.startParagraph(); QCString inheritLine = theTranslator->trInheritedByList(m_impl->inheritedBy->count()); QRegExp marker("@[0-9]+"); int index=0,newIndex,matchLen; @@ -1179,7 +1186,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) index=newIndex+matchLen; } ol.parseText(inheritLine.right(inheritLine.length()-index)); - ol.newParagraph(); + ol.endParagraph(); } if (renderDiagram) @@ -1216,6 +1223,7 @@ void ClassDef::writeIncludeFiles(OutputList &ol) m_impl->incInfo->includeName.data(); if (!nm.isEmpty()) { + ol.startParagraph(); ol.startTypewriter(); bool isIDLorJava = nm.right(4)==".idl" || nm.right(5)==".pidl" || @@ -1257,7 +1265,7 @@ void ClassDef::writeIncludeFiles(OutputList &ol) if (isIDLorJava) ol.docify(";"); ol.endTypewriter(); - ol.newParagraph(); + ol.endParagraph(); } } } @@ -1271,10 +1279,11 @@ void ClassDef::writeAllMembersLink(OutputList &ol) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - ol.newParagraph(); + ol.startParagraph(); ol.startTextLink(getMemberListFileName(),0); ol.parseText(theTranslator->trListOfAllMembers()); ol.endTextLink(); + ol.endParagraph(); ol.enableAll(); ol.popGeneratorState(); } @@ -1663,7 +1672,7 @@ void ClassDef::writeMemberList(OutputList &ol) ol.parseText(theTranslator->trIncludingInheritedMembers()); //ol.startItemList(); - ol.writeString("<p><table>\n"); + ol.writeString("<table>\n"); //MemberNameInfo *mni=m_impl->allMemberNameInfoList->first(); MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict); diff --git a/src/commentcnv.l b/src/commentcnv.l index 4c71988..33d0c04 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -63,12 +63,14 @@ static int g_lastCommentContext; static bool g_inSpecialComment; static bool g_inRoseComment; static int g_javaBlock; +static bool g_specialComment; static QCString g_aliasString; static int g_blockCount; static int g_lastBlockContext; static bool g_pythonDocString; + static SrcLangExt g_lang; static void replaceCommentMarker(const char *s,int len) @@ -341,7 +343,8 @@ void replaceComment(int offset); g_readLineCtx=YY_START; BEGIN(ReadLine); } -<Scan>"/*" { /* start of a C comment */ +<Scan>"/*"[*!]? { /* start of a C comment */ + g_specialComment=yyleng==3; copyToOutput(yytext,yyleng); BEGIN(CComment); } @@ -640,6 +643,10 @@ void replaceComment(int offset); { ADDCHAR('/'); ADDCHAR('*'); + if (g_specialComment) + { + ADDCHAR('*'); + } } } } diff --git a/src/definition.cpp b/src/definition.cpp index 60709aa..36c1f69 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -819,6 +819,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) //printf("Read:\n`%s'\n\n",codeFragment.data()); MemberDef *thisMd = 0; if (definitionType()==TypeMember) thisMd = (MemberDef *)this; + ol.startParagraph(); ol.startCodeFragment(); pIntf->parseCode(ol, // codeOutIntf scopeName, // scope @@ -832,7 +833,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) thisMd // memberDef ); ol.endCodeFragment(); - ol.newParagraph(); + ol.endParagraph(); } } ol.popGeneratorState(); diff --git a/src/diagram.cpp b/src/diagram.cpp index bed02e1..75a0e00 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -175,9 +175,9 @@ static void writeMapArea(QTextStream &t,ClassDef *cd,QCString relPath, t << relPath; } t << cd->getOutputFileBase() << Doxygen::htmlFileExtension << "\" "; - t << "alt=\"" << cd->displayName(); + t << "alt=\"" << convertToXML(cd->displayName()); t << "\" shape=\"rect\" coords=\"" << x << "," << y << ","; - t << (x+w) << "," << (y+h) << "\">" << endl; + t << (x+w) << "," << (y+h) << "\"/>" << endl; } } //----------------------------------------------------------------------------- diff --git a/src/dirdef.cpp b/src/dirdef.cpp index dba1d85..6a0c12d 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -134,7 +134,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -153,6 +153,7 @@ void DirDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { + ol.startParagraph(); ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); @@ -170,10 +171,11 @@ void DirDef::writeBriefDescription(OutputList &ol) } ol.popGeneratorState(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); + ol.endParagraph(); } ol.writeSynopsis(); } @@ -188,10 +190,11 @@ void DirDef::writeDirectoryGraph(OutputList &ol) { msg("Generating dependency graph for directory %s\n",displayName().data()); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startDirDepGraph(); //TODO: ol.parseText(theTranslator->trDirDepGraph()); ol.endDirDepGraph(dirDep); + ol.endParagraph(); ol.enableAll(); } } @@ -220,6 +223,7 @@ void DirDef::writeSubDirList(OutputList &ol) } if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(), FALSE, // indexWords @@ -229,7 +233,7 @@ void DirDef::writeSubDirList(OutputList &ol) TRUE // link from index ); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } dd=m_subdirs.next(); } @@ -282,6 +286,7 @@ void DirDef::writeFileList(OutputList &ol) ol.endMemberItem(); if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(), FALSE, // indexWords @@ -291,7 +296,7 @@ void DirDef::writeFileList(OutputList &ol) TRUE // link from index ); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } fd=m_fileList->next(); } diff --git a/src/docparser.h b/src/docparser.h index cdc1379..fc930dd 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -473,6 +473,7 @@ class DocFormula : public DocNode int id() const { return m_id; } DocNode *parent() const { return m_parent; } void accept(DocVisitor *v) { v->visit(this); } + bool isInline() { return text().at(0)!='\\'; } private: DocNode *m_parent; @@ -574,6 +575,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode QString key() const { return m_key; } void accept(DocVisitor *v) { CompAccept<DocXRefItem>::accept(this,v); } bool parse(); + const QList<DocNode> &children() const { return m_children; } private: DocNode *m_parent; @@ -838,6 +840,7 @@ class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode DocNode *parent() const { return m_parent; } void accept(DocVisitor *v) { CompAccept<DocSecRefItem>::accept(this,v); } void parse(); + const QList<DocNode> &children() const { return m_children; } private: DocNode *m_parent; @@ -929,6 +932,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode int parseRcs(); int parseXml(); void appendLinkWord(const QString &word); + const QList<DocNode> &children() const { return m_children; } private: DocNode * m_parent; @@ -1104,6 +1108,7 @@ class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode void accept(DocVisitor *v) { CompAccept<DocHtmlListItem>::accept(this,v); } int parse(); int parseXml(); + const QList<DocNode> &children() const { return m_children; } private: DocNode * m_parent; @@ -1122,6 +1127,7 @@ class DocHtmlDescData : public CompAccept<DocHtmlDescData>, public DocNode DocNode *parent() const { return m_parent; } void accept(DocVisitor *v) { CompAccept<DocHtmlDescData>::accept(this,v); } int parse(); + const QList<DocNode> &children() const { return m_children; } private: DocNode * m_parent; diff --git a/src/dot.cpp b/src/dot.cpp index 48c319b..a5c87cd 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -41,7 +41,7 @@ #include <qtextstream.h> #include <md5.h> -#define MAP_CMD "cmap" +#define MAP_CMD "cmapx" //#define FONTNAME "FreeSans" #define FONTNAME getDotFontName() @@ -141,75 +141,78 @@ static bool convertMapFile(QTextStream &t,const char *mapName, int numBytes = f.readLine(buf.data(),maxLineLen); buf[numBytes-1]='\0'; - // search for href="...", store ... part in link - int indexS = buf.find("href=\""), indexE; - if (indexS!=-1 && (indexE=buf.find('"',indexS+6))!=-1) + if (buf.left(5)=="<area") { - QCString link = buf.mid(indexS+6,indexE-indexS-6); - QCString result; - QCString *dest; - if (urlOnly) // for user defined dot graphs + // search for href="...", store ... part in link + int indexS = buf.find("href=\""), indexE; + if (indexS!=-1 && (indexE=buf.find('"',indexS+6))!=-1) { - if (link.left(5)=="\\ref ") // \ref url + QCString link = buf.mid(indexS+6,indexE-indexS-6); + QCString result; + QCString *dest; + if (urlOnly) // for user defined dot graphs { - result="href=\""; - // fake ref node to resolve the url - DocRef *df = new DocRef( (DocNode*) 0, link.mid(5), context ); - if (!df->ref().isEmpty()) + if (link.left(5)=="\\ref ") // \ref url { - if ((dest=Doxygen::tagDestinationDict[df->ref()])) - result += *dest + "/"; + result="href=\""; + // fake ref node to resolve the url + DocRef *df = new DocRef( (DocNode*) 0, link.mid(5), context ); + if (!df->ref().isEmpty()) + { + if ((dest=Doxygen::tagDestinationDict[df->ref()])) + result += *dest + "/"; + } + else if (!relPath.isEmpty()) + { + result += relPath; + } + if (!df->file().isEmpty()) + result += df->file().data() + Doxygen::htmlFileExtension; + if (!df->anchor().isEmpty()) + result += "#" + df->anchor(); + delete df; + result += "\""; } - else if (!relPath.isEmpty()) + else { - result += relPath; + result = "href=\"" + link + "\""; } - if (!df->file().isEmpty()) - result += df->file().data() + Doxygen::htmlFileExtension; - if (!df->anchor().isEmpty()) - result += "#" + df->anchor(); - delete df; - result += "\""; - } - else - { - result = "href=\"" + link + "\""; } - } - else // ref$url (external ref via tag file), or $url (local ref) - { - int marker = link.find('$'); - if (marker!=-1) + else // ref$url (external ref via tag file), or $url (local ref) { - QCString ref = link.left(marker); - QCString url = link.mid(marker+1); - if (!ref.isEmpty()) - { - result = "doxygen=\"" + ref + ":"; - if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; - result += "\" "; - } - result+= "href=\""; - if (!ref.isEmpty()) + int marker = link.find('$'); + if (marker!=-1) { - if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; + QCString ref = link.left(marker); + QCString url = link.mid(marker+1); + if (!ref.isEmpty()) + { + result = "doxygen=\"" + ref + ":"; + if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; + result += "\" "; + } + result+= "href=\""; + if (!ref.isEmpty()) + { + if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; + } + else if (!relPath.isEmpty()) + { + result += relPath; + } + result+= url + "\""; } - else if (!relPath.isEmpty()) + else // should not happen, but handle properly anyway { - result += relPath; + result = "href=\"" + link + "\""; } - result+= url + "\""; - } - else // should not happen, but handle properly anyway - { - result = "href=\"" + link + "\""; } + QCString leftPart = buf.left(indexS); + QCString rightPart = buf.mid(indexE+1); + buf = leftPart + result + rightPart; } - QCString leftPart = buf.left(indexS); - QCString rightPart = buf.mid(indexE+1); - buf = leftPart + result + rightPart; + t << buf; } - t << buf; } return TRUE; } @@ -1128,8 +1131,8 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) const // write image and map in a table row QCString mapLabel = convertNameToFile(n->m_label); out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#" - << mapLabel << "_map\">" << endl; - out << "<map name=\"" << mapLabel << "_map\">" << endl; + << mapLabel << "_map\"/>" << endl; + out << "<map name=\"" << mapLabel << "_map\" id=\"" << mapLabel << "\">" << endl; convertMapFile(out,mapName,""); out << "</map></td></tr>" << endl; //thisDir.remove(mapName); @@ -1915,7 +1918,7 @@ QCString DotClassGraph::writeGraph(QTextStream &out, if (format==BITMAP && generateImageMap) // produce HTML to include the image { QCString mapLabel = convertNameToFile(m_startNode->m_label+"_"+mapName); - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapLabel << "\" alt=\""; switch (m_graphType) @@ -1930,14 +1933,14 @@ QCString DotClassGraph::writeGraph(QTextStream &out, ASSERT(0); break; } - out << "\"></center>" << endl; + out << "\"/></center>" << endl; QString tmpstr; QTextOStream tmpout(&tmpstr); tmpout.setEncoding(tmpout.UnicodeUTF8); convertMapFile(tmpout,baseName+".map",relPath); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapLabel << "\">" << endl; + out << "<map name=\"" << mapLabel << "\" id=\"" << mapLabel << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -2245,10 +2248,9 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out, if (format==BITMAP && generateImageMap) { - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" - << mapName << "_map\" alt=\""; - out << "\">"; + << mapName << "_map\" alt=\"\"/>"; out << "</center>" << endl; QString tmpstr; QTextOStream tmpout(&tmpstr); @@ -2256,7 +2258,7 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out, convertMapFile(tmpout,baseName+".map",relPath); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapName << "_map\">" << endl; + out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -2539,7 +2541,7 @@ QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format, if (format==BITMAP && generateImageMap) { - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "_map\" alt=\""; out << "\">"; @@ -2550,7 +2552,7 @@ QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format, convertMapFile(tmpout,baseName+".map",relPath); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapName << "_map\">" << endl; + out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -2681,11 +2683,11 @@ QCString DotDirDeps::writeGraph(QTextStream &out, if (format==BITMAP && generateImageMap) { - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "_map\" alt=\""; - out << m_dir->displayName(); - out << "\">"; + out << convertToXML(m_dir->displayName()); + out << "\"/>"; out << "</center>" << endl; QString tmpstr; QTextOStream tmpout(&tmpstr); @@ -2693,7 +2695,7 @@ QCString DotDirDeps::writeGraph(QTextStream &out, convertMapFile(tmpout,baseName+".map",relPath,TRUE); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapName << "_map\">" << endl; + out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -3175,8 +3177,8 @@ QCString DotGroupCollaboration::writeGraph( QTextStream &t, GraphOutputFormat fo QCString mapLabel = convertNameToFile(baseName); t << "<center><table><tr><td><img src=\"" << relPath << imgName << "\" border=\"0\" alt=\"\" usemap=\"#" - << mapLabel << "_map\">" << endl; - t << "<map name=\"" << mapLabel << "_map\">" << endl; + << mapLabel << "_map\"/>" << endl; + t << "<map name=\"" << mapLabel << "_map\" id=\"" << mapLabel << "\">" << endl; convertMapFile(t,mapName,relPath); t << "</map></td></tr></table></center>" << endl; thisDir.remove(mapName); diff --git a/src/doxygen.css b/src/doxygen.css index 3767dc9..b5debd1 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -1,3 +1,5 @@ +/* The standard CSS for doxygen */ + body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 12px; @@ -18,12 +20,40 @@ h3 { font-size: 100%; } +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + /* @end */ caption { font-weight: bold; } +span.legend { + font-size: 70%; + text-align: center; +} + div.qindex, div.navtab{ background-color: #e8eef2; border: 1px solid #84b0c7; @@ -161,6 +191,15 @@ img.formulaInl { vertical-align: middle; } +img.center { + border: 0; +} + +img.footer { + border: 0; + vertical-align: middle; +} + /* @group Code Colorization */ span.keyword { @@ -267,8 +306,13 @@ hr { border-top: 1px solid #ccc; } +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + .memTemplParams { color: #606060; + white-space: nowrap; } /* @end */ @@ -295,6 +339,7 @@ hr { .memitem { padding: 0; + margin-bottom: 10px; } .memname { @@ -312,8 +357,11 @@ hr { font-weight: bold; -webkit-border-top-left-radius: 8px; -webkit-border-top-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + } .memdoc { @@ -322,8 +370,10 @@ hr { border-top-width: 0; -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; } .paramkey { diff --git a/src/doxygen_css.h b/src/doxygen_css.h index 99c7b5d..1584e69 100644 --- a/src/doxygen_css.h +++ b/src/doxygen_css.h @@ -1,3 +1,5 @@ +"/* The standard CSS for doxygen */\n" +"\n" "body, table, div, p, dl {\n" " font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;\n" " font-size: 12px;\n" @@ -18,12 +20,40 @@ " font-size: 100%;\n" "}\n" "\n" +"dt {\n" +" font-weight: bold;\n" +"}\n" +"\n" +"div.multicol {\n" +" -moz-column-gap: 1em;\n" +" -webkit-column-gap: 1em;\n" +" -moz-column-count: 3;\n" +" -webkit-column-count: 3;\n" +"}\n" +"\n" +"p.startli, p.startdd {\n" +" margin-top: 0px;\n" +"}\n" +"\n" +"p.endli {\n" +" margin-bottom: 0px;\n" +"}\n" +"\n" +"p.enddd {\n" +" margin-bottom: 4px;\n" +"}\n" +"\n" "/* @end */\n" "\n" "caption {\n" " font-weight: bold;\n" "}\n" "\n" +"span.legend {\n" +" font-size: 70%;\n" +" text-align: center;\n" +"}\n" +"\n" "div.qindex, div.navtab{\n" " background-color: #e8eef2;\n" " border: 1px solid #84b0c7;\n" @@ -161,6 +191,15 @@ " vertical-align: middle;\n" "}\n" "\n" +"img.center {\n" +" border: 0;\n" +"}\n" +"\n" +"img.footer {\n" +" border: 0;\n" +" vertical-align: middle;\n" +"}\n" +"\n" "/* @group Code Colorization */\n" "\n" "span.keyword {\n" @@ -267,8 +306,13 @@ " border-top: 1px solid #ccc;\n" "}\n" "\n" +".memItemLeft, .memTemplItemLeft {\n" +" white-space: nowrap;\n" +"}\n" +"\n" ".memTemplParams {\n" " color: #606060;\n" +" white-space: nowrap;\n" "}\n" "\n" "/* @end */\n" @@ -295,6 +339,7 @@ "\n" ".memitem {\n" " padding: 0;\n" +" margin-bottom: 10px;\n" "}\n" "\n" ".memname {\n" @@ -312,8 +357,11 @@ " font-weight: bold;\n" " -webkit-border-top-left-radius: 8px;\n" " -webkit-border-top-right-radius: 8px;\n" +" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" " -moz-border-radius-topleft: 8px;\n" " -moz-border-radius-topright: 8px;\n" +" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n" +"\n" "}\n" "\n" ".memdoc {\n" @@ -322,8 +370,10 @@ " border-top-width: 0;\n" " -webkit-border-bottom-left-radius: 8px;\n" " -webkit-border-bottom-right-radius: 8px;\n" +" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" " -moz-border-radius-bottomleft: 8px;\n" " -moz-border-radius-bottomright: 8px;\n" +" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n" "}\n" "\n" ".paramkey {\n" diff --git a/src/filedef.cpp b/src/filedef.cpp index d25d51d..85aa6ed 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -186,7 +186,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -220,7 +220,9 @@ void FileDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -236,11 +238,12 @@ void FileDef::writeBriefDescription(OutputList &ol) ol.endTextLink(); } ol.popGeneratorState(); + ol.endParagraph(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); } ol.writeSynopsis(); } @@ -337,7 +340,6 @@ void FileDef::writeIncludeGraph(OutputList &ol) { ol.startTextBlock(); ol.disable(OutputGenerator::Man); - ol.newParagraph(); ol.startInclDepGraph(); ol.parseText(theTranslator->trInclDepGraph(name())); ol.endInclDepGraph(incDepGraph); @@ -358,7 +360,6 @@ void FileDef::writeIncludedByGraph(OutputList &ol) { ol.startTextBlock(); ol.disable(OutputGenerator::Man); - ol.newParagraph(); ol.startInclDepGraph(); ol.parseText(theTranslator->trInclByDepGraph()); ol.endInclDepGraph(incDepGraph); @@ -376,10 +377,11 @@ void FileDef::writeSourceLink(OutputList &ol) if (generateSourceFile()) { ol.disableAllBut(OutputGenerator::Html); - ol.newParagraph(); + ol.startParagraph(); ol.startTextLink(includeName(),0); ol.parseText(theTranslator->trGotoSourceCode()); ol.endTextLink(); + ol.endParagraph(); ol.enableAll(); } } diff --git a/src/formula.cpp b/src/formula.cpp index 764792e..11ea644 100644 --- a/src/formula.cpp +++ b/src/formula.cpp @@ -1,5 +1,4 @@ /****************************************************************************** - i * * * Copyright (C) 1997-2008 by Dimitri van Heesch. diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 1d27d2b..e602cfe 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -293,7 +293,7 @@ unsigned char ftv2vertline_png[] = { FTVImageInfo image_info[] = { - { " ", "ftv2blank.png",ftv2blank_png,174,16,22 }, + { " ", "ftv2blank.png",ftv2blank_png,174,16,22 }, { "*", "ftv2doc.png",ftv2doc_png,255,24,22 }, { "+", "ftv2folderclosed.png",ftv2folderclosed_png,259,24,22 }, { "-", "ftv2folderopen.png",ftv2folderopen_png,261,24,22 }, @@ -585,9 +585,10 @@ void FTVHelp::generateTreeView(QString* OutString) #if QT_VERSION >= 200 t.setEncoding(QTextStream::UnicodeUTF8); #endif - t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n"; - t << "<html><head>"; - t << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\n"; + //t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n"; + t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n"; + t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"; + t << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"/>\n"; t << "<title>"; if (Config_getString("PROJECT_NAME").isEmpty()) { @@ -597,12 +598,14 @@ void FTVHelp::generateTreeView(QString* OutString) { t << Config_getString("PROJECT_NAME"); } - t << "</title></head>" << endl; + t << "</title>\n</head>" << endl; t << "<frameset cols=\"" << Config_getInt("TREEVIEW_WIDTH") << ",*\">" << endl; - t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\">" << endl; - t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\">" << endl; + t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\"/>" << endl; + t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\"/>" << endl; t << " <noframes>" << endl; + t << " <body>" << endl; t << " <a href=\"main" << Doxygen::htmlFileExtension << "\">Frames are disabled. Click here to go to the main page.</a>" << endl; + t << " </body>" << endl; t << " </noframes>" << endl; t << "</frameset>" << endl; t << "</html>" << endl; @@ -618,9 +621,10 @@ void FTVHelp::generateTreeView(QString* OutString) if (m_topLevelIndex) { + t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"; t << "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"; t << " <head>\n"; - t << " <meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\" />\n"; + t << " <meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"; t << " <meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n"; t << " <meta http-equiv=\"Content-Language\" content=\"en\" />\n"; t << " <link rel=\"stylesheet\" href=\""; @@ -638,7 +642,7 @@ void FTVHelp::generateTreeView(QString* OutString) } t << cssfi.fileName(); } - t << "\">" << endl; + t << "\"/>" << endl; t << " <title>TreeView</title>\n"; } t << " <script type=\"text/javascript\">\n"; @@ -720,7 +724,7 @@ void FTVHelp::generateTreeView(QString* OutString) else { t << " <div class=\"directory-alt\">\n"; - t << " <br>\n"; + t << " <br/>\n"; } t << " <div style=\"display: block;\">\n"; @@ -729,7 +733,7 @@ void FTVHelp::generateTreeView(QString* OutString) t << " </div>\n"; t << " </div>\n"; - if (!m_topLevelIndex) + if (m_topLevelIndex) { t << " </body>\n"; t << "</html>\n"; diff --git a/src/ftvhelp.h b/src/ftvhelp.h index d1a89a8..25e2c9f 100644 --- a/src/ftvhelp.h +++ b/src/ftvhelp.h @@ -63,8 +63,8 @@ extern FTVImageInfo image_info[]; #define FTV_IMGATTRIBS(name) \ "src=\"" FTV_ICON_FILE(name) "\" " \ "alt=\"" << FTV_INFO(name).alt << "\" " \ - "width=" << FTV_INFO(name).width << " " \ - "height=" << FTV_INFO(name).height << " " + "width=\"" << FTV_INFO(name).width << "\" " \ + "height=\"" << FTV_INFO(name).height << "\" " /*! A class that generates a dynamic tree view side panel. */ diff --git a/src/groupdef.cpp b/src/groupdef.cpp index c65f483..23d897f 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -527,7 +527,7 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -552,7 +552,9 @@ void GroupDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -569,10 +571,11 @@ void GroupDef::writeBriefDescription(OutputList &ol) } ol.popGeneratorState(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); + ol.endParagraph(); } } @@ -586,10 +589,11 @@ void GroupDef::writeGroupGraph(OutputList &ol) msg("Generating dependency graph for group %s\n",qualifiedName().data()); ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startGroupCollaboration(); ol.parseText(theTranslator->trCollaborationDiagram(title)); ol.endGroupCollaboration(graph); + ol.endParagraph(); ol.popGeneratorState(); } } @@ -618,10 +622,11 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title) ol.endMemberItem(); if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } fd=fileList->next(); } @@ -659,10 +664,11 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title) ol.endMemberItem(); if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } gd=groupList->next(); } @@ -693,10 +699,11 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title) } if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } dd=dirList->next(); } diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index efdcf01..b24625f 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -34,6 +34,45 @@ static const int NUM_HTML_LIST_TYPES = 4; static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"}; +static bool mustBeOutsideParagraph(DocNode *n) +{ + switch (n->kind()) + { + /* <ul> */ + case DocNode::Kind_HtmlList: + case DocNode::Kind_SimpleList: + case DocNode::Kind_AutoList: + /* <dl> */ + case DocNode::Kind_SimpleSect: + case DocNode::Kind_ParamSect: + case DocNode::Kind_HtmlDescList: + case DocNode::Kind_XRefItem: + /* <table> */ + case DocNode::Kind_HtmlTable: + /* <h?> */ + case DocNode::Kind_Section: + case DocNode::Kind_HtmlHeader: + /* <div> */ + case DocNode::Kind_Verbatim: + case DocNode::Kind_Include: + case DocNode::Kind_Image: + case DocNode::Kind_SecRefList: + /* <hr> */ + case DocNode::Kind_HorRuler: + return TRUE; + case DocNode::Kind_StyleChange: + return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted || + ((DocStyleChange*)n)->style()==DocStyleChange::Div || + ((DocStyleChange*)n)->style()==DocStyleChange::Center; + case DocNode::Kind_Formula: + return !((DocFormula*)n)->isInline(); + default: + break; + } + return FALSE; +} + + static QString htmlAttribsToString(const HtmlAttribList &attribs) { @@ -42,9 +81,13 @@ static QString htmlAttribsToString(const HtmlAttribList &attribs) HtmlAttrib *att; for (li.toFirst();(att=li.current());++li) { - result+=" "; - result+=att->name; - if (!att->value.isEmpty()) result+="=\""+att->value+"\""; + if (!att->value.isEmpty()) // ignore attribute without values as they + // are not XHTML compliant + { + result+=" "; + result+=att->name; + result+="=\""+convertToXML(att->value)+"\""; + } } return result; } @@ -143,13 +186,13 @@ void HtmlDocVisitor::visit(DocURL *u) void HtmlDocVisitor::visit(DocLineBreak *) { if (m_hide) return; - m_t << "<br>\n"; + m_t << "<br/>\n"; } void HtmlDocVisitor::visit(DocHorRuler *) { if (m_hide) return; - m_t << "<hr>\n"; + m_t << "<hr/>\n"; } void HtmlDocVisitor::visit(DocStyleChange *s) @@ -173,7 +216,16 @@ void HtmlDocVisitor::visit(DocStyleChange *s) if (s->enable()) m_t << "<sup" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sup>"; break; case DocStyleChange::Center: - if (s->enable()) m_t << "<center" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</center>"; + if (s->enable()) + { + forceEndParagraph(s); + m_t << "<center" << htmlAttribsToString(s->attribs()) << ">"; + } + else + { + m_t << "</center>"; + forceStartParagraph(s); + } break; case DocStyleChange::Small: if (s->enable()) m_t << "<small" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</small>"; @@ -181,6 +233,7 @@ void HtmlDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Preformatted: if (s->enable()) { + forceEndParagraph(s); m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">"; m_insidePre=TRUE; } @@ -188,10 +241,20 @@ void HtmlDocVisitor::visit(DocStyleChange *s) { m_insidePre=FALSE; m_t << "</pre>"; + forceStartParagraph(s); } break; case DocStyleChange::Div: - if (s->enable()) m_t << "<div" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</div>"; + if (s->enable()) + { + forceEndParagraph(s); + m_t << "<div" << htmlAttribsToString(s->attribs()) << ">"; + } + else + { + m_t << "</div>"; + forceStartParagraph(s); + } break; case DocStyleChange::Span: if (s->enable()) m_t << "<span" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</span>"; @@ -207,16 +270,20 @@ void HtmlDocVisitor::visit(DocVerbatim *s) switch(s->type()) { case DocVerbatim::Code: // fall though + forceEndParagraph(s); m_t << PREFRAG_START; Doxygen::parserManager->getParser(m_langExt) ->parseCode(m_ci,s->context(),s->text().latin1(), s->isExample(),s->exampleFile()); m_t << PREFRAG_END; + forceStartParagraph(s); break; case DocVerbatim::Verbatim: + forceEndParagraph(s); m_t << PREFRAG_START; filter(s->text()); m_t << PREFRAG_END; + forceStartParagraph(s); break; case DocVerbatim::HtmlOnly: m_t << s->text(); @@ -245,9 +312,11 @@ void HtmlDocVisitor::visit(DocVerbatim *s) file.writeBlock( s->text(), s->text().length() ); file.close(); + forceEndParagraph(s); m_t << "<div align=\"center\">" << endl; writeDotFile(fileName,s->relPath(),s->context()); m_t << "</div>" << endl; + forceStartParagraph(s); if (Config_getBool("DOT_CLEANUP")) file.remove(); } @@ -272,9 +341,11 @@ void HtmlDocVisitor::visit(DocVerbatim *s) file.writeBlock( text, text.length() ); file.close(); + forceEndParagraph(s); m_t << "<div align=\"center\">" << endl; writeMscFile(baseName,s->relPath(),s->context()); m_t << "</div>" << endl; + forceStartParagraph(s); if (Config_getBool("DOT_CLEANUP")) file.remove(); } @@ -285,7 +356,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) void HtmlDocVisitor::visit(DocAnchor *anc) { if (m_hide) return; - m_t << "<a class=\"anchor\" name=\"" << anc->anchor() << "\"></a>"; + m_t << "<a class=\"anchor\" id=\"" << anc->anchor() << "\"></a>"; } void HtmlDocVisitor::visit(DocInclude *inc) @@ -294,6 +365,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) switch(inc->type()) { case DocInclude::Include: + forceEndParagraph(inc); m_t << PREFRAG_START; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci, @@ -307,9 +379,11 @@ void HtmlDocVisitor::visit(DocInclude *inc) TRUE // inlineFragment ); m_t << PREFRAG_END; + forceStartParagraph(inc); break; case DocInclude::IncWithLines: { + forceEndParagraph(inc); m_t << PREFRAG_START; QFileInfo cfi( inc->file() ); FileDef fd( cfi.dirPath(), cfi.fileName() ); @@ -320,6 +394,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) inc->isExample(), inc->exampleFile(), &fd); m_t << PREFRAG_END; + forceStartParagraph(inc); } break; case DocInclude::DontInclude: @@ -328,9 +403,11 @@ void HtmlDocVisitor::visit(DocInclude *inc) m_t << inc->text(); break; case DocInclude::VerbInclude: + forceEndParagraph(inc); m_t << PREFRAG_START; filter(inc->text()); m_t << PREFRAG_END; + forceStartParagraph(inc); break; } } @@ -372,8 +449,12 @@ void HtmlDocVisitor::visit(DocIncOperator *op) void HtmlDocVisitor::visit(DocFormula *f) { if (m_hide) return; - bool bDisplay = f->text().at(0)=='\\'; - if (bDisplay) m_t << "<p class=\"formulaDsp\">" << endl; + bool bDisplay = !f->isInline(); + if (bDisplay) + { + forceEndParagraph(f); + m_t << "<p class=\"formulaDsp\">" << endl; + } m_t << "<img class=\"formula" << (bDisplay ? "Dsp" : "Inl"); m_t << "\" alt=\""; @@ -381,9 +462,12 @@ void HtmlDocVisitor::visit(DocFormula *f) m_t << "\""; /// @todo cache image dimensions on formula generation and give height/width /// for faster preloading and better rendering of the page - m_t << " src=\"" << f->relPath() << f->name() << ".png\">"; + m_t << " src=\"" << f->relPath() << f->name() << ".png\"/>"; if (bDisplay) - m_t << endl << "<p>" << endl; + { + m_t << endl << "</p>" << endl; + forceStartParagraph(f); + } } void HtmlDocVisitor::visit(DocIndexEntry *) @@ -398,6 +482,7 @@ void HtmlDocVisitor::visit(DocIndexEntry *) void HtmlDocVisitor::visitPre(DocAutoList *l) { if (m_hide) return; + forceEndParagraph(l); if (l->isEnumList()) { // @@ -408,7 +493,7 @@ 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 { @@ -429,6 +514,7 @@ void HtmlDocVisitor::visitPost(DocAutoList *l) m_t << "</ul>"; } if (!l->isPreformatted()) m_t << "\n"; + forceStartParagraph(l); } void HtmlDocVisitor::visitPre(DocAutoListItem *) @@ -437,41 +523,219 @@ void HtmlDocVisitor::visitPre(DocAutoListItem *) m_t << "<li>"; } -void HtmlDocVisitor::visitPost(DocAutoListItem *) +void HtmlDocVisitor::visitPost(DocAutoListItem *li) { if (m_hide) return; m_t << "</li>"; + if (!li->isPreformatted()) m_t << "\n"; +} + +template<class T> +bool isFirstChildNode(T *parent, DocNode *node) +{ + return parent->children().getFirst()==node; } -void HtmlDocVisitor::visitPre(DocPara *) +template<class T> +bool isLastChildNode(T *parent, DocNode *node) +{ + return parent->children().getLast()==node; +} + +int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) +{ + int t=0; + isFirst=FALSE; + isLast=FALSE; + if (p && p->parent()) + { + switch (p->parent()->kind()) + { + case DocNode::Kind_AutoListItem: + isFirst=TRUE; + isLast =TRUE; + if (isFirst) t=1; + if (isLast) t=3; + break; + case DocNode::Kind_SimpleListItem: + isFirst=TRUE; + isLast =TRUE; + if (isFirst) t=1; + if (isLast) t=3; + 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; + 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; + 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; + 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; + 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; + break; + default: + break; + } + //printf("para=%p parent()->kind=%d isFirst=%d isLast=%d t=%d\n", + // p,p->parent()->kind(),isFirst,isLast,t); + } + return t; +} + +void HtmlDocVisitor::visitPre(DocPara *p) { if (m_hide) return; - // TODO: - // Paragraph should be surrounded by <p>..</p>, but - // - // A list item (li), description data (dd), or table data (td) should - // only have paragraph markers if there are multiple paragraphs (otherwise - // the output looks ugly). - // - // A list or table should be placed outside the paragraph context, - // so the current paragraph should be ended and restarted. To avoid - // empty paragraphs, it has to be checked if the list or table is the - // first or last child within the paragraph. - + //printf("Processing docpara with parent of kind %d\n", + // p->parent() ? p->parent()->kind() : -1); + + bool needsTag = FALSE; + if (p && p->parent()) + { + switch (p->parent()->kind()) + { + case DocNode::Kind_Section: + case DocNode::Kind_HtmlListItem: + case DocNode::Kind_HtmlDescData: + case DocNode::Kind_HtmlCell: + case DocNode::Kind_SimpleListItem: + case DocNode::Kind_AutoListItem: + case DocNode::Kind_SimpleSect: + needsTag = TRUE; + break; + case DocNode::Kind_Root: + needsTag = !((DocRoot*)p->parent())->singleLine(); + break; + default: + needsTag = FALSE; + } + } + + // 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 + uint nodeIndex = 0; + if (p && nodeIndex<p->children().count()) + { + while (nodeIndex<p->children().count() && + p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace) + { + nodeIndex++; + } + if (nodeIndex<p->children().count()) + { + DocNode *n = p->children().at(nodeIndex); + if (mustBeOutsideParagraph(n)) + { + needsTag = FALSE; + } + } + } + + // check if this paragraph is the first or last 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[5] = + { "", + " class=\"startli\"", + " class=\"startdd\"", + " class=\"endli\"", + " class=\"enddd\"" + }; + bool isFirst; + bool isLast; + t = getParagraphContext(p,isFirst,isLast); + //printf("startPara first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) needsTag=FALSE; + + // write the paragraph tag (if needed) + if (needsTag) m_t << "<p" << contexts[t] << ">"; } void HtmlDocVisitor::visitPost(DocPara *p) { - if (m_hide) return; - if (!p->isLast() && // omit <p> for last paragraph - !(p->parent() && // and for parameter sections - p->parent()->kind()==DocNode::Kind_ParamSect - ) - ) +// if (m_hide) return; +// if (!p->isLast() && // omit <p> for last paragraph +// !(p->parent() && // and for parameter sections +// p->parent()->kind()==DocNode::Kind_ParamSect +// ) +// ) +// { +// m_t << "<p>\n"; +// } + + bool needsTag = FALSE; + if (p && p->parent()) { - m_t << "<p>\n"; + switch (p->parent()->kind()) + { + case DocNode::Kind_Section: + case DocNode::Kind_HtmlListItem: + case DocNode::Kind_HtmlDescData: + case DocNode::Kind_HtmlCell: + case DocNode::Kind_SimpleListItem: + case DocNode::Kind_AutoListItem: + case DocNode::Kind_SimpleSect: + needsTag = TRUE; + break; + case DocNode::Kind_Root: + needsTag = !((DocRoot*)p->parent())->singleLine(); + break; + default: + needsTag = FALSE; + } } + + QCString context; + // if the last element of a paragraph is something that should be outside of + // the paragraph (<ul>,<dl>,<table>) then that will already have ended the + // paragraph and we don't need to do it here + int nodeIndex = p->children().count()-1; + if (p && nodeIndex>=0) + { + while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace) + { + nodeIndex--; + } + if (nodeIndex>=0) + { + DocNode *n = p->children().at(nodeIndex); + if (mustBeOutsideParagraph(n)) + { + needsTag = FALSE; + } + } + } + + bool isFirst; + bool isLast; + getParagraphContext(p,isFirst,isLast); + //printf("endPara first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) needsTag=FALSE; + + if (needsTag) m_t << "</p>\n"; + } void HtmlDocVisitor::visitPre(DocRoot *) @@ -485,7 +749,8 @@ void HtmlDocVisitor::visitPost(DocRoot *) void HtmlDocVisitor::visitPre(DocSimpleSect *s) { if (m_hide) return; - m_t << "<dl class=\"" << s->typeString() << "\" compact><dt><b>"; + forceEndParagraph(s); + m_t << "<dl class=\"" << s->typeString() << "\"><dt><b>"; switch(s->type()) { case DocSimpleSect::See: @@ -528,10 +793,11 @@ void HtmlDocVisitor::visitPre(DocSimpleSect *s) } } -void HtmlDocVisitor::visitPost(DocSimpleSect *) +void HtmlDocVisitor::visitPost(DocSimpleSect *s) { if (m_hide) return; m_t << "</dd></dl>\n"; + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocTitle *) @@ -547,8 +813,10 @@ void HtmlDocVisitor::visitPost(DocTitle *) void HtmlDocVisitor::visitPre(DocSimpleList *sl) { if (m_hide) return; + forceEndParagraph(sl); m_t << "<ul>"; if (!sl->isPreformatted()) m_t << "\n"; + } void HtmlDocVisitor::visitPost(DocSimpleList *sl) @@ -556,6 +824,7 @@ void HtmlDocVisitor::visitPost(DocSimpleList *sl) if (m_hide) return; m_t << "</ul>"; if (!sl->isPreformatted()) m_t << "\n"; + forceStartParagraph(sl); } void HtmlDocVisitor::visitPre(DocSimpleListItem *) @@ -574,20 +843,23 @@ void HtmlDocVisitor::visitPost(DocSimpleListItem *li) void HtmlDocVisitor::visitPre(DocSection *s) { if (m_hide) return; + forceEndParagraph(s); m_t << "<h" << s->level()+1 << ">"; - m_t << "<a class=\"anchor\" name=\"" << s->anchor(); + m_t << "<a class=\"anchor\" id=\"" << s->anchor(); m_t << "\">" << endl; filter(convertCharEntitiesToUTF8(s->title().data())); m_t << "</a></h" << s->level()+1 << ">\n"; } -void HtmlDocVisitor::visitPost(DocSection *) +void HtmlDocVisitor::visitPost(DocSection *s) { + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocHtmlList *s) { if (m_hide) return; + forceEndParagraph(s); if (s->type()==DocHtmlList::Ordered) { m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n"; @@ -610,6 +882,7 @@ void HtmlDocVisitor::visitPost(DocHtmlList *s) m_t << "</ul>"; } if (!s->isPreformatted()) m_t << "\n"; + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocHtmlListItem *i) @@ -628,13 +901,15 @@ void HtmlDocVisitor::visitPost(DocHtmlListItem *) void HtmlDocVisitor::visitPre(DocHtmlDescList *dl) { if (m_hide) return; + forceEndParagraph(dl); m_t << "<dl" << htmlAttribsToString(dl->attribs()) << ">\n"; } -void HtmlDocVisitor::visitPost(DocHtmlDescList *) +void HtmlDocVisitor::visitPost(DocHtmlDescList *dl) { if (m_hide) return; m_t << "</dl>\n"; + forceStartParagraph(dl); } void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt) @@ -668,6 +943,8 @@ void HtmlDocVisitor::visitPre(DocHtmlTable *t) bool hasCellSpacing = FALSE; bool hasCellPadding = FALSE; + forceEndParagraph(t); + HtmlAttribListIterator li(t->attribs()); HtmlAttrib *att; for (li.toFirst();(att=li.current());++li) @@ -683,10 +960,11 @@ void HtmlDocVisitor::visitPre(DocHtmlTable *t) m_t << ">\n"; } -void HtmlDocVisitor::visitPost(DocHtmlTable *) +void HtmlDocVisitor::visitPost(DocHtmlTable *t) { if (m_hide) return; m_t << "</table>\n"; + forceStartParagraph(t); } void HtmlDocVisitor::visitPre(DocHtmlRow *tr) @@ -757,7 +1035,7 @@ void HtmlDocVisitor::visitPost(DocInternal *) void HtmlDocVisitor::visitPre(DocHRef *href) { if (m_hide) return; - m_t << "<a href=\"" << href->url() << "\"" + m_t << "<a href=\"" << convertToXML(href->url()) << "\"" << htmlAttribsToString(href->attribs()) << ">"; } @@ -770,6 +1048,7 @@ void HtmlDocVisitor::visitPost(DocHRef *) void HtmlDocVisitor::visitPre(DocHtmlHeader *header) { if (m_hide) return; + forceEndParagraph(header); m_t << "<h" << header->level() << htmlAttribsToString(header->attribs()) << ">"; } @@ -778,12 +1057,14 @@ void HtmlDocVisitor::visitPost(DocHtmlHeader *header) { if (m_hide) return; m_t << "</h" << header->level() << ">\n"; + forceStartParagraph(header); } void HtmlDocVisitor::visitPre(DocImage *img) { if (img->type()==DocImage::Html) { + forceEndParagraph(img); if (m_hide) return; QString baseName=img->name(); int i; @@ -793,7 +1074,7 @@ void HtmlDocVisitor::visitPre(DocImage *img) } m_t << "<div align=\"center\">" << endl; m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\"" - << baseName << "\"" << ">" << endl; + << baseName << "\"" << "/>" << endl; if (img->hasCaption()) { m_t << "<p><strong>"; @@ -816,6 +1097,7 @@ void HtmlDocVisitor::visitPost(DocImage *img) m_t << "</strong></p>"; } m_t << "</div>" << endl; + forceStartParagraph(img); } else // other format { @@ -889,21 +1171,23 @@ void HtmlDocVisitor::visitPre(DocSecRefItem *ref) void HtmlDocVisitor::visitPost(DocSecRefItem *) { if (m_hide) return; - m_t << "</a> "; + m_t << "</a></li>\n"; } -void HtmlDocVisitor::visitPre(DocSecRefList *) +void HtmlDocVisitor::visitPre(DocSecRefList *s) { if (m_hide) return; - m_t << "<multicol cols=3>" << endl; + forceEndParagraph(s); + m_t << "<div class=\"multicol\">" << endl; m_t << "<ul>" << endl; } -void HtmlDocVisitor::visitPost(DocSecRefList *) +void HtmlDocVisitor::visitPost(DocSecRefList *s) { if (m_hide) return; m_t << "</ul>" << endl; - m_t << "</multicol>" << endl; + m_t << "</div>" << endl; + forceStartParagraph(s); } //void HtmlDocVisitor::visitPre(DocLanguage *l) @@ -928,7 +1212,8 @@ void HtmlDocVisitor::visitPost(DocSecRefList *) void HtmlDocVisitor::visitPre(DocParamSect *s) { if (m_hide) return; - m_t << "<dl compact><dt><b>"; + forceEndParagraph(s); + m_t << "<dl><dt><b>"; switch(s->type()) { case DocParamSect::Param: @@ -950,11 +1235,13 @@ void HtmlDocVisitor::visitPre(DocParamSect *s) m_t << " <table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; } -void HtmlDocVisitor::visitPost(DocParamSect *) +void HtmlDocVisitor::visitPost(DocParamSect *s) { if (m_hide) return; m_t << " </table>" << endl; + m_t << " </dd>" << endl; m_t << "</dl>" << endl; + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocParamList *pl) @@ -1008,16 +1295,17 @@ void HtmlDocVisitor::visitPost(DocParamList *) void HtmlDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + forceEndParagraph(x); bool anonymousEnum = x->file()=="@"; if (!anonymousEnum) { - m_t << "<dl class=\"" << x->key() << "\" compact><dt><b><a class=\"el\" href=\"" + m_t << "<dl class=\"" << x->key() << "\"><dt><b><a class=\"el\" href=\"" << x->relPath() << x->file() << Doxygen::htmlFileExtension << "#" << x->anchor() << "\">"; } else { - m_t << "<dl class=\"" << x->key() << "\" compact><dt><b>"; + m_t << "<dl class=\"" << x->key() << "\"><dt><b>"; } filter(x->title()); m_t << ":"; @@ -1025,10 +1313,11 @@ void HtmlDocVisitor::visitPre(DocXRefItem *x) m_t << "</b></dt><dd>"; } -void HtmlDocVisitor::visitPost(DocXRefItem *) +void HtmlDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; m_t << "</dd></dl>" << endl; + forceStartParagraph(x); } void HtmlDocVisitor::visitPre(DocInternalRef *ref) @@ -1182,7 +1471,7 @@ void HtmlDocVisitor::writeDotFile(const QString &fileName,const QString &relPath << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\"" << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl; QString imap = getDotImageMapFromFile(fileName,outDir,relPath.data(),context); - m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl; + m_t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl; } void HtmlDocVisitor::writeMscFile(const QString &fileName,const QString &relPath, @@ -1201,6 +1490,82 @@ void HtmlDocVisitor::writeMscFile(const QString &fileName,const QString &relPath m_t << "<img src=\"" << relPath << baseName << ".png\" alt=\"" << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl; QString imap = getMscImageMapFromFile(fileName,outDir,relPath.data(),context); - m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl; + m_t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl; +} + +/** Used for items found inside a paragraph, which due to XHTML restrictions + * have to be outside of the paragraph. This method will forcefully end + * the current paragraph and forceStartParagraph() will restart it. + */ +void HtmlDocVisitor::forceEndParagraph(DocNode *n) +{ + //printf("forceEndParagraph(%p) %d\n",n,n->kind()); + if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) + { + DocPara *para = (DocPara*)n->parent(); + int nodeIndex = para->children().findRef(n); + nodeIndex--; + if (nodeIndex<0) return; // first node + while (nodeIndex>=0 && + para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace + ) + { + 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; + } + + bool isFirst; + bool isLast; + getParagraphContext(para,isFirst,isLast); + //printf("forceEnd first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) return; + + m_t << "</p>" << endl; + } +} + +/** Used for items found inside a paragraph, which due to XHTML restrictions + * have to be outside of the paragraph. This method will forcefully start + * the paragraph, that was previously ended by forceEndParagraph(). + */ +void HtmlDocVisitor::forceStartParagraph(DocNode *n) +{ + //printf("forceStartParagraph(%p) %d\n",n,n->kind()); + if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) // if we are inside a paragraph + { + DocPara *para = (DocPara*)n->parent(); + int nodeIndex = para->children().findRef(n); + int numNodes = para->children().count(); + nodeIndex++; + if (nodeIndex==numNodes) return; // last node + while (nodeIndex<numNodes && + para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace + ) + { + nodeIndex++; + } + if (nodeIndex<numNodes) + { + DocNode *n = para->children().at(nodeIndex); + if (mustBeOutsideParagraph(n)) return; + } + else + { + return; // only whitespace at the end! + } + + bool isFirst; + bool isLast; + getParagraphContext(para,isFirst,isLast); + //printf("forceStart first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) return; + + m_t << "<p>"; + } } diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index bbe7c34..929fb5c 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -23,6 +23,7 @@ #include <qstack.h> #include <qcstring.h> +class DocNode; class QTextStream; class CodeOutputInterface; class QString; @@ -141,6 +142,9 @@ class HtmlDocVisitor : public DocVisitor void pushEnabled(); void popEnabled(); + void forceEndParagraph(DocNode *n); + void forceStartParagraph(DocNode *n); + //-------------------------------------- // state variables //-------------------------------------- diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 12213f7..49dd8e2 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -568,15 +568,15 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title, else relPathStr=relPath; - t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" - "<html><head>" - "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8" - //<< theTranslator->idLanguageCharset() - << "\">\n" - "<title>"; +// t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"; +// t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"; + t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"; + t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n" + "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"/>\n" + "<title>"; t << convertToHtml(title); t << "</title>\n"; - t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\">\n"; + t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"; t << "<link "; t << "href=\""; if (Config_getString("HTML_STYLESHEET").isEmpty()) @@ -594,8 +594,8 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title, t << relPathStr << cssfi.fileName(); } - t << "\" rel=\"stylesheet\" type=\"text/css\">\n"; - t << "</head><body>\n"; + t << "\" rel=\"stylesheet\" type=\"text/css\"/>\n"; + t << "</head>\n<body>\n"; } @@ -609,11 +609,10 @@ void HtmlGenerator::writeHeaderFile(QFile &file) void HtmlGenerator::writeFooterFile(QFile &file) { QTextStream t(&file); - t << "<hr size=\"1\"><address style=\"text-align: right;\"><small>\n"; + t << "<hr size=\"1\"/><address style=\"text-align: right;\"><small>\n"; t << theTranslator->trGeneratedAt( "$datetime", "$projectname" ); t << " <a href=\"http://www.doxygen.org/index.html\">" - << "<img src=\"doxygen.png\" alt=\"doxygen\" " - << "align=\"middle\" border=\"0\">" + << "<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>" << "</a> $doxygenversion"; t << "</small></address>\n" << "</body>\n" @@ -715,24 +714,24 @@ static void writePageFooter(QTextStream &t,const QCString &lastTitle, { if (g_footer.isEmpty()) { - t << "<hr size=\"1\"><address style=\"text-align: right;\"><small>"; + t << "<hr size=\"1\"/><address style=\"text-align: right;\"><small>"; t << theTranslator->trGeneratedAt( dateToString(TRUE), Config_getString("PROJECT_NAME") ); t << " " << endl << "<a href=\"http://www.doxygen.org/index.html\">"; - t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" " - << "align=\"middle\" border=\"0\">" << "</a> " << versionString << " "; + t << endl << "<img class=\"footer\" src=\"" << relPath << "doxygen.png\" alt=\"doxygen\"/>" + << "</a> " << versionString << " "; t << "</small></address>"; if (Debug::isFlagSet(Debug::Validate)) { t << "<p><a href=\"http://validator.w3.org/check/referer\">" - "<img border=\"0\" src=\"http://www.w3.org/Icons/valid-html401\"" + "<img class=\"footer\" src=\"http://www.w3.org/Icons/valid-html401\"" " height=\"31\" width=\"88\" alt=\"This page is Valid HTML 4.01 " "Transitional!\"></a><a href=\"http://jigsaw.w3.org/css-validator/\">" - "<img style=\"border:0;width:88px;height:31px\" " + "<img class=\"footer\" style=\"border:0;width:88px;height:31px\" " "src=\"http://jigsaw.w3.org/css-validator/images/vcss\" " - "alt=\"This page uses valid CSS!\"></a></p>"; + "alt=\"This page uses valid CSS!\"/></a></p>"; } t << "\n</body>\n</html>\n"; } @@ -754,7 +753,7 @@ void HtmlGenerator::endFile() void HtmlGenerator::startProjectNumber() { - t << "<h3 align=\"center\">"; + t << "<h3>"; } void HtmlGenerator::endProjectNumber() @@ -806,7 +805,7 @@ void HtmlGenerator::startDoxyAnchor(const char *,const char *, const char *anchor, const char *name, const char *args) { - t << "<a class=\"anchor\" name=\"" << anchor << "\"></a>"; + t << "<a class=\"anchor\" id=\"" << anchor << "\"></a>"; t << "<!-- doxytag: member=\""; docify(name,TRUE); t << "\" ref=\""; @@ -820,10 +819,10 @@ void HtmlGenerator::endDoxyAnchor(const char *,const char *) { } -void HtmlGenerator::newParagraph() -{ - t << endl << "<p>" << endl; -} +//void HtmlGenerator::newParagraph() +//{ +// t << endl << "<p>" << endl; +//} void HtmlGenerator::startParagraph() { @@ -840,11 +839,20 @@ void HtmlGenerator::writeString(const char *text) t << text; } +void HtmlGenerator::startIndexListItem() +{ + t << "<li>"; +} + +void HtmlGenerator::endIndexListItem() +{ + t << "</li>" << endl; +} + void HtmlGenerator::startIndexItem(const char *ref,const char *f) { //printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f); QCString *dest; - t << "<li>"; if (ref || f) { if (ref) @@ -880,7 +888,7 @@ void HtmlGenerator::endIndexItem(const char *ref,const char *f) //printf("HtmlGenerator::endIndexItem(%s,%s,%s)\n",ref,f,name); if (ref || f) { - t << "</a>" << endl; + t << "</a>"; } else { @@ -1006,14 +1014,14 @@ void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::Secti { switch(type) { - case SectionInfo::Page: t << "<h1>"; break; - case SectionInfo::Section: t << "<h2>"; break; - case SectionInfo::Subsection: t << "<h3>"; break; - case SectionInfo::Subsubsection: t << "<h4>"; break; - case SectionInfo::Paragraph: t << "<h5>"; break; + case SectionInfo::Page: t << "\n\n<h1>"; break; + case SectionInfo::Section: t << "\n\n<h2>"; break; + case SectionInfo::Subsection: t << "\n\n<h3>"; break; + case SectionInfo::Subsubsection: t << "\n\n<h4>"; break; + case SectionInfo::Paragraph: t << "\n\n<h5>"; break; default: ASSERT(0); break; } - t << "<a class=\"anchor\" name=\"" << lab << "\">"; + t << "<a class=\"anchor\" id=\"" << lab << "\">"; } void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type) @@ -1095,6 +1103,10 @@ void HtmlGenerator::codify(const char *str) break; case '&': t << "&"; col++; break; + case '\'': t << "'"; col++; + break; + case '"': t << """; col++; + break; //case ' ': t << " "; col++; // break; case '\\': @@ -1133,10 +1145,13 @@ void HtmlGenerator::endClassDiagram(const ClassDiagram &d, { t << "</div>" << endl; t << "<div class=\"dynsection\">" << endl; - t << "\n<p><center><img src=\"" - << relPath << fileName << ".png\" usemap=\"#" << name << "_map\"" - << " border=\"0\" alt=\"\"></center>" << endl - << "<map name=\"" << name << "_map\">" << endl; + t << "<img class=\"center\" src=\""; + t << relPath << fileName << ".png\" usemap=\"#"; + docify(name); + t << "_map\" alt=\"\"/>" << endl; + t << "<map id=\""; + docify(name); + t << "_map\">" << endl; d.writeImage(t,dir,relPath,fileName); t << "</div>" << endl; @@ -1179,10 +1194,10 @@ void HtmlGenerator::startMemberItem(int annoType) t << "<tr>"; switch(annoType) { - case 0: t << "<td class=\"memItemLeft\" nowrap align=\"right\" valign=\"top\">"; break; - case 1: t << "<td class=\"memItemLeft\" nowrap>"; break; - case 2: t << "<td class=\"memItemLeft\" nowrap valign=\"top\">"; break; - default: t << "<td class=\"memTemplParams\" nowrap colspan=\"2\">"; break; + 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; } } else @@ -1196,7 +1211,7 @@ void HtmlGenerator::endMemberItem() //DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "</td></tr>\n"; + t << "</td></tr>"; } t << endl; } @@ -1210,7 +1225,7 @@ void HtmlGenerator::endMemberTemplateParams() if (Config_getBool("HTML_ALIGN_MEMBERS")) { t << "</td></tr>" << endl; - t << "<tr><td class=\"memTemplItemLeft\" nowrap align=\"right\" valign=\"top\">"; + t << "<tr><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">"; } } @@ -1243,11 +1258,11 @@ void HtmlGenerator::endMemberDescription() DBG_HTML(t << "<!-- endMemberDescription -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "<br></td></tr>" << endl; + t << "<br/></td></tr>" << endl; } else { - t << "<br></dl>"; + t << "<br/></dl>"; } } @@ -1276,7 +1291,7 @@ void HtmlGenerator::startMemberHeader() DBG_HTML(t << "<!-- startMemberHeader -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "<tr><td colspan=\"2\"><br><h2>"; + t << "<tr><td colspan=\"2\"><br/><h2>"; } else { @@ -1306,7 +1321,7 @@ void HtmlGenerator::startMemberSubtitle() void HtmlGenerator::endMemberSubtitle() { DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl) - if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br><br></td></tr>" << endl; + if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br/><br/></td></tr>" << endl; } void HtmlGenerator::startIndexList() @@ -1400,7 +1415,7 @@ void HtmlGenerator::startMemberDocName(bool /*align*/) void HtmlGenerator::endMemberDocName() { DBG_HTML(t << "<!-- endMemberDocName -->" << endl;) - t << " </td>" << endl; + t << "</td>" << endl; } void HtmlGenerator::startParameterList(bool openBracket) @@ -1449,7 +1464,7 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket) { if (emptyList) { - t << " </td>" << endl; + t << "</td>" << endl; t << " <td>"; if (closeBracket) t << " )"; t << " </td>" << endl; @@ -1507,11 +1522,11 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g) g.writeGraph(t,BITMAP,dir,relPath); if (Config_getBool("GENERATE_LEGEND")) { - t << "<center><font size=\"2\">["; + t << "<center><span class=\"legend\">["; startHtmlLink(relPath+"graph_legend"+Doxygen::htmlFileExtension); t << theTranslator->trLegend(); endHtmlLink(); - t << "]</font></center>"; + t << "]</span></center>"; } t << "</div>" << endl; } @@ -1590,7 +1605,7 @@ void HtmlGenerator::startMemberGroupDocs() void HtmlGenerator::endMemberGroupDocs() { - t << "<br><br></div></td></tr>" << endl; + t << "<br/><br/></div></td></tr>" << endl; } void HtmlGenerator::startMemberGroup() @@ -1611,7 +1626,7 @@ void HtmlGenerator::startIndent() void HtmlGenerator::endIndent() { DBG_HTML(t << "<!-- endIndent -->" << endl;) - t << endl << "</div>" << endl << "</div><p>" << endl; + t << endl << "</div>" << endl << "</div>" << endl; } void HtmlGenerator::addIndexItem(const char *,const char *) @@ -1653,7 +1668,7 @@ void HtmlGenerator::startSimpleSect(SectionTypes, const char *filename,const char *anchor, const char *title) { - t << "<dl compact><dt><b>"; + t << "<dl><dt><b>"; if (filename) { writeObjectLink(0,filename,anchor,title); @@ -1673,7 +1688,7 @@ void HtmlGenerator::endSimpleSect() void HtmlGenerator::startParamList(ParamListTypes, const char *title) { - t << "<dl compact><dt><b>"; + t << "<dl><dt><b>"; docify(title); t << "</b></dt>"; } @@ -2041,7 +2056,7 @@ void HtmlGenerator::generateSectionImages() void HtmlGenerator::startConstraintList(const char *header) { t << "<div class=\"typeconstraint\">" << endl; - t << "<dl compact><dt><b>" << header << "</b><dt><dd>" << endl; + t << "<dl><dt><b>" << header << "</b><dt><dd>" << endl; t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; } @@ -2086,11 +2101,11 @@ void HtmlGenerator::lineBreak(const char *style) { if (style) { - t << "<br class=\"" << style << "\">" << endl; + t << "<br class=\"" << style << "\"/>" << endl; } else { - t << "<br>" << endl; + t << "<br/>" << endl; } } diff --git a/src/htmlgen.h b/src/htmlgen.h index 32ef613..76467a2 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -63,10 +63,11 @@ class HtmlGenerator : public OutputGenerator void startTitle() { t << "<h1>"; } void endTitle() { t << "</h1>"; } - void newParagraph(); void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem(); + void endIndexListItem(); void startIndexList(); void endIndexList(); void startIndexKey(); @@ -92,7 +93,8 @@ class HtmlGenerator : public OutputGenerator void endTypewriter() { t << "</code>"; } void startGroupHeader(); void endGroupHeader(); - void writeListItem() { t << "<li>"; } + void startItemListItem() { t << "<li>"; } + void endItemListItem() { t << "</li>\n"; } void startMemberSections(); void endMemberSections(); @@ -122,7 +124,7 @@ class HtmlGenerator : public OutputGenerator void startMemberDescription(); void endMemberDescription(); - void writeRuler() { t << "<hr>"; } + void writeRuler() { t << "<hr/>"; } void writeAnchor(const char *,const char *name) { t << "<a name=\"" << name <<"\"></a>"; } void startCodeFragment() { t << PREFRAG_START; } @@ -134,10 +136,12 @@ class HtmlGenerator : public OutputGenerator void endEmphasis() { t << "</em>"; } void startBold() { t << "<b>"; } void endBold() { t << "</b>"; } - void startDescription() { t << endl << "<dl compact>" << endl; } - void endDescription() { t << endl << "</dl>" << endl; } + void startDescription() { t << endl << "<dl>" << endl; } + void endDescription() { t << endl << "</dl>\n" << endl; } void startDescItem() { t << "<dt>"; } - void endDescItem() { t << "<dd>"; } + void endDescItem() { t << "</dt>"; } + void startDescForItem() { t << "<dd>"; } + void endDescForItem() { t << "</dd>\n"; } void lineBreak(const char *style); void writeChar(char c); void startMemberDoc(const char *,const char *,const char *,const char *); @@ -160,13 +164,13 @@ 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 startDescList(SectionTypes) { t << "<dl compact><dt><b>" << endl; } + //void endDescList() { t << "</dl>"; } void startSimpleSect(SectionTypes,const char *,const char *,const char *); void endSimpleSect(); void startParamList(ParamListTypes,const char *); void endParamList(); - void writeDescItem() { t << "<dd>" << endl; } + //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 *); diff --git a/src/index.cpp b/src/index.cpp index f42e2b1..bcfe4eb 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -336,6 +336,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,F ftv->incContentsDepth(); started=TRUE; } + ol.startIndexListItem(); //printf("Passed...\n"); bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd); //printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren); @@ -371,6 +372,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,F cd->visited=TRUE; writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv); } + ol.endIndexListItem(); } } if (started) @@ -500,6 +502,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT Doxygen::indexList.incContentsDepth(); started=TRUE; } + ol.startIndexListItem(); bool hasChildren = !cd->visited && classHasVisibleChildren(cd); //printf("list: Has children %s: %d\n",cd->name().data(),hasChildren); if (cd->isLinkable()) @@ -533,6 +536,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT writeClassTree(ol,cd->subClasses(),cd->visited,1,ftv); cd->visited=TRUE; } + ol.endIndexListItem(); } } } @@ -617,10 +621,11 @@ void writeHierarchicalIndex(OutputList &ol) { ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); + ol.startParagraph(); ol.startTextLink("inherits",0); ol.parseText(theTranslator->trGotoGraphicalHierarchy()); ol.endTextLink(); - ol.newParagraph(); + ol.endParagraph(); ol.enable(OutputGenerator::Latex); ol.enable(OutputGenerator::RTF); } @@ -665,10 +670,11 @@ void writeGraphicalClassHierarchy(OutputList &ol) endTitle(ol,0,0); ol.startTextBlock(); Doxygen::indexList.addContentsItem(FALSE,theTranslator->trGraphicalHierarchy(),0,"inherits",0); + ol.startParagraph(); ol.startTextLink("hierarchy",0); ol.parseText(theTranslator->trGotoTextualHierarchy()); ol.endTextLink(); - ol.newParagraph(); + ol.endParagraph(); //parseText(ol,theTranslator->trClassHierarchyDescription()); //ol.newParagraph(); ol.endTextBlock(); @@ -1080,6 +1086,25 @@ void writeAnnotatedClassList(OutputList &ol) ol.endIndexList(); } +static QCString letterToLabel(char startLetter) +{ + QCString s(5); + if (isId(startLetter)) + { + s[0]=startLetter; s[1]=0; + } + else + { + const char hex[]="0123456789abcdef"; + s[0]='0'; + s[1]='x'; + s[2]=hex[startLetter>>4]; + s[3]=hex[startLetter&0xF]; + s[4]=0; + } + return s; +} + //---------------------------------------------------------------------------- class PrefixIgnoreClassList : public ClassList @@ -1123,7 +1148,7 @@ void writeAlphabeticalClassList(OutputList &ol) } } - QCString alphaLinks = "<p><div class=\"qindex\">"; + QCString alphaLinks = "<div class=\"qindex\">"; int l; for (l = 0; l < 256; l++) { @@ -1137,7 +1162,7 @@ void writeAlphabeticalClassList(OutputList &ol) } } - alphaLinks += "</div><p>\n"; + alphaLinks += "</div>\n"; ol.writeString(alphaLinks); ol.writeString("<table align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"); @@ -1236,7 +1261,7 @@ void writeAlphabeticalClassList(OutputList &ol) //printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>"); int index = getPrefixIndex(cd->className()); startLetter=toupper(cd->className().at(index)); - char s[2]; s[0]=startLetter; s[1]=0; + QCString s = letterToLabel(startLetter); //ol.writeIndexHeading(s); ol.writeString("<a name=\"letter_"); ol.writeString(s); @@ -1437,6 +1462,7 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, QCString prevDefName; bool first=TRUE; bool firstSection=TRUE; + bool firstItem=TRUE; for (pi=startIndex; pi<=endIndex; pi++) // page==-1 => pi=[0..127], page!=-1 => pi=page { MemberIndexList *ml = &memberLists[pi]; @@ -1457,16 +1483,20 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, tolower(name.at(startIndex))!=tolower(prevName.at(0))) && useSections) // new section { + if (!firstItem) ol.endItemListItem(); if (!firstSection) ol.endItemList(); - char cs[2]; - cs[0]=tolower(name.at(startIndex));cs[1]='\0'; + char cl[2]; + cl[0] = tolower(name.at(startIndex)); + cl[1] = 0; + QCString cs = letterToLabel(cl[0]); QCString anchor=(QCString)"index_"+cs; - QCString title=(QCString)"- "+cs+" -"; + QCString title=(QCString)"- "+cl+" -"; ol.startSection(anchor,title,SectionInfo::Subsection); ol.docify(title); ol.endSection(anchor,SectionInfo::Subsection); ol.startItemList(); firstSection=FALSE; + firstItem=TRUE; } else if (!useSections && first) { @@ -1475,7 +1505,9 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, } // member name - ol.writeListItem(); + if (!firstItem) ol.endItemListItem(); + ol.startItemListItem(); + firstItem=FALSE; ol.docify(name); if (isFunc) ol.docify("()"); ol.writeString("\n"); @@ -1494,6 +1526,7 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, writeLinkForMemberMap[(int)type](ol,md,sep,prevDefName); } } + if (!firstItem) ol.endItemListItem(); ol.endItemList(); } @@ -1848,7 +1881,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h // normal lists otherwise ol.writeString(" "); } - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA writeMemberList(ol,quickIndex, multiPageIndex?page:-1, g_memberIndexLetterUsed[hl], @@ -1979,7 +2012,7 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) // normal lists otherwise ol.writeString(" "); } - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA //writeFileMemberList(ol,quickIndex,hl,page); writeMemberList(ol,quickIndex, multiPageIndex?page:-1, @@ -2107,7 +2140,7 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, // normal lists otherwise ol.writeString(" "); } - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA //writeNamespaceMemberList(ol,quickIndex,hl,page); writeMemberList(ol,quickIndex, @@ -2164,7 +2197,7 @@ void writeExampleIndex(OutputList &ol) PageDef *pd=0; for (pdi.toFirst();(pd=pdi.current());++pdi) { - ol.writeListItem(); + ol.startItemListItem(); QCString n=pd->getOutputFileBase(); if (!pd->title().isEmpty()) { @@ -2176,6 +2209,7 @@ void writeExampleIndex(OutputList &ol) ol.writeObjectLink(0,n,0,pd->name()); Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),n,0); } + ol.endItemListItem(); ol.writeString("\n"); } ol.endItemList(); @@ -2270,6 +2304,7 @@ void writePageIndex(OutputList &ol) bool hasSubPages = pd->hasSubPages(); + ol.startIndexListItem(); ol.startIndexItem(pd->getReference(),pd->getOutputFileBase()); ol.parseText(pageTitle); ol.endIndexItem(pd->getReference(),pd->getOutputFileBase()); @@ -2282,6 +2317,7 @@ void writePageIndex(OutputList &ol) ol.writeString("\n"); Doxygen::indexList.addContentsItem(hasSubPages,pageTitle,pd->getReference(),pd->getOutputFileBase(),0); writeSubPages(pd); + ol.endIndexListItem(); } } endIndexHierarchy(ol,0); @@ -2379,7 +2415,6 @@ void writeGroupIndexItem(GroupDef *gd,MemberList *ml,const QCString &title) //---------------------------------------------------------------------------- /*! * write groups as hierarchical trees - * \author KPW */ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) { @@ -2437,6 +2472,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) //parseText(ol,gd->groupTitle()); //ol.endTextLink(); + ol.startIndexListItem(); ol.startIndexItem(gd->getReference(),gd->getOutputFileBase()); ol.parseText(gd->groupTitle()); ol.endIndexItem(gd->getReference(),gd->getOutputFileBase()); @@ -2572,6 +2608,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) Doxygen::indexList.decContentsDepth(); } } + ol.endIndexListItem(); Doxygen::indexList.decContentsDepth(); if (ftv) @@ -2627,6 +2664,7 @@ void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv) ftv->incContentsDepth(); } + ol.startIndexListItem(); ol.startIndexItem(dd->getReference(),dd->getOutputFileBase()); ol.parseText(dd->shortName()); ol.endIndexItem(dd->getReference(),dd->getOutputFileBase()); @@ -2664,6 +2702,7 @@ void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv) } } } + ol.endIndexListItem(); Doxygen::indexList.decContentsDepth(); if (ftv) @@ -2710,6 +2749,7 @@ void writeGroupIndex(OutputList &ol) Doxygen::indexList.incContentsDepth(); ol.parseText(theTranslator->trModulesDescription()); ol.endTextBlock(); + FTVHelp* ftv = NULL; QCString& TreeView=Config_getEnum("GENERATE_TREEVIEW"); if (TreeView=="HIERARCHIES" || TreeView=="ALL") @@ -2857,7 +2897,7 @@ void writeIndex(OutputList &ol) } } ol.endTitleHead(0,0); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA if (!Config_getString("PROJECT_NUMBER").isEmpty()) { ol.startProjectNumber(); diff --git a/src/latexgen.cpp b/src/latexgen.cpp index f3f6be3..aca7fac 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -412,6 +412,7 @@ static void writeDefaultStyleSheetPart3(QTextStream &t) t << "\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n"; t << "\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n"; t << "\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n"; + t << "\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n"; } void LatexGenerator::writeHeaderFile(QFile &f) diff --git a/src/latexgen.h b/src/latexgen.h index 00e52f8..2967c74 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -65,6 +65,8 @@ class LatexGenerator : public OutputGenerator void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem() {} + void endIndexListItem() {} void startIndexList() { t << "\\begin{CompactList}" << endl; } void endIndexList() { t << "\\end{CompactList}" << endl; } void startIndexKey(); @@ -90,7 +92,8 @@ class LatexGenerator : public OutputGenerator void endTypewriter() { t << "}"; } void startGroupHeader(); void endGroupHeader(); - void writeListItem() { t << "\\item " << endl; } + void startItemListItem() { t << "\\item " << endl; } + void endItemListItem() {} void startMemberSections() {} void endMemberSections() {} @@ -161,7 +164,8 @@ class LatexGenerator : public OutputGenerator void endSimpleSect(); void startParamList(ParamListTypes,const char *title); void endParamList(); - void writeDescItem() { t << "\\par" << endl; } + void startDescForItem() { t << "\\par" << endl; } + void endDescForItem() {} void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *); diff --git a/src/mangen.cpp b/src/mangen.cpp index c438a15..35ffc26 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -356,7 +356,7 @@ void ManGenerator::endTitle() t << "\""; } -void ManGenerator::writeListItem() +void ManGenerator::startItemListItem() { if (!firstCol) t << endl; t << ".TP" << endl; @@ -365,6 +365,10 @@ void ManGenerator::writeListItem() col=0; } +void ManGenerator::endItemListItem() +{ +} + void ManGenerator::startCodeFragment() { newParagraph(); @@ -476,7 +480,7 @@ void ManGenerator::startDescItem() // paragraph=TRUE; //} -void ManGenerator::writeDescItem() +void ManGenerator::startDescForItem() { if (!firstCol) t << endl; if (!paragraph) t << ".in -1c" << endl; @@ -486,6 +490,10 @@ void ManGenerator::writeDescItem() col=0; } +void ManGenerator::endDescForItem() +{ +} + void ManGenerator::endDescItem() { t << "\" 1c" << endl; @@ -669,13 +677,14 @@ void ManGenerator::startConstraintList(const char *header) void ManGenerator::startConstraintParam() { - writeListItem(); + startItemListItem(); startEmphasis(); } void ManGenerator::endConstraintParam() { endEmphasis(); + endItemListItem(); t << " : "; } diff --git a/src/mangen.h b/src/mangen.h index 8dbe7b8..4254649 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -63,6 +63,8 @@ class ManGenerator : public OutputGenerator void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem() {} + void endIndexListItem() {} void startIndexList() {} void endIndexList() { newParagraph(); } void startIndexKey() {} @@ -95,7 +97,9 @@ class ManGenerator : public OutputGenerator void insertMemberAlign(bool) {} void startMemberSubtitle() {} void endMemberSubtitle() {} - void writeListItem(); + //void writeListItem(); + void startItemListItem(); + void endItemListItem(); void startMemberDocList() {} void endMemberDocList() {} void startMemberList(); @@ -157,7 +161,9 @@ class ManGenerator : public OutputGenerator void endSimpleSect(); void startParamList(ParamListTypes,const char *title); void endParamList(); - void writeDescItem(); + //void writeDescItem(); + void startDescForItem(); + void endDescForItem(); void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *) {} @@ -177,7 +183,7 @@ class ManGenerator : public OutputGenerator void startDescTable() {} void endDescTable() {} - void startDescTableTitle() { writeListItem(); startBold(); startEmphasis(); } + void startDescTableTitle() { startItemListItem(); startBold(); startEmphasis(); endItemListItem(); } void endDescTableTitle() { endEmphasis(); endBold(); } void startDescTableData() { t << endl; firstCol=TRUE; } void endDescTableData() {} diff --git a/src/memberdef.cpp b/src/memberdef.cpp index c708ffd..7bbfed4 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -140,9 +140,14 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, //if (!md->isDefine()) ol.startParameter(TRUE); else ol.docify(" "); bool first=TRUE; + bool paramTypeStarted=FALSE; while (a) { - if (md->isDefine() || first) ol.startParameterType(first,md->isObjCMethod()?"dummy":0); + if (md->isDefine() || first) + { + ol.startParameterType(first,md->isObjCMethod()?"dummy":0); + paramTypeStarted=TRUE; + } QRegExp re(")("),res("(.*\\*"); int vp=a->type.find(re); int wp=a->type.find(res); @@ -179,7 +184,11 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, } if (!md->isDefine()) { - ol.endParameterType(); + if (paramTypeStarted) + { + ol.endParameterType(); + paramTypeStarted=FALSE; + } ol.startParameterName(defArgList->count()<2); } if (hasFuncPtrType) @@ -236,7 +245,16 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, if (key!=",") key+=":"; // for normal keywords add colon } ol.endParameterName(FALSE,FALSE,!md->isObjCMethod()); + if (paramTypeStarted) + { + ol.endParameterType(); + } ol.startParameterType(FALSE,key); + paramTypeStarted=TRUE; + } + else + { + ol.endParameterName(FALSE,FALSE,TRUE); } } first=FALSE; @@ -1497,7 +1515,6 @@ void MemberDef::writeDeclaration(OutputList &ol, //ol.startEmphasis(); ol.popGeneratorState(); } - //ol.newParagraph(); ol.endMemberDescription(); } warnIfUndocumented(); @@ -1926,10 +1943,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ol.endDoxyAnchor(cfname,memAnchor); ol.startIndent(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + // FIXME:PARA + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); /* write multi-line initializer (if any) */ if (hasMultiLineInitializer() @@ -1969,8 +1987,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ) ) { - ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():container,this,brief,FALSE,FALSE); - ol.newParagraph(); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(), + getOuterScope()?getOuterScope():container,this, + brief,FALSE,FALSE,0,TRUE,FALSE); + ol.endParagraph(); } /* write detailed description */ @@ -1980,8 +2001,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE); if (!inbodyDocumentation().isEmpty()) { - ol.newParagraph(); + ol.startParagraph(); ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE); + ol.endParagraph(); } } else if (!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") || @@ -1989,7 +2011,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { if (!inbodyDocumentation().isEmpty()) { - ol.newParagraph(); ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE); } } @@ -2068,9 +2089,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { if (first) { - //ol.newParagraph(); ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": "); - ol.writeDescItem(); + ol.startDescForItem(); ol.startDescTable(); } @@ -2110,13 +2130,13 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (!fmd->briefDescription().isEmpty()) { ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE); - //ol.newParagraph(); - } - if (!fmd->briefDescription().isEmpty() && - !fmd->documentation().isEmpty()) - { - ol.newParagraph(); } + // FIXME:PARA + //if (!fmd->briefDescription().isEmpty() && + // !fmd->documentation().isEmpty()) + //{ + // ol.newParagraph(); + //} if (!fmd->documentation().isEmpty()) { ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE); @@ -2130,6 +2150,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { //ol.endItemList(); ol.endDescTable(); + ol.endDescForItem(); ol.endSimpleSect(); ol.writeChar('\n'); } @@ -2269,9 +2290,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (hasExamples()) { ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); - ol.writeDescItem(); + ol.startDescForItem(); writeExample(ol,m_impl->exampleSDict); - //ol.endDescItem(); + ol.endDescForItem(); ol.endSimpleSect(); } @@ -2296,10 +2317,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { msg("Generating call graph for function %s\n",qualifiedName().data()); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startCallGraph(); ol.parseText(theTranslator->trCallGraph()); ol.endCallGraph(callGraph); + ol.endParagraph(); ol.enableAll(); } } @@ -2312,10 +2334,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { msg("Generating caller graph for function %s\n",qualifiedName().data()); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startCallGraph(); ol.parseText(theTranslator->trCallerGraph()); ol.endCallGraph(callerGraph); + ol.endParagraph(); ol.enableAll(); } } @@ -2518,7 +2541,7 @@ void MemberDef::setAnchor(const char *a) QCString sigStr(33); MD5Buffer((const unsigned char *)memAnchor.data(),memAnchor.length(),md5_sig); MD5SigToString(md5_sig,sigStr.data(),33); - m_impl->anc = sigStr; + m_impl->anc = "a"+sigStr; } void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri, diff --git a/src/msc.cpp b/src/msc.cpp index 064e414..f17ab0b 100644 --- a/src/msc.cpp +++ b/src/msc.cpp @@ -81,7 +81,7 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel } t << "\" shape=\"rect\" coords=\"" << x1 << "," << y1 << "," << x2 << "," << y2 << "\"" - << " alt=\"\">" << endl; + << " alt=\"\"/>" << endl; } } diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 869b5a2..bac6779 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -257,7 +257,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -268,7 +268,6 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE); } ol.endTextBlock(); - ol.newParagraph(); } } @@ -276,7 +275,9 @@ void NamespaceDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -292,11 +293,13 @@ void NamespaceDef::writeBriefDescription(OutputList &ol) ol.endTextLink(); } ol.popGeneratorState(); + ol.endParagraph(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + // FIXME:PARA + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); } ol.writeSynopsis(); } @@ -792,10 +795,11 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca ol.endMemberItem(); if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } } } diff --git a/src/outputgen.h b/src/outputgen.h index 99248f0..6a4158a 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -101,7 +101,7 @@ class BaseOutputDocInterface : public CodeOutputInterface const QCString &,bool) {} virtual void parseText(const QCString &) {} - /*! Start of a bullet list: e.g. \c \<ul\> in html. writeListItem() is + /*! Start of a bullet list: e.g. \c \<ul\> in html. startItemListItem() is * Used for the bullet items. */ virtual void startItemList() = 0; @@ -109,7 +109,12 @@ class BaseOutputDocInterface : public CodeOutputInterface /*! Writes a list item for a bullet or enumerated * list: e.g. \c \<li\> in html */ - virtual void writeListItem() = 0; + virtual void startItemListItem() = 0; + + /*! Writes a list item for a bullet or enumerated + * list: e.g. \c \</li\> in html + */ + virtual void endItemListItem() = 0; /*! Ends a bullet list: e.g. \c \</ul\> in html */ virtual void endItemList() = 0; @@ -130,11 +135,11 @@ class BaseOutputDocInterface : public CodeOutputInterface virtual void writeString(const char *text) = 0; /*! Starts a new paragraph */ - virtual void newParagraph() = 0; + //virtual void newParagraph() = 0; /*! Starts a new paragraph */ virtual void startParagraph() = 0; - /*! End a paragraph */ + /*! Ends a paragraph */ virtual void endParagraph() = 0; /*! Writes a link to an object in the documentation. @@ -211,8 +216,11 @@ class BaseOutputDocInterface : public CodeOutputInterface /*! Starts an item of a description list: e.g. \c \<dt\> in HTML. */ virtual void startDescItem() = 0; + virtual void startDescForItem() = 0; + virtual void endDescForItem() = 0; + /*! Ends an item of a description list and starts the - * description itself: e.g. \c \<dd\> in HTML. + * description itself: e.g. \c \</dt\> in HTML. */ virtual void endDescItem() = 0; @@ -227,7 +235,7 @@ class BaseOutputDocInterface : public CodeOutputInterface virtual void startParamList(ParamListTypes t,const char *title) = 0; virtual void endParamList() = 0; - virtual void writeDescItem() = 0; + //virtual void writeDescItem() = 0; virtual void startTitle() = 0; virtual void endTitle() = 0; @@ -303,6 +311,8 @@ class OutputGenerator : public BaseOutputDocInterface virtual void writeStyleInfo(int part) = 0; virtual void startTitleHead(const char *) = 0; virtual void endTitleHead(const char *fileName,const char *name) = 0; + virtual void startIndexListItem() = 0; + virtual void endIndexListItem() = 0; virtual void startIndexList() = 0; virtual void endIndexList() = 0; virtual void startIndexKey() = 0; diff --git a/src/outputlist.h b/src/outputlist.h index 6187c7d..be467d2 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -97,14 +97,18 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startTitle); } void endTitle() { forall(&OutputGenerator::endTitle); } - void newParagraph() - { forall(&OutputGenerator::newParagraph); } + //void newParagraph() + //{ forall(&OutputGenerator::newParagraph); } void startParagraph() { forall(&OutputGenerator::startParagraph); } void endParagraph() { forall(&OutputGenerator::endParagraph); } void writeString(const char *text) { forall(&OutputGenerator::writeString,text); } + void startIndexListItem() + { forall(&OutputGenerator::startIndexListItem); } + void endIndexListItem() + { forall(&OutputGenerator::endIndexListItem); } void startIndexList() { forall(&OutputGenerator::startIndexList); } void endIndexList() @@ -157,8 +161,12 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startGroupHeader); } void endGroupHeader() { forall(&OutputGenerator::endGroupHeader); } - void writeListItem() - { forall(&OutputGenerator::writeListItem); } + //void writeListItem() + //{ forall(&OutputGenerator::writeListItem); } + void startItemListItem() + { forall(&OutputGenerator::startItemListItem); } + void endItemListItem() + { forall(&OutputGenerator::endItemListItem); } void startMemberSections() { forall(&OutputGenerator::startMemberSections); } void endMemberSections() @@ -251,6 +259,10 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startDescItem); } void endDescItem() { forall(&OutputGenerator::endDescItem); } + void startDescForItem() + { forall(&OutputGenerator::startDescForItem); } + void endDescForItem() + { forall(&OutputGenerator::endDescForItem); } void startSubsection() { forall(&OutputGenerator::startSubsection); } void endSubsection() @@ -286,8 +298,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startParamList,t,title); } void endParamList() { forall(&OutputGenerator::endParamList); } - void writeDescItem() - { forall(&OutputGenerator::writeDescItem); } + //void writeDescItem() + //{ forall(&OutputGenerator::writeDescItem); } void startIndent() { forall(&OutputGenerator::startIndent); } void endIndent() diff --git a/src/pagedef.cpp b/src/pagedef.cpp index 05825a6..9091581 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -119,7 +119,7 @@ void PageDef::writeDocumentation(OutputList &ol) (si=Doxygen::sectionDict.find(pageName))!=0) { ol.startSection(si->label,si->title,si->type); - ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE); + ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE); stringToSearchIndex(getOutputFileBase(), theTranslator->trPage(TRUE,TRUE)+" "+si->title, si->title); @@ -2210,22 +2210,24 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) // Deal with file changes due to // #include's within { .. } blocks - QCString lineStr; + QCString lineStr(15+g_yyFileName.length()); lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data()); outputArray(lineStr.data(),lineStr.length()); delete fs; fs=0; } } -<*>"/*" { - outputChar('/');outputChar('*'); +<*>"/*"[*]? { + outputArray(yytext,yyleng); g_lastCContext=YY_START; g_commentCount=1; + if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented! BEGIN(SkipCComment); } -<*>"//" { - outputChar('/');outputChar('/'); +<*>"//"[/]? { + outputArray(yytext,yyleng); g_lastCPPContext=YY_START; + if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented! BEGIN(SkipCPPComment); } <*>\n { diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index e97c041..557b3fd 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -972,9 +972,9 @@ void RTFGenerator::endItemList() //} /*! write bullet or enum item */ -void RTFGenerator::writeListItem() +void RTFGenerator::startItemListItem() { - DBG_RTF(t << "{\\comment (writeListItem)}" << endl) + DBG_RTF(t << "{\\comment (startItemListItem)}" << endl) newParagraph(); t << rtf_Style_Reset; if (rtf_listItemInfo[m_listLevel].isEnum) @@ -990,6 +990,11 @@ void RTFGenerator::writeListItem() m_omitParagraph = TRUE; } +void RTFGenerator::endItemListItem() +{ + DBG_RTF(t << "{\\comment (endItemListItem)}" << endl) +} + void RTFGenerator::startIndexItem(const char *,const char *) { DBG_RTF(t << "{\\comment (startIndexItem)}" << endl) @@ -1582,9 +1587,14 @@ void RTFGenerator::startDescList(SectionTypes) // t << rtf_Style_Reset << rtf_DList_DepthStyle(); //} -void RTFGenerator::writeDescItem() +void RTFGenerator::startDescForItem() +{ + DBG_RTF(t << "{\\comment (startDescForItem) }" << endl) +} + +void RTFGenerator::endDescForItem() { - DBG_RTF(t << "{\\comment (writeDescItem) }" << endl) + DBG_RTF(t << "{\\comment (endDescForItem) }" << endl) } //void RTFGenerator::endDescList() diff --git a/src/rtfgen.h b/src/rtfgen.h index 3c895bf..36f748d 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -63,6 +63,8 @@ class RTFGenerator : public OutputGenerator void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem() {} + void endIndexListItem() {} void startIndexList(); void endIndexList(); void startIndexKey(); @@ -88,7 +90,9 @@ class RTFGenerator : public OutputGenerator void endTypewriter() { t << "}"; } void startGroupHeader(); void endGroupHeader(); - void writeListItem(); + //void writeListItem(); + void startItemListItem(); + void endItemListItem(); void startMemberSections() {} void endMemberSections() {} @@ -152,7 +156,9 @@ class RTFGenerator : public OutputGenerator void endSimpleSect(); void startParamList(ParamListTypes,const char *); void endParamList(); - void writeDescItem(); + //void writeDescItem(); + void startDescForItem(); + void endDescForItem(); void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *); diff --git a/src/scanner.l b/src/scanner.l index bd46a13..d189bef 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -1000,6 +1000,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) lineCount() ; } <FindMembers>[\-+]{BN}* { + printf("Found - insideObj=%d\n",insideObjC); if (!insideObjC) { REJECT; @@ -1477,7 +1478,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) isTypedef=((QCString)yytext).find("typedef")!=-1; current->section = Entry::CLASS_SEC ; current->spec = Entry::Struct; - current->objc = insideObjC = FALSE; + // bug 582676: can be a struct nested in an interface so keep insideObjC state + //current->objc = insideObjC = FALSE; addType( current ) ; current->type += " struct" ; current->fileName = yyFileName; @@ -1534,7 +1536,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) isTypedef=((QCString)yytext).find("typedef")!=-1; current->section = Entry::CLASS_SEC; current->spec = Entry::Union; - current->objc = insideObjC = FALSE; + // bug 582676: can be a struct nested in an interface so keep insideObjC state + //current->objc = insideObjC = FALSE; addType( current ) ; current->type += " union" ; current->fileName = yyFileName; diff --git a/src/translator_en.h b/src/translator_en.h index 72ff0c3..c71957e 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -1042,30 +1042,33 @@ class TranslatorEnglish : public Translator "};\n" "\\endcode\n" "This will result in the following graph:" - "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n" + "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n" "<p>\n" "The boxes in the above graph have the following meaning:\n" + "</p>\n" "<ul>\n" "<li>%A filled gray box represents the struct or class for which the " - "graph is generated.\n" - "<li>%A box with a black border denotes a documented struct or class.\n" - "<li>%A box with a grey border denotes an undocumented struct or class.\n" + "graph is generated.</li>\n" + "<li>%A box with a black border denotes a documented struct or class.</li>\n" + "<li>%A box with a grey border denotes an undocumented struct or class.</li>\n" "<li>%A box with a red border denotes a documented struct or class for" "which not all inheritance/containment relations are shown. %A graph is " - "truncated if it does not fit within the specified boundaries.\n" + "truncated if it does not fit within the specified boundaries.</li>\n" "</ul>\n" + "<p>\n" "The arrows have the following meaning:\n" + "</p>\n" "<ul>\n" "<li>%A dark blue arrow is used to visualize a public inheritance " - "relation between two classes.\n" - "<li>%A dark green arrow is used for protected inheritance.\n" - "<li>%A dark red arrow is used for private inheritance.\n" + "relation between two classes.</li>\n" + "<li>%A dark green arrow is used for protected inheritance.</li>\n" + "<li>%A dark red arrow is used for private inheritance.</li>\n" "<li>%A purple dashed arrow is used if a class is contained or used " "by another class. The arrow is labeled with the variable(s) " - "through which the pointed class or struct is accessible.\n" + "through which the pointed class or struct is accessible.</li>\n" "<li>%A yellow dashed arrow denotes a relation between a template instance and " "the template class it was instantiated from. The arrow is labeled with " - "the template parameters of the instance.\n" + "the template parameters of the instance.</li>\n" "</ul>\n"; } /*! text for the link to the legend page */ diff --git a/src/translator_pl.h b/src/translator_pl.h index f5041c1..bddd7ff 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -20,7 +20,7 @@ #ifndef TRANSLATOR_PL_H #define TRANSLATOR_PL_H -class TranslatorPolish : public TranslatorAdapter_1_4_6 +class TranslatorPolish : public Translator { private: /*! to avoid macro redefinition from translator_pl.h */ @@ -489,12 +489,6 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 { return decode("Dokumentacja typów wyliczanych"); } /*! This is used in the documentation of a file/namespace before the list - * of documentation blocks for enumeration values - */ - QCString trEnumerationValueDocumentation() - { return decode("Dokumentacja wartości wyliczanych"); } - - /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for functions */ QCString trFunctionDocumentation() @@ -636,12 +630,12 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 case ClassDef::Struct: result+=" struktury "; break; case ClassDef::Union: result+=" unii "; break; case ClassDef::Interface: result+=" interfejsu "; break; - case ClassDef::Protocol: result+=decode(" protocol "); break; // translate me! - case ClassDef::Category: result+=decode(" category "); break; // translate me! - case ClassDef::Exception: result+=decode(" wyjątku "); break; + case ClassDef::Protocol: result+=" protokołu "; break; + case ClassDef::Category: result+=" kategorii "; break; + case ClassDef::Exception: result+=" wyjątku "; break; } result+=(QCString)clName; - return result; + return decode(result); } /*! used as the title of the HTML page of a file */ @@ -795,8 +789,8 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 case ClassDef::Struct: result+="j struktury"; break; case ClassDef::Union: result+="j unii"; break; case ClassDef::Interface: result+="go interfejsu"; break; - case ClassDef::Protocol: result+=decode("protocol"); break; // translate me! - case ClassDef::Category: result+=decode("category"); break; // translate me! + case ClassDef::Protocol: result+="go protokołu"; break; + case ClassDef::Category: result+="j kategorii"; break; case ClassDef::Exception: result+="go wyjątku"; break; } result+=" została wygenerowana z plik"; @@ -1574,6 +1568,220 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 return "To jest metoda przeciążona, udostępniona dla wygody. " "Różni się od powyższej metody tylko zestawem akceptowanych argumentów."; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.4.6 +////////////////////////////////////////////////////////////////////////// + + /*! This is used to introduce a caller (or called-by) graph */ + virtual QCString trCallerGraph() + { + return "Oto graf wywoływań tej funkcji:"; + } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration values + */ + virtual QCString trEnumerationValueDocumentation() + { return "Dokumentacja wyliczeń"; } //TODO check if it is correct translation + +////////////////////////////////////////////////////////////////////////// +// new since 1.5.4 (mainly for Fortran) +////////////////////////////////////////////////////////////////////////// + + /*! header that is put before the list of member subprograms (Fortran). */ + virtual QCString trMemberFunctionDocumentationFortran() + { return "Dokumentacja składowej funkcji/podprogramu"; } + + /*! This is put above each page as a link to the list of annotated data types (Fortran). */ + virtual QCString trCompoundListFortran() + { return "Lista typów danych"; } + + /*! This is put above each page as a link to all members of compounds (Fortran). */ + virtual QCString trCompoundMembersFortran() + { return "Pola danych"; } + + /*! This is an introduction to the annotated compound list (Fortran). */ + virtual QCString trCompoundListDescriptionFortran() + { return "Tutaj znajdują się typy danych z ich krótkimi opisami:"; } + + /*! This is an introduction to the page with all data types (Fortran). */ + virtual QCString trCompoundMembersDescriptionFortran(bool extractAll) + { + QCString result="Tutaj znajduje się lista wszystkich "; + if (!extractAll) + { + result+="udokumentowanych "; + } + result+="składowych typów danych"; + result+=" wraz z odnośnikami do "; + if (!extractAll) + { + result+="dokumentacji struktury danych dla każdej składowej"; + } + else + { + result+="typów danych, do których dana składowa należy:"; + } + return result; + } + + /*! This is used in LaTeX as the title of the chapter with the + * annotated compound index (Fortran). + */ + virtual QCString trCompoundIndexFortran() + { return "Indeks typów danych"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all data types (Fortran). + */ + virtual QCString trTypeDocumentation() + { return "Dokumentacja typów danych"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) subprograms (Fortran). + */ + virtual QCString trSubprograms() + { return "Funkcje/podprogramy"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for subprograms (Fortran) + */ + virtual QCString trSubprogramDocumentation() + { return "Dokumentacja funkcji/podprogramu"; } + + /*! This is used in the documentation of a file/namespace/group before + * the list of links to documented compounds (Fortran) + */ + virtual QCString trDataTypes() + { return "Typy danych"; } + + /*! used as the title of page containing all the index of all modules (Fortran). */ + virtual QCString trModulesList() + { return "Lista modułów"; } + + /*! used as an introduction to the modules list (Fortran) */ + virtual QCString trModulesListDescription(bool extractAll) + { + QCString result="Tutaj znajduje się lista wszystkich "; + if (!extractAll) result+="udokumentowanych "; + result+="modułów z ich krótkimi opisami:"; + 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="Dokumentacja"; + if (isTemplate) result+=" szablonu"; + switch(compType) + { + case ClassDef::Class: result+=" modułu "; break; + case ClassDef::Struct: result+=" typu "; break; + case ClassDef::Union: result+=" unii "; break; + case ClassDef::Interface: result+=" interfejsu "; break; + case ClassDef::Protocol: result+=" protokołu "; break; + case ClassDef::Category: result+=" kategorii "; break; + case ClassDef::Exception: result+=" wyjątku "; break; + } + result+=(QCString)clName; + return result; + } + /*! used as the title of the HTML page of a module (Fortran) */ + virtual QCString trModuleReference(const char *namespaceName) + { + QCString result="Dokumentacja modułu "; + result+=namespaceName; + return result; + } + + /*! This is put above each page as a link to all members of modules. (Fortran) */ + virtual QCString trModulesMembers() + { return "Składowe modułu"; } + + /*! This is an introduction to the page with all modules members (Fortran) */ + virtual QCString trModulesMemberDescription(bool extractAll) + { + QCString result="Tutaj znajduje się lista wszystkich "; + if (!extractAll) result+="udokumentowanych "; + result+="składowych modułów wraz z odnośnikami do "; + if (extractAll) + { + result+="dokumentacji modułu dla każdej składowej:"; + } + else + { + result+="modułów do których składowe te należą:"; + } + return result; + } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all modules (Fortran). + */ + virtual QCString trModulesIndex() + { return "Indeks modułu"; } + + /*! 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 ? "Moduł" : "moduł")); + if (!singular) result+="y"; + 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)"Dokumentacja dla te"; + switch(compType) + { + case ClassDef::Class: result+="go modułu"; break; + case ClassDef::Struct: result+="go typu"; break; + case ClassDef::Union: result+="j unii"; break; + case ClassDef::Interface: result+="go interfejsu"; break; + case ClassDef::Protocol: result+="go protokołu"; break; + case ClassDef::Category: result+="j kategorii"; break; + case ClassDef::Exception: result+="go wyjątku"; break; + } + result+=" została wygenerowana z plik"; + if (single) result+="u:"; else result+="ów:"; + return decode(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 ? "Typ" : "typ")); + if (!singular) result+="y"; + 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 ? "Podprogram" : "podprogram")); + if (!singular) result+="y"; + return result; + } + + /*! C# Type Constraint list */ + virtual QCString trTypeConstraints() + { + return "Więzy typów"; //TODO check if it is correct translation + } }; #endif diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 28e2d85..8b442ef 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -340,7 +340,7 @@ static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE) while (!done) { sp=p; - while ((c=*p++) && c!='\n'); + while ((c=*p++) && c!='\n') {} if (c=='\n') { g_yyLineNr++; @@ -379,7 +379,7 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol, { char *sp=p; char c; - while ((c=*p++) && c!='\n'); + while ((c=*p++) && c!='\n') {} if (c=='\n') { g_yyLineNr++; diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 809fc31..280e068 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -833,12 +833,13 @@ bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2) bool VhdlDocGen::getSigTypeName(QList<QCString>& ql, const char* str,QCString& buffer) { - QCString temp(str); - QStringList qlist=QStringList::split(" is ",temp,FALSE); - if (qlist.count()!=2) return FALSE; - temp.resize(0); - temp+=(QCString)qlist[0]+":"+(QCString)qlist[1]; - return VhdlDocGen::getSigName(ql,temp.data(),buffer); + //QCString temp(str); + //QStringList qlist=QStringList::split(" is ",temp,FALSE); + //if (qlist.count()!=2) return FALSE; + //temp.resize(0); + //temp+=(QCString)qlist[0]+":"+(QCString)qlist[1]; + //return VhdlDocGen::getSigName(ql,temp.data(),buffer); + return VhdlDocGen::getSigName(ql,str,buffer); } /*! @@ -1356,7 +1357,7 @@ bool VhdlDocGen::isNumber(const QCString& s) #endif }// isNumber -void VhdlDocGen::startFonts(const QCString& q, char *keyword,OutputList& ol) +void VhdlDocGen::startFonts(const QCString& q, const char *keyword,OutputList& ol) { ol.startFontClass(keyword); ol.docify(q.data()); @@ -1650,10 +1651,12 @@ bool VhdlDocGen::isFunctionProto(QCString& ss) QCString proc("procedure"); QCString func("function"); name=name.stripWhiteSpace(); - QStringList ql=QStringList::split(" ",name,FALSE); + QStringList ql=QStringList::split(QRegExp("[\\s]"),name,FALSE); int j=ql.count(); if (j<2) return FALSE; - QCString tt=(QCString)ql[0]; + QCString tt=(QCString)ql[0].lower(); + + if (tt=="impure" || tt=="pure") tt=ql[1]; if (VhdlDocGen::compareString(tt,proc)!=0 && VhdlDocGen::compareString(tt,func)!=0) return FALSE; diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index a42ed4f..6323489 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -262,7 +262,7 @@ class VhdlDocGen static void writeLink(const MemberDef* mdef,OutputList &ol); static void adjustMemberName(QCString& nn); static bool membersHaveSpecificType(MemberList *ml,int type); - static void startFonts(const QCString& q, char *keyword,OutputList& ol); + static void startFonts(const QCString& q, const char *keyword,OutputList& ol); static bool isNumber(const QCString& s); private: diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index 073e0a1..2acd2dc 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -400,7 +400,7 @@ static void parseProcessProto() static void parseFunctionProto() { - QCString name,ret,qcs; + QCString name,ret,qcs,temp; bool sem=FALSE; QList<Argument> ql; ql.setAutoDelete(TRUE); @@ -409,11 +409,18 @@ static void parseFunctionProto() return; // function without a prototype if (qcs.contains("function",FALSE)==0 && qcs.contains("procedure",FALSE)==0) return; - while (qcs.stripPrefix(" ")); - if (qcs.stripPrefix("impure")) + qcs=qcs.stripWhiteSpace(); + temp=qcs.lower(); + if (temp.stripPrefix("impure")) + { current->exception="impure"; - else if (qcs.stripPrefix("pure")) + qcs=qcs.remove(0,6); + } + else if (temp.stripPrefix("pure")) + { current->exception="pure"; + qcs=qcs.remove(0,4); + } VhdlDocGen::parseFuncProto(qcs.data(),ql,name,ret); //printf("parseFuncProto(%s)=%s,%s\n",qcs.data(),name.data(),ret.data()); |