Commit e04496cb authored by Dimitri van Heesch's avatar Dimitri van Heesch

mods for doxygen-0.49-990522

parent 322885a8
DOXYGEN Version 0.49-990425
DOXYGEN Version 0.49-990522
INSTALLATION INSTRUCTIONS FOR UNIX:
-----------------------------------
1. Unpack the archive, unless you already have:
gunzip doxygen-0.49-990425.src.tar.gz # uncompress the archive
tar xf doxygen-0.49-990425.src.tar # unpack it
gunzip doxygen-0.49-990522.src.tar.gz # uncompress the archive
tar xf doxygen-0.49-990522.src.tar # unpack it
2. Make sure Qt is installed properly (check the environment variable $QTDIR)
......@@ -80,6 +80,10 @@ You will need to install the windows/dos versions of following tools:
X-windows version as well!)
- Microsoft Visual C++ version 5.0, use the vcvars32.bat to set the environment
variables.
- If you used WinZip to extract the tar archive it will (apparently) not
create empty folders, so you have to add the folders
`objects' and `bin' manually in the root of the distribution before
compiling.
Make sure all tools are accessible from the command-line.
......@@ -97,6 +101,11 @@ nmake -f Makefile.windows examples
-----------------------------------------------------------------------------
KNOWN CONFIGURATION PROBLEMS
HTML RELATED PROBLEMS:
- the indent continuously increases.
This seems to be a problem that can be observed with Netscape 4.01.
It is not present in many later and earlier versions.
LATEX RELATED PROBLEMS:
- the LaTeX translation of HTML tables doesn't seem to work for all
......@@ -129,4 +138,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (25 April 1999)
Dimitri van Heesch (22 May 1999)
......@@ -9,4 +9,4 @@ PERL = perl
# The values below should probably be left unmodified
TAR = tar # name of the GNU tar tool
TMAKE = ../tmake/bin/tmake
VERSION = 0.49-990425
VERSION = 0.49-990522
DOXYGEN Version 0.49-990425
DOXYGEN Version 0.49-990522
Please read INSTALL for compilation instructions.
......@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (25 April 1999)
Dimitri van Heesch (22 May 1999)
......@@ -18,7 +18,7 @@
Most documentation systems have special `see also' sections where links
to other pieces of documentation can be inserted.
Although doxygen also has a command to start such a section (See section
\ref cmdsa), it does allow you to put these kind of links anywhere in the
\ref cmdsa "\\sa"), it does allow you to put these kind of links anywhere in the
documentation.
For \f$\mbox{\LaTeX}\f$ documentation a reference to the page number
is written instead of a link. Furthermore, the index at the end of the
......@@ -93,20 +93,7 @@
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\subsection resolving Resolving of defines and typedefs.
Macro definitions of the form:
\verbatim
#define TypeName ClassName
\endverbatim
will be resolved inside documentation blocks.
\par Example:
\verbinclude resdefine.cpp
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/resdefine/html/exportedname.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\subsection resolving typedefs.
Typedefs that involve classes, structs and unions, like
\verbatim
......
......@@ -42,6 +42,7 @@ documentation:
\endlatexonly
<li> \refitem cmda \a
<li> \refitem cmdaddindex \addindex
<li> \refitem cmdanchor \anchor
<li> \refitem cmdarg \arg
<li> \refitem cmdauthor \author
<li> \refitem cmdb \b
......@@ -148,7 +149,7 @@ Doxygen. Unrecognized commands are treated as normal text.
classes and members that are documented are automatically replaced by
links to the documentation.
\sa section \ref cmdendcode, section \ref cmdverbatim
\sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim"
<hr>
\subsection cmddef \def <name>
......@@ -172,14 +173,14 @@ Doxygen. Unrecognized commands are treated as normal text.
group of classes, files or namespaces. This can be used to
categorize classes, files or namespaces, and document those
categories.
\sa section \ref cmdingroup
\sa section \ref cmdingroup "\\ingroup"
<hr>
\subsection cmdendcode \endcode
\addindex \endcode
Ends a block of code.
\sa section \ref cmdcode
\sa section \ref cmdcode "\\code"
<hr>
\subsection cmdenum \enum <name>
......@@ -226,7 +227,7 @@ Doxygen. Unrecognized commands are treated as normal text.
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\sa section \ref cmdinclude.
\sa section \ref cmdinclude "\\include".
<hr>
\subsection cmdfile \file [<name>]
......@@ -266,7 +267,7 @@ Doxygen. Unrecognized commands are treated as normal text.
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\sa section \ref cmdvar and \ref cmdtypedef
\sa section \ref cmdvar "\\var" and \ref cmdtypedef "\\typedef".
<hr>
\subsection cmdingroup \ingroup <groupname>
......@@ -275,7 +276,7 @@ Doxygen. Unrecognized commands are treated as normal text.
If the \\ingroup command is placed in a comment block of a
class, file or namespace, then it will be added to the group.
\sa section \ref cmddefgroup
\sa section \ref cmddefgroup "\\defgroup".
<hr>
\subsection cmdinternal \internal
......@@ -337,8 +338,9 @@ Doxygen. Unrecognized commands are treated as normal text.
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\sa section \ref cmdsection, section \ref cmdsubsection, and
section \ref cmdref
\sa section \ref cmdsection "\\section", section
\ref cmdsubsection "\\subsection", and section
\ref cmdref "\\ref".
<hr>
\subsection cmdrelates \relates <name>
......@@ -366,7 +368,7 @@ Doxygen. Unrecognized commands are treated as normal text.
struct with name \<name\>. The arguments are equal to the \\class
command.
\sa section \ref cmdclass.
\sa section \ref cmdclass "\\class".
<hr>
\subsection cmdtypedef \typedef (typedef declaration)
......@@ -376,7 +378,7 @@ Doxygen. Unrecognized commands are treated as normal text.
typedef (either global or as a member of a class).
This command is equivalent to \\var and \\fn.
\sa section \ref cmdfn and \ref cmdvar
\sa section \ref cmdfn "\\fn" and \ref cmdvar "\\var".
<hr>
\subsection cmdunion \union <name> [<header-file>] [<header-name>]
......@@ -386,7 +388,7 @@ Doxygen. Unrecognized commands are treated as normal text.
union with name \<name\>. The arguments are equal to the \\class
command.
\sa section \ref cmdclass.
\sa section \ref cmdclass "\\class".
<hr>
\subsection cmdvar \var (variable declaration)
......@@ -396,7 +398,7 @@ Doxygen. Unrecognized commands are treated as normal text.
enum value (either global or as a member of a class).
This command is equivalent to \\typedef and \\fn.
\sa section \ref cmdfn and \cmdtypedef
\sa section \ref cmdfn "\\fn" and \ref cmdtypedef "\\typedef".
<hr>
......@@ -423,7 +425,7 @@ Doxygen. Unrecognized commands are treated as normal text.
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\sa Section \ref cmdjdauthor.
\sa Section \ref cmdjdauthor "@author".
<hr>
\subsection cmdbrief \brief {brief description}
......@@ -437,9 +439,9 @@ Doxygen. Unrecognized commands are treated as normal text.
it is advised to keep it brief!). A brief description ends when a
blank line or another sectioning command is encountered. If multiple
\\brief commands are present they will be joined. See section
\ref cmdauthor for an example.
\ref cmdauthor "\\author" for an example.
\sa Section \ref cmdjdshort
\sa Section \ref cmdjdshort "@short".
<hr>
\subsection cmdbug \bug { bug description }
......@@ -453,8 +455,8 @@ Doxygen. Unrecognized commands are treated as normal text.
Each bug description will start on a new line.
Alternatively, one \\bug command may mention
several bugs. The \\bug command ends when a blank line or some other
sectioning command is encountered. See section \ref cmdauthor for an
example.
sectioning command is encountered. See section \ref cmdauthor "\\author"
for an example.
<hr>
\subsection cmddate \date { date description }
......@@ -468,10 +470,10 @@ Doxygen. Unrecognized commands are treated as normal text.
Each date description will start on a new line.
Alternatively, one \\date command may mention
several dates. The \\date command ends when a blank line or some other
sectioning command is encountered. See section \ref cmdauthor for an
example.
sectioning command is encountered. See section \ref cmdauthor "\\author"
for an example.
\sa Section \ref cmdjddate.
\sa Section \ref cmdjddate "@date".
<hr>
\subsection cmdpar \par (paragraph title) { paragraph }
......@@ -504,10 +506,10 @@ Doxygen. Unrecognized commands are treated as normal text.
Multiple adjacent \\param commands will be joined into a single paragraph.
Each parameter description will start on a new line.
The \\param description ends when a blank line or some other
sectioning command is encountered. See section \ref cmdfn for an
sectioning command is encountered. See section \ref cmdfn "\\fn" for an
example.
\sa Section \ref cmdjdparam.
\sa Section \ref cmdjdparam "@param".
<hr>
\subsection cmdexception \exception <exception-object> { exception description }
......@@ -521,10 +523,10 @@ Doxygen. Unrecognized commands are treated as normal text.
Multiple adjacent \\exception commands will be joined into a single paragraph.
Each parameter description will start on a new line.
The \\exception description ends when a blank line or some other
sectioning command is encountered. See section \ref cmdfn for an
sectioning command is encountered. See section \ref cmdfn "\\fn" for an
example.
\sa Section \ref cmdjdexception.
\sa Section \ref cmdjdexception "@exception".
<hr>
\subsection cmdreturn \return { description of the return value }
......@@ -535,10 +537,10 @@ Doxygen. Unrecognized commands are treated as normal text.
enhancement commands may be used inside the paragraph.
Multiple adjacent \\return commands will be joined into a single paragraph.
The \\return description ends when a blank line or some other
sectioning command is encountered. See section \ref cmdfn for an
sectioning command is encountered. See section \ref cmdfn "\\fn" for an
example.
\sa Section \ref cmdjdreturn.
\sa Section \ref cmdjdreturn "@return".
<hr>
\subsection cmdsa \sa { references }
......@@ -551,8 +553,8 @@ Doxygen. Unrecognized commands are treated as normal text.
may be selected by including a parenthesized list of argument types after
the method.
\sa section \ref autolink for information on how to create links to objects
and section \ref cmdjdsee for the JavaDoc version of this command.
\sa section \ref autolink "\\autolink" for information on how to create links to objects
and section \ref cmdjdsee "@see" for the JavaDoc version of this command.
<hr>
\subsection cmdversion \version { version number }
......@@ -566,10 +568,10 @@ Doxygen. Unrecognized commands are treated as normal text.
Each version description will start on a new line.
Alternatively, one \\version command may mention
several dates. The \\version command ends when a blank line or some other
sectioning command is encountered. See section \ref cmdauthor for an
example.
sectioning command is encountered. See section \ref cmdauthor "\\author"
for an example.
\sa Section \ref cmdjdversion.
\sa Section \ref cmdjdversion "@version".
<hr>
\subsection cmdwarning \warning { warning message }
......@@ -583,25 +585,35 @@ Doxygen. Unrecognized commands are treated as normal text.
Each warning description will start on a new line.
Alternatively, one \\warning command may mention
several warnings. The \\warning command ends when a blank line or some other
sectioning command is encountered. See section \ref cmdauthor for an
example.
sectioning command is encountered. See section \ref cmdauthor "\\author"
for an example.
<hr>
<h2>\htmlonly <center> --- \endhtmlonly
Commands to create links
\htmlonly --- </center>\endhtmlonly</h2>
\subsection cmdaddindex \addindex <word>
\subsection cmdaddindex \addindex (text)
\addindex \addindex
This command adds \<word\> to the \htmlonly LaTeX\endhtmlonly
\latexonly\LaTeX\ \endlatexonly index.
This command adds (text) to the \f$\mbox{\LaTeX}\f$ index.
<hr>
\subsection cmdanchor \anchor <word>
\addindex \anchor
This command places an invisble, named anchor into to documentation
to which you can refer with the \\ref command.
\sa section \ref cmdref "\\ref".
<hr>
\subsection cmdendlink \endlink
\addindex \endlink
This command ends a link that is started with the \\link command.
\sa section \ref cmdlink.
\sa section \ref cmdlink "\\link".
<hr>
\subsection cmdlink \link <link-object>
......@@ -616,25 +628,28 @@ Doxygen. Unrecognized commands are treated as normal text.
the \\link and \\endlink commands serves as text for a link to
the \<link-object\> specified as the first argument of \\link.
See section \ref autolink for more information on automatically
See section \ref autolink "\\autolink" for more information on automatically
generated links and valid link-objects.
\b Notice:
Keep in mind that links are only meaningful in HTML text;
in \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly
text, the link text is just written to the output.
in \f$\mbox{\LaTeX}\f$ text, the link text is just written to the output.
<hr>
\subsection cmdref \ref <section-name>
\subsection cmdref \ref <name> ["(text)"]
\addindex \ref
Creates a reference to a named section, subsection, or page.
Creates a reference to a named section, subsection, page or anchor.
For HTML documentation the reference command will generate a link to
the section, the title of the section will be used as the link text.
For \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly documentation the reference command will generate a section
number.
the section. For a sections or subsections the title of the section will be
used as the text of the link. For anchor the optional text between quotes
will be used or \<name\> if no text is specified.
For \f$\mbox{\LaTeX}\f$ documentation the reference command will
generate a section number for sections or the text followed by a
page number if \<name\> refers to an anchor.
See section \ref cmdpage for an example of the \\ref command.
\sa
Section \ref cmdpage "\\page" for an example of the \\ref command.
<hr>
\subsection cmdsection \section <section-name> (section title)
......@@ -644,7 +659,11 @@ Doxygen. Unrecognized commands are treated as normal text.
section should be specified as the second argument of the \\section
command.
See section \ref cmdpage for an example of the \\cmdsection command.
\warning This command only works inside related page documentation and
\e not in other documentation blocks!
\sa
Section \ref cmdpage "\\page" for an example of the \\cmdsection command.
<hr>
\subsection cmdsubsection \subsection <subsection-name> (subsection title)
......@@ -653,7 +672,11 @@ Doxygen. Unrecognized commands are treated as normal text.
subsection should be specified as the second argument of the \\subsection
command.
See section \ref cmdpage for an example of the \\cmdsubsection command.
\warning This command only works inside related page documentation and
\e not in other documentation blocks!
\sa
Section \ref cmdpage "\\page" for an example of the \\cmdsubsection command.
<hr>
<h2>\htmlonly <center> --- \endhtmlonly
......@@ -682,7 +705,8 @@ Doxygen. Unrecognized commands are treated as normal text.
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\sa sections \ref cmdline, \ref cmdskip, \ref cmdskipline, and \ref cmduntil.
\sa sections \ref cmdline "\\line", \ref cmdskip "\\skip",
\ref cmdskipline "\\skipline", and \ref cmduntil "\\until".
<hr>
\subsection cmdinclude \include <file-name>
......@@ -706,7 +730,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\\until commands. An internal pointer is used for these command. The
\\include command sets the pointer to the first line of the example.
\sa section \ref cmdexample and \ref cmddontinclude.
\sa section \ref cmdexample "\\example" and \ref cmddontinclude "\\dontinclude".
<hr>
\subsection cmdline \line ( pattern )
......@@ -722,7 +746,7 @@ Doxygen. Unrecognized commands are treated as normal text.
line that was found (or to the end of the example if no such line could
be found).
See section \ref cmddontinclude for an example.
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\subsection cmdskip \skip ( pattern )
......@@ -736,7 +760,7 @@ Doxygen. Unrecognized commands are treated as normal text.
the example, is set to the start of the line that contains the specified
pattern (or to the end of the example if the pattern could not be found).
See section \ref cmddontinclude for an example.
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\subsection cmdskipline \skipline ( pattern )
......@@ -758,7 +782,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\skip pattern
\line pattern\endverbatim
See section \ref cmddontinclude for an example.
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\subsection cmduntil \until ( pattern )
......@@ -773,7 +797,7 @@ Doxygen. Unrecognized commands are treated as normal text.
the example, is set to the start of the line following last written
line (or to the end of the example if the pattern could not be found).
See section \ref cmddontinclude for an example.
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\subsection cmdverbinclude \verbinclude <file-name>
......@@ -875,7 +899,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\addindex \endhtmlonly
Ends a block of text that was started with a \\htmlonly command.
\sa section \ref cmdhtmlonly.
\sa section \ref cmdhtmlonly "\\htmlonly".
<hr>
\subsection cmdendlatexonly \endlatexonly
......@@ -883,7 +907,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\addindex \endlatexonly
Ends a block of text that was started with a \\latexonly command.
\sa section \ref cmdlatexonly.
\sa section \ref cmdlatexonly "\\latexonly".
<hr>
\subsection cmdendverbatim \endverbatim
......@@ -891,7 +915,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\addindex \endverbatim
Ends a block of text that was started with a \\verbatim command.
\sa section \ref cmdverbatim.
\sa section \ref cmdverbatim "\\verbatim".
<hr>
\subsection cmdfdollar \f$
......@@ -899,7 +923,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\addindex \\f$
Marks the start and end of an in-text formula.
\sa section \ref formulas for an example.
\sa section \ref formulas "formulas" for an example.
<hr>
\subsection cmdfbropen \f[
......@@ -908,7 +932,7 @@ Doxygen. Unrecognized commands are treated as normal text.
Marks the start of a long formula that is displayed
centered on a separate line.
\sa section \ref cmdfbrclose and section \ref formulas.
\sa section \ref cmdfbrclose "\\f]" and section \ref formulas "formulas".
<hr>
\subsection cmdfbrclose \f]
......@@ -917,7 +941,7 @@ Doxygen. Unrecognized commands are treated as normal text.
Marks the end of a long formula that is displayed
centered on a separate line.
\sa section \ref cmdfbropen and section \ref formulas.
\sa section \ref cmdfbropen ""\\f[" and section \ref formulas "formulas".
<hr>
\subsection cmdhtmlonly \htmlonly
......@@ -930,38 +954,42 @@ Doxygen. Unrecognized commands are treated as normal text.
This command can be used to include HTML code that is too complex
for Doxygen (i.e. images, applets, java-scripts, and HTML tags that
require attributes). You can use the \\latexonly and \\endlatexonly
pair to provide a proper \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly alternative.
pair to provide a proper \f$\mbox{\LaTeX}\f$ alternative.
\b Notice:
environment variables (like \$(HOME) ) are resolved inside a
HTML-only block.
\sa section \ref cmdhtmlonly and section \ref cmdlatexonly.
\sa section \ref cmdhtmlonly "\\htmlonly" and section
\ref cmdlatexonly "\\latexonly".
<hr>
\subsection cmdlatexonly \latexonly
\addindex \latexonly
Starts a block of text that will be verbatim included in the
generated \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly documentation only. The block ends with a
generated \f$\mbox{\LaTeX}\f$ documentation only. The block ends with a
endlatexonly command.
This command can be used to include \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly code that is too complex
for Doxygen (i.e. images, formulas, special characters). You can use the
\\htmlonly and \\endhtmlonly pair to provide a proper HTML alternative.
This command can be used to include \f$\mbox{\LaTeX}\f$ code that is too
complex for Doxygen (i.e. images, formulas, special characters). You can
use the \\htmlonly and \\endhtmlonly pair to provide a proper HTML
alternative.
\b Notice:
environment variables (like \$(HOME) ) are resolved inside a
\htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\endlatexonly-only block.
\f$\mbox{\LaTeX}\f$-only block.
\sa section \ref cmdlatexonly and section \ref cmdhtmlonly.
\sa section \ref cmdlatexonly "\\latexonly"
and section \ref cmdhtmlonly "\\htmlonly".
<hr>
\subsection cmdverbatim \verbatim
\addindex \verbatim
Starts a block of text that will be verbatim included in both the
HTML and the \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly documentation. The block should end with a
HTML and the
\f$\mbox{\LaTeX}\f$ documentation. The block should end with a
\\endverbatim block. All commands are disabled in a verbatim block.
\warning Make sure you include a \\endverbatim command for each
......@@ -971,30 +999,32 @@ Doxygen. Unrecognized commands are treated as normal text.
\subsection cmdbackslash \\
\addindex \\
This command writes a backslash character (\\) to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output.
The backslash has to be escaped in some cases because Doxygen uses it to
detect commands.
This command writes a backslash character (\\) to the HTML and
\f$\mbox{\LaTeX}\f$ output. The backslash has to be escaped in some
cases because Doxygen uses it to detect commands.
<hr>
\subsection cmdat \@
\addindex \@
This command writes an at-sign (@) to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output.
The at-sign has to be escaped in some cases because Doxygen uses it to
detect JavaDoc commands.
This command writes an at-sign (@) to the HTML and
\f$\mbox{\LaTeX}\f$ output. The at-sign has to be escaped in some cases
because Doxygen uses it to detect JavaDoc commands.
<hr>
\subsection cmdamp \&
\addindex \&
This command writes the \& character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This
character has to be escaped because it has a special meaning in HTML.
This command writes the \& character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This character has to be escaped because
it has a special meaning in HTML.
<hr>
\subsection cmddollar \$
\addindex \$
This command writes the \$ character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This
This command writes the \$ character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped in some cases, because it is used to expand
environment variables.
......@@ -1002,7 +1032,8 @@ Doxygen. Unrecognized commands are treated as normal text.
\subsection cmdhash \#
\addindex \#
This command writes the \# character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This
This command writes the \# character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped in some cases, because it is used to refer
to documented entities.
......@@ -1010,14 +1041,16 @@ Doxygen. Unrecognized commands are treated as normal text.
\subsection cmdlt \\<
\addindex \\<
This command writes the \< character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This
This command writes the \< character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped because it has a special meaning in HTML.
<hr>
\subsection cmdgt \\>
\addindex \\>
This command writes the \> character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This
This command writes the \> character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped because it has a special meaning in HTML.
<hr>
......@@ -1030,28 +1063,28 @@ The following command JavaDoc command are support.
\subsection cmdjdauthor @author { list of authors }
\addindex @author
Equivalent to \\author (see section \ref cmdauthor).
Equivalent to \\author (see section \ref cmdauthor "\\author").
\subsection cmdjddate @date { date description }
\addindex @date
Equivalent to \\date (see section \ref cmddate).
Equivalent to \\date (see section \ref cmddate "\\date").
\subsection cmdjdparam @param <parameter-name> { parameter-description }
\addindex @param
Equivalent to \\param (see section \ref cmdparam).
Equivalent to \\param (see section \ref cmdparam "\\param").
\subsection cmdjdexception @exception <exception-object> { exception-description }
\addindex @exception
Equivalent to \\exception (see section \ref cmdexception).
Equivalent to \\exception (see section \ref cmdexception "\\exception").
\subsection cmdjdreturn @return { description of the return value }
\addindex @return
Equivalent to \\return (see section \ref cmdreturn).
Equivalent to \\return (see section \ref cmdreturn "\\return").
\subsection cmdjdsee @see { references }
\addindex @see
Equivalent to \\sa (see section \ref cmdsa).
Equivalent to \\sa (see section \ref cmdsa "\\sa").
\subsection cmdjdshort @short { brief description }
\addindex @short
Equivalent to \\brief (see section \ref cmdbrief).
Equivalent to \\brief (see section \ref cmdbrief "\\brief").
\subsection cmdjdversion @version { version number }
\addindex @version
Equivalent to \\version (see section \ref cmdversion).
Equivalent to \\version (see section \ref cmdversion "\\version").
<h2>\htmlonly <center> --- \endhtmlonly
Commands included for Qt compatibility
......
......@@ -169,7 +169,7 @@ Below is a list of tags that are recognized for each category.
If the VERBATIM_HEADERS tag is set the YES (the default) then Doxygen\n";
will generate a verbatim copy of the header file for each class for\n";
which an include is specified. Set to NO to disable this.\n";
\sa Section \ref cmdclass.
\sa Section \ref cmdclass "\\class".
</dl>
......@@ -216,7 +216,7 @@ Below is a list of tags that are recognized for each category.
\addindex EXAMPLE_PATH
The \c EXAMPLE_PATH tag can be used to specify one or more files or
directories that contain example code fragments that are included (see
the \\include command in section \ref cmdinclude).
the \\include command in section \ref cmdinclude "\\include").
<dt>\c INCLUDE_PATH <dd>
\addindex INCLUDE_PATH
......@@ -262,6 +262,7 @@ Below is a list of tags that are recognized for each category.
<HTML>
<HEAD>
<TITLE>My title</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
\endverbatim
......@@ -341,6 +342,10 @@ EXTRA_PACKAGES = times
A directory man3 will be created inside the directory specified by
\c MAN_OUTPUT.
<dt>\c MAN_EXTENSION <dd>
\addindex MAX_EXTENSION
The MAN_EXTENSION tag determines the extension that is added to
the generated man pages (default is the subroutine's section .3)
</dl>
\subsection config_prepro Preprocessor related options
......
......@@ -155,8 +155,9 @@ Ole Gerden,
Olaf Meeuwissen,
Feiyi Wang,
Robert J. Clark,
Matthias Baas and
Walter Mueller
Matthias Baas,
Walter Mueller, and
William van Dieten
for suggestions, patches and bug reports.
</ul>
*/
......
......@@ -62,6 +62,11 @@ Furthermore, I would appreciate a mail if you have found
a bug, or if you have ideas (or even better some code or a patch)
how to fix existing bugs and limitations.
The easiest way for me to solve bugs is if you can send me a small example
demonstrating the problem you have (make sure the example compiles!). It is
usually a good idea to send along the configuation file as well, but please
use doxygen with the <code>-s</code> flag while generating it.
My email address: <a href="mailto:dimitri@stack.nl">dimitri@stack.nl</a>
*/
......@@ -37,7 +37,7 @@ static QString stripExtension(const char *fName)
}
// constructs a new class definition
ClassDef::ClassDef(const char *nm,int ct,const char *ref,const char *fName)
ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fName)
: Definition(removeRedundantWhiteSpace(nm))
{
//name=n;
......@@ -155,7 +155,7 @@ void ClassDef::insertMember(const MemberDef *md)
if (md->isFriend() || md->protection()!=Private || extractPrivateFlag)
{
MemberInfo *mi = new MemberInfo((MemberDef *)md,Public,Normal);
MemberNameInfo *mni;
MemberNameInfo *mni=0;
if ((mni=(*allMemberNameInfoDict)[md->name()]))
{
mni->append(mi);
......@@ -232,8 +232,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
pageTitle+=pageType+" Reference";
startFile(ol,fileName,pageTitle);
startTitle(ol);
ol.docify(name()+" "+pageType.right(pageType.length()-1)+" ");
parseDoc(ol,0,0,theTranslator->trReference());
//ol.docify(name()+" "+pageType.right(pageType.length()-1)+" ");
//parseText(ol,theTranslator->trReference());
parseText(ol,theTranslator->trCompoundReference(name(),compType));
endTitle(ol,name());
// write brief description
......@@ -244,8 +245,8 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(0,"details");
parseDoc(ol,0,0,theTranslator->trMore());
ol.startTextLink(0,"_details");
parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.enableAll();
}
......@@ -286,7 +287,41 @@ void ClassDef::writeDocumentation(OutputList &ol)
int count;
if ((count=inherits->count())>0)
{
parseDoc(ol,0,0,theTranslator->trInherits()+" ");
//parseText(ol,theTranslator->trInherits()+" ");
QString inheritLine = theTranslator->trInheritsList(inherits->count());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
{
parseText(ol,inheritLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
BaseClassDef *bcd=inherits->at(entryIndex);
if (ok && bcd)
{
ClassDef *cd=bcd->classDef;
if (cd->hasDocumentation() || cd->isReference())
{
if (genTagFile.length()>0) tagFile << cd->getOutputFileBase() << "?";
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name()+bcd->templSpecifiers);
}
else
{
ol.docify(cd->name());
}
}
else
{
err("Error: invalid marker %d in inherits list!\n",entryIndex);
}
index=newIndex+matchLen;
}
parseText(ol,inheritLine.right(inheritLine.length()-index));
ol.newParagraph();
#if 0
BaseClassDef *bcd=inherits->first();
while (bcd)
{
......@@ -305,13 +340,13 @@ void ClassDef::writeDocumentation(OutputList &ol)
if (bcd)
{
if (inherits->at()==count-1)
parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
ol.newParagraph();
#endif
}
if (genTagFile.length()>0) tagFile << " \"" << fileName << ".html\"\n";
......@@ -319,7 +354,36 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write subclasses
if ((count=inheritedBy->count())>0)
{
parseDoc(ol,0,0,theTranslator->trInheritedBy()+" ");
QString inheritLine = theTranslator->trInheritedByList(inheritedBy->count());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
{
parseText(ol,inheritLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
BaseClassDef *bcd=inheritedBy->at(entryIndex);
if (ok && bcd)
{
ClassDef *cd=bcd->classDef;
if (cd->hasDocumentation() || cd->isReference())
{
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
}
else
{
ol.docify(cd->name());
}
writeInheritanceSpecifier(ol,bcd);
}
index=newIndex+matchLen;
}
parseText(ol,inheritLine.right(inheritLine.length()-index));
ol.newParagraph();
#if 0
parseText(ol,theTranslator->trInheritedBy()+" ");
BaseClassDef *bcd=inheritedBy->first();
while (bcd)
{
......@@ -337,13 +401,14 @@ void ClassDef::writeDocumentation(OutputList &ol)
if (bcd)
{
if (inheritedBy->at()==count-1)
parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
ol.newParagraph();
#endif
}
if (classDiagramFlag) ol.enableAll();
......@@ -376,7 +441,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ClassDiagram diagram(this); // create a diagram of this class.
ol.startClassDiagram();
ol.disable(OutputGenerator::Man);
parseDoc(ol,name(),0,theTranslator->trClassDiagram(name()));
parseText(ol,theTranslator->trClassDiagram(name()));
ol.enable(OutputGenerator::Man);
ol.endClassDiagram(diagram,fileName,name());
}
......@@ -386,40 +451,45 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(memListFileName,0);
parseDoc(ol,0,0,theTranslator->trListOfAllMembers());
parseText(ol,theTranslator->trListOfAllMembers());
ol.endTextLink();
ol.enableAll();
}
// write member groups
writeMemberDecs(ol,this,0,0,"Public Members",0,&pubMembers);
writeMemberDecs(ol,this,0,0,"Public Slots",0,&pubSlots);
writeMemberDecs(ol,this,0,0,"Signals",0,&signals);
writeMemberDecs(ol,this,0,0,"Static Public Members",0,&pubStaticMembers);
writeMemberDecs(ol,this,0,0,"Protected Members",0,&proMembers);
writeMemberDecs(ol,this,0,0,"Protected Slots",0,&proSlots);
writeMemberDecs(ol,this,0,0,"Static Protected Members",0,&proStaticMembers);
ol.startMemberSections();
writeMemberDecs(ol,this,0,0,theTranslator->trPublicMembers(),0,&pubMembers);
writeMemberDecs(ol,this,0,0,theTranslator->trPublicSlots(),0,&pubSlots);
writeMemberDecs(ol,this,0,0,theTranslator->trSignals(),0,&signals);
writeMemberDecs(ol,this,0,0,theTranslator->trStaticPublicMembers(),0,&pubStaticMembers);
writeMemberDecs(ol,this,0,0,theTranslator->trProtectedMembers(),0,&proMembers);
writeMemberDecs(ol,this,0,0,theTranslator->trProtectedSlots(),0,&proSlots);
writeMemberDecs(ol,this,0,0,theTranslator->trStaticProtectedMembers(),0,&proStaticMembers);
if (extractPrivateFlag)
{
writeMemberDecs(ol,this,0,0,"Private Members",0,&priMembers);
writeMemberDecs(ol,this,0,0,"Private Slots",0,&priSlots);
writeMemberDecs(ol,this,0,0,"Static Private Members",0,&priStaticMembers);
writeMemberDecs(ol,this,0,0,theTranslator->trPrivateMembers(),0,&priMembers);
writeMemberDecs(ol,this,0,0,theTranslator->trPrivateSlots(),0,&priSlots);
writeMemberDecs(ol,this,0,0,theTranslator->trStaticPrivateMembers(),0,&priStaticMembers);
}
writeMemberDecs(ol,this,0,0,"Friends",0,&friends);
writeMemberDecs(ol,this,0,0,theTranslator->trFriends(),0,&friends);
writeMemberDecs(ol,this,0,0,
theTranslator->trRelatedFunctions(),
theTranslator->trRelatedSubscript(),
&related
);
ol.endMemberSections();
// write detailed description
bool exampleFlag=hasExamples();
if (!briefDescription().isEmpty() || !documentation().isEmpty() || exampleFlag)
{
ol.writeRuler();
ol.writeAnchor("details");
bool latexOn = ol.isEnabled(OutputGenerator::Latex);
if (latexOn) ol.disable(OutputGenerator::Latex);
ol.writeAnchor("_details");
if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trDetailedDescription());
parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
if (tempArgs) // class is a template
{
......@@ -460,11 +530,11 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.startDescList();
ol.startBold();
parseDoc(ol,0,0,theTranslator->trExamples()+": ");
parseText(ol,theTranslator->trExamples()+": ");
ol.endBold();
ol.endDescTitle();
ol.writeDescItem();
writeExample(ol);
writeExample(ol,exampleList);
//ol.endDescItem();
ol.endDescList();
}
......@@ -489,7 +559,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trMemberTypedefDocumentation());
parseText(ol,theTranslator->trMemberTypedefDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Typedef);
......@@ -507,7 +577,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trMemberEnumerationDocumentation());
parseText(ol,theTranslator->trMemberEnumerationDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Enumeration);
......@@ -525,7 +595,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trEnumerationValueDocumentation());
parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::EnumValue);
......@@ -548,7 +618,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trMemberFunctionDocumentation());
parseText(ol,theTranslator->trMemberFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Function);
......@@ -570,7 +640,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trRelatedFunctionDocumentation());
parseText(ol,theTranslator->trRelatedFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&friends,name(),MemberDef::Friend);
writeMemberDocs(ol,&related,name(),MemberDef::Function);
......@@ -586,7 +656,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trMemberDataDocumentation());
parseText(ol,theTranslator->trMemberDataDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Variable);
......@@ -603,41 +673,57 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write the list of used files (Html and LaTeX only)
ol.disable(OutputGenerator::Man);
ol.writeRuler();
parseDoc(ol,0,0,
theTranslator->trGeneratedFrom(pageType.lower(),
parseText(ol,theTranslator->trGeneratedFrom(pageType.lower(),
files.count()==1));
ol.startItemList();
bool first=TRUE;
const char *file = files.first();
while (file)
{
QFileInfo fi(file);
ol.writeListItem();
FileDef *fd;
bool ambig;
if ((fd=findFileDef(&inputNameDict,fi.absFilePath(),ambig))
&& fd->hasDocumentation())
{
ol.writeObjectLink(fd->getReference(),fd->diskName(),0,
fi.fileName());
}
else
FileDef *fd=findFileDef(&inputNameDict,file,ambig);
if (fd)
{
ol.docify(fi.fileName());
if (first)
{
first=FALSE;
ol.startItemList();
}
ol.writeListItem();
QString path=fd->getPath().copy();
if (fullPathNameFlag)
{
// strip part of the path
if (path.left(stripFromPath.length())==stripFromPath)
{
path=path.right(path.length()-stripFromPath.length());
}
ol.docify(path);
}
if (fd->hasDocumentation())
{
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,
fd->name());
}
else
{
ol.docify(fd->name());
}
}
file=files.next();
}
if (!first) ol.endItemList();
ol.endItemList();
ol.enable(OutputGenerator::Man);
// write Author section (Man only)
ol.enable(OutputGenerator::Man);
ol.disableAllBut(OutputGenerator::Man);
ol.writeString("\n");
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trAuthor());
parseText(ol,theTranslator->trAuthor());
ol.endGroupHeader();
parseDoc(ol,0,0,theTranslator->trGeneratedAutomatically(projectName));
parseText(ol,theTranslator->trGeneratedAutomatically(projectName));
ol.enableAll();
endFile(ol);
......@@ -651,13 +737,11 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.disableAllBut(OutputGenerator::Html);
startFile(ol,memListFileName,theTranslator->trMemberList());
startTitle(ol);
parseDoc(ol,name(),0,name()+" "+theTranslator->trMemberList());
parseText(ol,name()+" "+theTranslator->trMemberList());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trThisIsTheListOfAllMembers());
ol.writeString(" ");
parseText(ol,theTranslator->trThisIsTheListOfAllMembers());
ol.writeObjectLink(reference,fileName,0,name());
ol.writeString(", ");
parseDoc(ol,0,0,theTranslator->trIncludingInheritedMembers());
parseText(ol,theTranslator->trIncludingInheritedMembers());
ol.startItemList();
......@@ -702,14 +786,14 @@ void ClassDef::writeMemberList(OutputList &ol)
{
QString name=mi->ambiguityResolutionScope+md->name();
ol.writeListItem();
ol.writeObjectLink(cd->getReference(),cd->classFile(),
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
md->anchor(),name);
if ( md->isFunction() || md->isSignal() || md->isSlot() )
ol.docify(md->argsString());
else if (md->isEnumerate())
parseDoc(ol,0,0," "+theTranslator->trEnumName());
parseText(ol," "+theTranslator->trEnumName());
else if (md->isEnumValue())
parseDoc(ol,0,0," "+theTranslator->trEnumValue());
parseText(ol," "+theTranslator->trEnumValue());
else if (md->isTypedef())
ol.docify(" typedef");
else if (md->isFriend() && !strcmp(md->typeString(),"friend class"))
......@@ -725,16 +809,16 @@ void ClassDef::writeMemberList(OutputList &ol)
if ( md->isFunction() || md->isSignal() || md->isSlot() )
ol.docify(md->argsString());
else if (md->isEnumerate())
parseDoc(ol,0,0," "+theTranslator->trEnumName());
parseText(ol," "+theTranslator->trEnumName());
else if (md->isEnumValue())
parseDoc(ol,0,0," "+theTranslator->trEnumValue());
parseText(ol," "+theTranslator->trEnumValue());
else if (md->isTypedef())
ol.docify(" typedef");
ol.writeString(" (");
parseDoc(ol,0,0,theTranslator->trDefinedIn()+" ");
parseText(ol,theTranslator->trDefinedIn()+" ");
if (cd->isVisible())
{
ol.writeObjectLink(cd->getReference(),cd->classFile(),0,cd->name());
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
}
else
{
......@@ -792,9 +876,9 @@ void ClassDef::writeIncludeFile(OutputList &ol)
startTitle(ol);
QString n=incName.copy();
if (incName.isNull()) n=incFile->name();
parseDoc(ol,0,0,n);
parseText(ol,n);
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trVerbatimText(incFile->name()));
parseText(ol,theTranslator->trVerbatimText(incFile->name()));
ol.writeRuler();
ol.startCodeFragment();
parseCode(ol,n,fileToString(incFile->absFilePath()),FALSE,0);
......@@ -829,9 +913,31 @@ bool ClassDef::hasExamples()
return exampleList->count()>0;
}
#if 0
// write the list of all examples that are use this class.
void ClassDef::writeExample(OutputList &ol)
{
QString exampleLine=theTranslator->trWriteList(exampleList->count());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
{
bool ok;
parseText(ol,exampleLine.mid(index,newIndex-index));
uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
Example *e=exampleList->at(entryIndex);
if (ok && e)
{
ol.writeObjectLink(0,e->file,e->anchor,e->name);
}
index=newIndex+matchLen;
}
parseText(ol,exampleLine.right(exampleLine.length()-index));
ol.writeString(".");
#if 0
Example *e=exampleList->first();
while (e)
{
......@@ -840,13 +946,15 @@ void ClassDef::writeExample(OutputList &ol)
if (e)
{
if (exampleList->at()==(int)exampleList->count()-1)
parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
#endif
}
#endif
void ClassDef::setTemplateArguments(ArgumentList *al)
{
......
......@@ -49,10 +49,11 @@ class ClassDef : public Definition
Union=Entry::UNION_SEC
};
ClassDef(const char *name,int ct,const char *ref=0,const char *fName=0);
ClassDef(const char *name,CompoundType ct,const char *ref=0,const char *fName=0);
~ClassDef();
QString classFile() const { return fileName; }
int compoundType() const { return compType; }
//QString classFile() const { return fileName; }
QString getOutputFileBase() const { return fileName; }
CompoundType compoundType() const { return compType; }
const char *memberListFileName() const { return memListFileName; }
void insertBaseClass(ClassDef *,Protection p,Specifier s,const char *t=0);
BaseClassList *baseClasses() { return inherits; }
......@@ -75,7 +76,7 @@ class ClassDef : public Definition
void writeIncludeFile(OutputList &ol);
bool addExample(const char *anchor,const char *name, const char *file);
bool hasExamples();
void writeExample(OutputList &ol);
//void writeExample(OutputList &ol);
void setProtection(Protection p) { prot=p; }
Protection protection() const { return prot; }
bool isVisible()
......@@ -130,7 +131,7 @@ class ClassDef : public Definition
QString reference;
ExampleList *exampleList;
ExampleDict *exampleDict;
int compType;
CompoundType compType;
Protection prot;
};
......
......@@ -173,16 +173,19 @@ static void generateClassLink(OutputList &ol,const char *clName)
if (exampleBlock)
{
QString anchor;
anchor.sprintf("a%d",anchorCount);
anchor.sprintf("_a%d",anchorCount);
//printf("addExampleClass(%s,%s,%s)\n",anchor.data(),exampleName.data(),
// exampleFile.data());
if (cd->addExample(anchor,exampleName,exampleFile))
{
bool latexOn = ol.isEnabled(OutputGenerator::Latex);
if (latexOn) ol.disable(OutputGenerator::Latex);
ol.writeAnchor(anchor);
if (latexOn) ol.enable(OutputGenerator::Latex);
anchorCount++;
}
}
ol.writeCodeLink(cd->getReference(),cd->classFile(),0,className);
ol.writeCodeLink(cd->getReference(),cd->getOutputFileBase(),0,className);
}
else
{
......@@ -193,13 +196,14 @@ static void generateClassLink(OutputList &ol,const char *clName)
static bool getLink(const char *className,
const char *memberName,OutputList &result)
{
MemberDef *md;
ClassDef *cd;
FileDef *fd;
MemberDef *md;
ClassDef *cd;
FileDef *fd;
NamespaceDef *nd;
QString m=memberName;
QString c=className;
//printf("Trying `%s'::`%s'\n",c.data(),m.data());
if (getDefs(m,c,"()",md,cd,fd) &&
if (getDefs(m,c,"()",md,cd,fd,nd) &&
(md->hasDocumentation() || md->isReference()))
{
//printf("Found!\n");
......@@ -217,13 +221,19 @@ static bool getLink(const char *className,
}
if (cd)
{
result.writeCodeLink(cd->getReference(),cd->classFile(),
result.writeCodeLink(cd->getReference(),cd->getOutputFileBase(),
md->anchor(),memberName);
return TRUE;
}
else if (nd)
{
result.writeCodeLink(nd->getReference(),nd->getOutputFileBase(),
md->anchor(),memberName);
return TRUE;
}
else if (fd)
{
result.writeCodeLink(fd->getReference(),fd->diskName(),
result.writeCodeLink(fd->getReference(),fd->getOutputFileBase(),
md->anchor(),memberName);
return TRUE;
}
......@@ -363,7 +373,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
if ((fd=findFileDef(&inputNameDict,yytext,ambig)) &&
fd->hasDocumentation())
{
code->writeCodeLink(0,fd->diskName(),0,yytext);
code->writeCodeLink(0,fd->getOutputFileBase(),0,yytext);
}
else
{
......
......@@ -41,6 +41,7 @@ extern QString genTagFile; // the tag file to generate
extern QString inputFilter; // a filter command that is applied to input files
extern QString paperType; // the page type to generate docs for
extern QString stripFromPath; // the string to strip from the file path
extern QString manExtension; // extension the man page files
extern QStrList includePath; // list of include paths
extern QStrList examplePath; // list of example paths
extern QStrList inputSources; // list of input files
......@@ -76,5 +77,6 @@ extern bool repeatBriefFlag; // repeat brief descriptions.
extern bool internalDocsFlag; // determines what happens to internal docs.
extern bool caseSensitiveNames; // determines if output can be mixed case.
extern bool verbatimHeaderFlag; // enable/disable generation of verb headers.
extern bool htmlAlignMemberFlag; // align members in HTML using tables.
#endif
......@@ -62,6 +62,7 @@ QString inputFilter;
QString paperType;
QString outputLanguage;
QString stripFromPath;
QString manExtension;
QStrList includePath;
QStrList examplePath;
QStrList inputSources;
......@@ -72,31 +73,32 @@ QStrList tagFileList;
QStrList extDocPathList;
QStrList predefined;
QStrList extraPackageList;
bool quietFlag = FALSE;
bool warningFlag = FALSE;
bool recursiveFlag = FALSE;
bool allExtFlag = FALSE;
bool searchEngineFlag = FALSE;
bool extractAllFlag = FALSE;
bool extractPrivateFlag = FALSE;
bool noIndexFlag = FALSE;
bool hideMemberFlag = FALSE;
bool hideClassFlag = FALSE;
bool macroExpansionFlag = FALSE;
bool onlyPredefinedFlag = FALSE;
bool fullPathNameFlag = FALSE;
bool compactLatexFlag = FALSE;
bool internalDocsFlag = FALSE;
bool caseSensitiveNames = FALSE;
bool generateHtml = TRUE;
bool generateLatex = TRUE;
bool generateMan = TRUE;
bool preprocessingFlag = TRUE;
bool briefMemDescFlag = TRUE;
bool searchIncludeFlag = TRUE;
bool classDiagramFlag = TRUE;
bool repeatBriefFlag = TRUE;
bool verbatimHeaderFlag = TRUE;
bool quietFlag = FALSE;
bool warningFlag = FALSE;
bool recursiveFlag = FALSE;
bool allExtFlag = FALSE;
bool searchEngineFlag = FALSE;
bool extractAllFlag = FALSE;
bool extractPrivateFlag = FALSE;
bool noIndexFlag = FALSE;
bool hideMemberFlag = FALSE;
bool hideClassFlag = FALSE;
bool macroExpansionFlag = FALSE;
bool onlyPredefinedFlag = FALSE;
bool fullPathNameFlag = FALSE;
bool compactLatexFlag = FALSE;
bool internalDocsFlag = FALSE;
bool caseSensitiveNames = FALSE;
bool generateHtml = TRUE;
bool generateLatex = TRUE;
bool generateMan = TRUE;
bool preprocessingFlag = TRUE;
bool briefMemDescFlag = TRUE;
bool searchIncludeFlag = TRUE;
bool classDiagramFlag = TRUE;
bool repeatBriefFlag = TRUE;
bool verbatimHeaderFlag = TRUE;
bool htmlAlignMemberFlag = TRUE;
/* -----------------------------------------------------------------
*
......@@ -162,7 +164,8 @@ static int yyread(char *buf,int max_size)
<Start>"INPUT_FILTER"[ \t]*"=" { BEGIN(GetString); s=&inputFilter; }
<Start>"PAPER_TYPE"[ \t]*"=" { BEGIN(GetString); s=&paperType; }
<Start>"OUTPUT_LANGUAGE"[ \t]*"=" { BEGIN(GetString); s=&outputLanguage; }
<Start>"STRIP_FROM_PATH"[ \t]*"=" { BEGIN(GetString); s=&stripFromPath; }
<Start>"STRIP_FROM_PATH"[ \t]*"=" { BEGIN(GetString); s=&stripFromPath; }
<Start>"MAN_EXTENSION"[ \t]*"=" { BEGIN(GetString); s=&manExtension; }
<Start>"INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&includePath; elemStr=""; }
<Start>"EXAMPLE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&examplePath; elemStr=""; }
<Start>"INPUT"[ \t]*"=" { BEGIN(GetStrList); l=&inputSources; elemStr=""; }
......@@ -198,6 +201,7 @@ static int yyread(char *buf,int max_size)
<Start>"INTERNAL_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&internalDocsFlag; }
<Start>"CASE_SENSE_NAMES"[ \t]*"=" { BEGIN(GetBool); b=&caseSensitiveNames; }
<Start>"VERBATIM_HEADERS"[ \t]*"=" { BEGIN(GetBool); b=&verbatimHeaderFlag; }
<Start>"HTML_ALIGN_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&htmlAlignMemberFlag; }
<Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); }
<GetString,GetBool>\n { yyLineNr++; BEGIN(Start); }
<GetStrList>\n {
......@@ -634,6 +638,15 @@ void writeTemplateConfig(QFile *f,bool sl)
}
t << "HTML_FOOTER =\n";
if (!sl)
{
t << "\n";
t << "# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,\n";
t << "# files or namespaces will be aligned in HTML using tables. If set to\n";
t << "# NO a bullet list will be used.\n";
t << "\n";
}
t << "HTML_ALIGN_MEMBERS = YES\n";
if (!sl)
{
t << "\n";
t << "#---------------------------------------------------------------------------\n";
......@@ -701,6 +714,15 @@ void writeTemplateConfig(QFile *f,bool sl)
t << "\n";
}
t << "MAN_OUTPUT =\n";
if (!sl)
{
t << "\n";
t << "# The MAN_EXTENSION tag determines the extension that is added to\n";
t << "# the generated man pages (default is the subroutine's section .3)\n";
t << "\n";
}
t << "MAN_EXTENSION = .3\n";
if (!sl)
{
t << "\n";
......@@ -870,6 +892,12 @@ void checkConfig()
// projectName[0]=toupper(projectName[0]);
//}
// set default man page extension if non is given by the user
if (manExtension.isEmpty())
{
manExtension=".3";
}
paperType = paperType.lower().stripWhiteSpace();
if (paperType.isEmpty())
{
......
......@@ -16,6 +16,17 @@
#include <ctype.h>
#include "definition.h"
#include "doxygen.h"
Definition::Definition(const char *name,const char *b,const char *d)
{
n=name; brief=b; doc=d; sectionList=0;
}
Definition::~Definition()
{
delete sectionList;
}
QString Definition::nameToFile(const char *name)
{
......@@ -42,3 +53,22 @@ QString Definition::nameToFile(const char *name)
}
return result;
}
void Definition::addSectionsToDefinition(QList<QString> *anchorList)
{
if (!anchorList) return;
QString *s=anchorList->first();
while (s)
{
SectionInfo *si=0;
if (!s->isEmpty() && (si=sectionDict[*s]))
{
//printf("Add section `%s' to definition `%s'\n",
// si->label.data(),n.data());
if (sectionList==0) sectionList = new SectionList;
sectionList->append(si);
si->definition = this;
}
s=anchorList->next();
}
}
......@@ -18,19 +18,22 @@
#define DEFINITION_H
#include <qstring.h>
#include <qlist.h>
#include "config.h"
#include "section.h"
/*! The common base class of all definitions. */
class Definition
{
public:
//! create a new definition
Definition(const char *name,const char *b=0,const char *d=0)
{ n=name; brief=b; doc=d; }
Definition(const char *name,const char *b=0,const char *d=0);
//! destroys the definition
virtual ~Definition() {}
virtual ~Definition();
//! returns the name of the definition
QString name() const { return n; }
//! returns the base name of the output file that contains this definition.
virtual QString getOutputFileBase() const = 0;
//! returns the detailed description of this definition
QString documentation() const { return doc; }
//! returns the brief description of this definition
......@@ -55,10 +58,13 @@ class Definition
{ return !doc.isNull() || !brief.isNull() || extractAllFlag; }
QString nameToFile(const char *name);
void addSectionsToDefinition(QList<QString> *anchorList);
private:
QString n; // name of the definition
QString brief; // brief description
QString doc; // detailed description
SectionList *sectionList; // list of all sections
};
#endif
......@@ -152,7 +152,7 @@ static void writeMapArea(QTextStream &t,ClassDef *cd,int x,int y,int w,int h)
{
t << "<area ";
if (cd->getReference()) t << "doxygen=\"" << cd->getReference() << ":\" ";
t << "href=\"" << cd->classFile() << ".html\" ";
t << "href=\"" << cd->getOutputFileBase() << ".html\" ";
t << "ALT=\"" << cd->name();
t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
t << x+w << "," << y+h << "\">" << endl;
......@@ -187,7 +187,7 @@ QString DiagramItem::label() const
QString DiagramItem::fileName() const
{
return classDef->classFile();
return classDef->getOutputFileBase();
}
int DiagramItem::avgChildPos() const
......
......@@ -60,6 +60,7 @@ PageList exampleList; // list of all example files
PageList pageList; // list of all related documentation pages
MemberNameList memberNameList; // list of class member + related functions
MemberNameList functionNameList; // list of all unrelated functions
//MemberNameList namespaceNameList; // list of namespace members;
FileNameList inputNameList; // list of all input files
StringList inputFiles;
FileList includeFiles;
......@@ -71,8 +72,9 @@ PageDict pageDict(1009); // dictionary of all doc pages
PageDict exampleDict(1009); // dictionary of all examples
ClassDict classDict(1009); // dictionary of all documented classes
NamespaceDict namespaceDict(257); // dictionary of all documented namespaces
MemberNameDict memberNameDict(10007); // dictionary of all member names
MemberNameDict memberNameDict(10007); // dictionary of all class member names
MemberNameDict functionNameDict(10007); // dictionary of all functions
//MemberNameDict namespaceNameDict(10007);// dictionaty of all namespace member names
StringDict substituteDict(1009); // dictionary of class name substitutes
SectionDict sectionDict(257); // dictionary of all page sections
FileNameDict inputNameDict(1009); // dictionary of sections
......@@ -100,6 +102,7 @@ int documentedMembers;
int documentedFiles;
int documentedGroups;
int documentedNamespaces;
int documentedNamespaceMembers;
QTextStream tagFile;
......@@ -140,6 +143,7 @@ void buildGroupList(Entry *root)
gd = new GroupDef(root->name,root->type);
gd->setBriefDescription(root->brief);
gd->setDocumentation(root->doc);
gd->addSectionsToDefinition(root->anchors);
groupList.inSort(gd);
groupDict.insert(root->name,gd);
}
......@@ -207,6 +211,7 @@ void buildFileList(Entry *root)
{
fd->setDocumentation(root->doc);
fd->setBriefDescription(root->brief);
fd->addSectionsToDefinition(root->anchors);
QListIterator<QString> sli(*root->groups);
QString *s;
for (;(s=sli.current());++sli)
......@@ -290,7 +295,7 @@ void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
cd->setIncludeFile(fd);
// set include supplied name
cd->setIncludeName(root->includeName);
fd->setIncludeName((QString)cd->classFile()+"-include");
fd->setIncludeName(cd->getOutputFileBase()+"-include");
if (includeDict[fd->absFilePath()]==0) // include not inserted earlier
{
includeFiles.inSort(fd);
......@@ -409,6 +414,7 @@ void buildClassList(Entry *root)
{
cd->setDocumentation(root->doc);
cd->setBriefDescription(root->brief);
cd->addSectionsToDefinition(root->anchors);
cd->setName(fullName); // change name to match docs
}
}
......@@ -429,7 +435,7 @@ void buildClassList(Entry *root)
)
// new class
{
int sec=ClassDef::Class;
ClassDef::CompoundType sec=ClassDef::Class;
switch(root->section)
{
case Entry::UNION_SEC:
......@@ -445,6 +451,7 @@ void buildClassList(Entry *root)
//printf("new ClassDef tempArgList=%p\n",root->tArgList);
cd->setTemplateArguments(root->tArgList);
cd->setProtection(root->protection);
cd->addSectionsToDefinition(root->anchors);
QListIterator<QString> sli(*root->groups);
QString *s;
......@@ -519,6 +526,7 @@ void buildNamespaceList(Entry *root)
{
nd->setDocumentation(root->doc);
nd->setName(fullName); // change name to match docs
nd->addSectionsToDefinition(root->anchors);
}
else if (!nd->documentation().isEmpty() && root->doc.length()>0)
{
......@@ -539,14 +547,16 @@ void buildNamespaceList(Entry *root)
}
}
}
else if (root->doc.length()>0 ||
else /* if (root->doc.length()>0 ||
root->brief.length()>0 ||
extractAllFlag
)
)
*/
{
NamespaceDef *nd=new NamespaceDef(fullName);
nd->setDocumentation(root->doc); // copy docs to definition
nd->setBriefDescription(root->brief);
nd->addSectionsToDefinition(root->anchors);
QListIterator<QString> sli(*root->groups);
QString *s;
......@@ -639,12 +649,14 @@ void buildVarList(Entry *root)
bool stat=root->stat;
ClassDef *cd=0;
Entry *p = root->parent;
while ((p->section & Entry::COMPOUND_MASK))
while ((p->section & Entry::COMPOUND_MASK) ||
p->section==Entry::NAMESPACE_SEC)
{
if (p->name.length()>0 && p->name[0]!='@')
{
if (!scope.isEmpty()) scope.prepend("::");
scope.prepend(p->name);
break;
}
p=p->parent;
}
......@@ -652,6 +664,7 @@ void buildVarList(Entry *root)
//printf("scope=%s\n",scope.data());
int ni;
#if 0
if ((ni=root->name.findRev("::"))!=-1)
{
if (scope.length()>0) scope+="::";
......@@ -659,8 +672,18 @@ void buildVarList(Entry *root)
name=root->name.right(root->name.length()-ni-2);
stat=TRUE;
}
#endif
if ((ni=root->name.findRev("::"))!=-1) goto nextMember;
/* skip this member, because it is a
* static variable definition (always?), which will be
* found in a class scope as well, but then we know the
* correct protection level, so only then it will be
* inserted in the correct list!
*/
MemberDef::MemberType mtype;
// NamespaceDef *nd = 0;
QString type=root->type.stripWhiteSpace();
if (type=="@")
mtype=MemberDef::EnumValue;
......@@ -715,11 +738,28 @@ void buildVarList(Entry *root)
if (mn)
{
MemberDef *md=mn->first();
while (md)
while (md && !found)
{
if (md->memberClass()==cd) // member already in the scope
{
addMemberDocs(root,md,def,FALSE);
#if 0
// always trust the most protected scope, so adjust if needed
// This is needed to properly place static private variables,
// which are defined in a `public' scope.
printf("Checking protection level\n");
if (root->protection==Private || md->protection()!=Private)
{
printf("Set to private\n");
md->setProtection(Private);
}
else if (root->protection==Protected && md->protection()==Public)
{
printf("Set to protected\n");
md->setProtection(Protected);
}
#endif
found=TRUE;
}
md=mn->next();
......@@ -737,6 +777,7 @@ void buildVarList(Entry *root)
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setDefinition(def);
md->addSectionsToDefinition(root->anchors);
// add the member to the global list
if (mn)
......@@ -761,6 +802,56 @@ void buildVarList(Entry *root)
cd->insertUsedFile(root->fileName);
}
}
#if 0
else if (scope.length()>0 && name.length()>0 && (nd=namespaceDict[scope]))
{
Debug::print(Debug::Variables,0,
" namespace variable:\n"
" type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d\n",
root->type.data(),
scope.data(),
name.data(),
root->args.data(),
root->protection
);
// new global variable, enum value or typedef
MemberDef *md=new MemberDef(root->type,name,root->args,0,
Public, Normal,root->stat,FALSE,
mtype,0,0);
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
QString def;
nd->insertMember(md);
md->setNamespace(nd);
if (root->type.length()>0)
{
def=root->type+" "+nd->name()+"::"+name+root->args;
}
else
{
def=nd->name()+"::"+name+root->args;
}
if (def.left(7)=="static ") def=def.right(def.length()-7);
md->setDefinition(def);
MemberName *mn;
// add member definition to the list of globals
if ((mn=namespaceNameDict[name]))
{
mn->inSort(md);
}
else
{
mn = new MemberName(name);
mn->inSort(md);
namespaceNameDict.insert(name,mn);
namespaceNameList.inSort(mn);
}
}
#endif
else if (name.length()>0) // global variable
{
Debug::print(Debug::Variables,0,
......@@ -781,6 +872,7 @@ void buildVarList(Entry *root)
md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
QString def;
// see if the function is inside a namespace
......@@ -850,6 +942,7 @@ void buildVarList(Entry *root)
}
}
}
nextMember:
EntryListIterator eli(*root->sublist);
Entry *e;
for (;(e=eli.current());++eli)
......@@ -925,6 +1018,7 @@ void buildMemberList(Entry *root)
md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
QString def;
if (root->relates.length()>0 || isFriend)
{
......@@ -1048,6 +1142,7 @@ void buildMemberList(Entry *root)
{
md->setBriefDescription(root->brief);
}
md->addSectionsToDefinition(root->anchors);
}
md=mn->next();
}
......@@ -1067,6 +1162,7 @@ void buildMemberList(Entry *root)
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors);
QString def;
if (root->type.length()>0)
{
......@@ -1357,8 +1453,9 @@ void computeClassRelations(Entry *root)
}
else // base class not documented
{
//printf("Found undocumented base class %s\n",bi->name.data());
NamespaceDef *nd=cd->getNamespace();
//printf("Found undocumented base class `%s' namespace scope=`%s'\n",
// bi->name.data(),nd ? nd->name().data() : "<none>");
if (nd && (baseClass=getClass(nd->name()+"::"+baseClassName)))
// class is defined inside namespace
{
......@@ -1369,7 +1466,7 @@ void computeClassRelations(Entry *root)
}
else // undocumented base class
{
baseClass=new ClassDef(bi->name,Entry::CLASS_SEC);
baseClass=new ClassDef(bi->name,ClassDef::Class);
// add base class to this class
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
......@@ -1523,6 +1620,7 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
}
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->addSectionsToDefinition(root->anchors);
if (cd) cd->insertUsedFile(root->fileName);
}
......@@ -1676,21 +1774,23 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
else
scopeName=related.copy();
}
else if (scopeName.isEmpty() && related.isEmpty() && root->parent &&
else if (/*scopeName.isEmpty() &&*/ related.isEmpty() && root->parent &&
!root->parent->name.isNull())
{
Entry *p=root->parent;
while (p) // get full scope as class name
{
//printf("++++++ scope=`%s'\n",p->name.data());
if (((p->section & Entry::COMPOUND_MASK) ||
p->section == Entry::NAMESPACE_SEC
) && !p->name.isEmpty() && p->name[0]!='@'
)
{
if (scopeName.left(p->name.length())==p->name)
break; // scope already present, so stop now
// prepend name to scope
if (!scopeName.isEmpty()) scopeName.prepend("::");
scopeName.prepend(p->name);
break; // stop here because the class name already contains
// the whole scope!
}
p=p->parent;
}
......@@ -1906,6 +2006,7 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors);
mn->inSort(md);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
......@@ -1970,6 +2071,7 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors);
mn->inSort(md);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
......@@ -2014,7 +2116,7 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
void findMemberDocumentation(Entry *root)
{
int i,l;
QRegExp re("([a-zA-Z0-9: ]*[ *]+[ ]*");
QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*");
Debug::print(Debug::FindMembers,0,
"root->type=`%s' root->name=`%s' root->args=`%s'\n",
root->type.data(),root->name.data(),root->args.data()
......@@ -2026,7 +2128,7 @@ void findMemberDocumentation(Entry *root)
root->type=root->type.left(i+l);
isFunc=FALSE;
}
else if (root->name.find(re)!=-1 && root->name.find("operator")!=-1)
else if (root->name.find(re)!=-1 && root->name.find("operator")==-1)
// func ptr entered with \fn, \var or \typedef
{
isFunc=FALSE;
......@@ -2151,6 +2253,7 @@ void findEnums(Entry *root)
if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->addSectionsToDefinition(root->anchors);
if (nd)
{
md->setDefinition(nd->name()+"::"+name);
......@@ -2301,6 +2404,7 @@ void findEnumDocumentation(Entry *root)
{
md->setBriefDescription(root->brief);
}
md->addSectionsToDefinition(root->anchors);
found=TRUE;
}
md=mn->next();
......@@ -2319,6 +2423,7 @@ void findEnumDocumentation(Entry *root)
{
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
found=TRUE;
}
}
......@@ -2338,6 +2443,49 @@ void findEnumDocumentation(Entry *root)
}
}
// seach for each enum (member or function) in mnl if it has documented
// enum values.
static void findDEV(const MemberNameList &mnl)
{
MemberName *mn;
MemberNameListIterator mnli(mnl);
// for each member name
for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md;
MemberNameIterator mni(*mn);
// for each member definition
for (mni.toFirst();(md=mni.current());++mni)
{
if (md->isEnumerate()) // member is an enum
{
QList<MemberDef> *fmdl = md->enumFieldList();
int documentedEnumValues=0;
if (fmdl) // enum has values
{
MemberDef *fmd=fmdl->first();
// for each enum value
while (fmd)
{
if (fmd->hasDocumentation()) documentedEnumValues++;
fmd=fmdl->next();
}
}
// at least one enum value is documented
if (documentedEnumValues>0) md->setDocumentedEnumValues(TRUE);
}
}
}
}
// seach for each enum (member or function) if it has documented enum
// values.
void findDocumentedEnumValues()
{
findDEV(memberNameList);
findDEV(functionNameList);
}
//----------------------------------------------------------------------
// recursive function:
// returns TRUE iff class definition `bcd' represents an (in)direct base
......@@ -2695,6 +2843,7 @@ void findDefineDocumentation(Entry *root)
md->setDocumentation(root->doc);
if (md->briefDescription().isEmpty())
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
}
md=mn->next();
}
......@@ -2715,6 +2864,7 @@ void findDefineDocumentation(Entry *root)
md->setDocumentation(root->doc);
if (md->briefDescription().isEmpty())
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
}
}
md=mn->next();
......@@ -2769,6 +2919,7 @@ void buildPageList(Entry *root)
baseName=baseName.left(baseName.length()-5);
pi=new PageInfo(baseName, root->doc,
root->args.stripWhiteSpace());
setFileNameForSections(root->anchors,root->name);
pageList.append(pi);
pageDict.insert(baseName,pi);
if (pi->title.length()>0)
......@@ -2779,8 +2930,11 @@ void buildPageList(Entry *root)
else
pageName=pi->name.lower();
//outputList->writeTitle(pi->name,pi->title);
SectionInfo *si=new SectionInfo(pageName+".html",
pi->name,pi->title,FALSE);
// a page name is a label as well!
SectionInfo *si=new SectionInfo(
pi->name,pi->title,SectionInfo::Section);
si->fileName=pageName+".html";
//printf("Adding section info %s\n",pi->name.data());
sectionDict.insert(pi->name,si);
}
......@@ -2795,6 +2949,26 @@ void buildPageList(Entry *root)
}
}
//----------------------------------------------------------------------------
void resolveUserReferences()
{
QDictIterator<SectionInfo> sdi(sectionDict);
SectionInfo *si;
for (;(si=sdi.current());++sdi)
{
if (si->definition)
{
//printf("si=`%s' def=`%s' file=`%s'\n",
// si->label.data(),
// si->definition->name().data(),
// si->definition->getOutputFileBase().data());
si->fileName=si->definition->getOutputFileBase().copy();
}
}
}
//----------------------------------------------------------------------------
// generate all separate documentation pages
......@@ -2803,14 +2977,7 @@ void generatePageDocs()
PageInfo *pi=pageList.first();
while (pi)
{
if (!pi->title.isEmpty())
{
msg("Generating docs for page %s...\n",pi->title.data());
}
else
{
msg("Generating docs for page %s...\n",pi->name.data());
}
msg("Generating docs for page %s...\n",pi->name.data());
outputList->disable(OutputGenerator::Man);
QString pageName;
if (caseSensitiveNames)
......@@ -2850,6 +3017,7 @@ void buildExampleList(Entry *root)
else
{
PageInfo *pi=new PageInfo(root->name,root->doc,root->args);
setFileNameForSections(root->anchors,root->name);
exampleList.inSort(pi);
exampleDict.insert(root->name,pi);
}
......@@ -3166,6 +3334,7 @@ void readFiles(BufStr &output)
s=inputFiles.next();
}
// *p++='\0';
output.addChar('\n'); /* to prevent problems under Windows ? */
output.addChar(0);
//printf("Output after preprocessing:\n---------\n%s\n----------\n",output.data());
//printf("Final length = %d\n",p-output.data());
......@@ -3206,7 +3375,7 @@ int readDir(QFileInfo *fi,
else if (cfi->isFile() &&
patternMatch(cfi,patList) && !patternMatch(cfi,exclPatList))
{
totalSize+=cfi->size()+cfi->absFilePath().length()+3;
totalSize+=cfi->size()+cfi->absFilePath().length()+4;
QString name=cfi->fileName();
if (fnDict)
{
......@@ -3306,7 +3475,7 @@ int readFileOrDirectory(const char *s,
}
else if (fi.isFile())
{
totalSize+=fi.size()+fi.absFilePath().length()+3; //readFile(&fi,fiList,input);
totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
//fiList->inSort(new FileInfo(fi));
QString name=fi.fileName();
if (fnDict)
......@@ -3646,16 +3815,19 @@ int main(int argc,char **argv)
msg("Searching for enumerations...\n");
findEnums(root);
findEnumDocumentation(root);
// msg("Searching for function prototypes...\n");
// findPrototypes(root); // may introduce new members !
msg("Searching for member function documentation...\n");
findMemberDocumentation(root); // may introduce new members !
msg("Freeing entry tree\n");
delete root;
msg("Determining which enums are documented\n");
findDocumentedEnumValues();
msg("Computing member references...\n");
computeMemberReferences();
......@@ -3678,18 +3850,22 @@ int main(int argc,char **argv)
// If the result is 0 we do not generate the lists and omit the
// corresponding links in the index.
msg("Counting data structures...\n");
annotatedClasses = countAnnotatedClasses();
hierarchyClasses = countClassHierarchy();
documentedMembers = countMemberList();
documentedFunctions = countFunctionList();
documentedFiles = countFileList();
documentedGroups = countGroupList();
documentedNamespaces = countNamespaceList();
annotatedClasses = countAnnotatedClasses();
hierarchyClasses = countClassHierarchy();
documentedMembers = countClassMembers();
documentedFunctions = countFileMembers();
documentedFiles = countFiles();
documentedGroups = countGroups();
documentedNamespaces = countNamespaces();
documentedNamespaceMembers = countNamespaceMembers();
// compute the shortest possible names of all files
// without loosing the uniqueness of the file names.
msg("Generating disk names...\n");
inputNameList.generateDiskNames();
msg("Resolving user defined references...\n");
resolveUserReferences();
msg("Generating example documentation...\n");
generateExampleDocs();
......@@ -3715,9 +3891,12 @@ int main(int argc,char **argv)
msg("Generating example index...\n");
writeExampleIndex(*outputList);
msg("Generating function index...\n");
writeFunctionIndex(*outputList);
msg("Generating file member index...\n");
writeFileMemberIndex(*outputList);
msg("Generating namespace member index...\n");
writeNamespaceMemberIndex(*outputList);
// msg("Generating define index...\n");
// writeDefineIndex(*outputList);
......@@ -3730,17 +3909,17 @@ int main(int argc,char **argv)
msg("Generating style sheet...\n");
outputList->writeStyleInfo(0); // write first part
outputList->disableAllBut(OutputGenerator::Latex);
parseDoc(*outputList,0,0,
parseText(*outputList,
theTranslator->trGeneratedAt(dateToString(TRUE),projectName)
);
outputList->writeStyleInfo(1); // write second part
parseDoc(*outputList,0,0, theTranslator->trWrittenBy());
parseText(*outputList,theTranslator->trWrittenBy());
outputList->writeStyleInfo(2); // write third part
parseDoc(*outputList,0,0,
parseText(*outputList,
theTranslator->trGeneratedAt(dateToString(TRUE),projectName)
);
outputList->writeStyleInfo(3); // write fourth part
parseDoc(*outputList,0,0, theTranslator->trWrittenBy());
parseText(*outputList,theTranslator->trWrittenBy());
outputList->writeStyleInfo(4); // write last part
outputList->enableAll();
......
......@@ -28,6 +28,7 @@
#include "define.h"
#include "namespacedef.h"
#include "formula.h"
#include "section.h"
struct PageInfo
{
......@@ -72,23 +73,12 @@ class BufStr : public QString
const int spareRoom; // 10Kb extra room to avoid frequent resizing
};
struct SectionInfo
{
SectionInfo(const char *n,const char *l,const char *t,bool sub)
{ pageName=n; label=l; title=t; isSubsection=sub; }
QString pageName;
QString label;
QString title;
bool isSubsection;
};
typedef QList<QString> StringList;
typedef QDict<MemberDef> MemberDict;
typedef QDict<ClassDef> ClassDict;
typedef QDict<FileDef> FileDict;
typedef QDict<QString> StringDict;
typedef QDict<PageInfo> PageDict;
typedef QDict<SectionInfo> SectionDict;
typedef QDict<GroupDef> GroupDict;
extern const char * getOverloadDocs();
......@@ -118,6 +108,7 @@ extern FileList includeFiles;
extern StringDict typedefDict;
extern GroupList groupList;
extern NamespaceList namespaceList;
extern NamespaceDict namespaceDict;
extern FormulaList formulaList;
extern FormulaDict formulaDict;
extern FormulaDict formulaNameDict;
......@@ -130,5 +121,6 @@ extern int documentedDefines;
extern int documentedFiles;
extern int documentedGroups;
extern int documentedNamespaces;
extern int documentedNamespaceMembers;
#endif
......@@ -14,7 +14,7 @@
# TMake project file for doxygen
TEMPLATE = doxygen.t
CONFIG = console qt warn_on release #debug
CONFIG = console qt warn_on release #debug
HEADERS = doxygen.h scanner.h classdef.h classlist.h memberdef.h \
membername.h index.h memberlist.h definition.h \
entry.h logos.h instdox.h message.h code.h \
......
......@@ -251,7 +251,8 @@ QString unhtmlify(const char *str)
}
<SearchWords>[a-z_A-Z0-9]+ {
docAnchor = yytext;
if (docAnchor=="details")
if (docAnchor=="details" ||
docAnchor=="_details")
{
docRefName=className.copy();
addReference();
......
......@@ -29,6 +29,8 @@ Entry::Entry()
extends->setAutoDelete(TRUE);
groups = new QList<QString>;
groups->setAutoDelete(TRUE);
anchors = new QList<QString>;
anchors->setAutoDelete(TRUE);
argList = new ArgumentList;
argList->setAutoDelete(TRUE);
//printf("Entry::Entry() tArgList=0\n");
......@@ -66,6 +68,8 @@ Entry::Entry(const Entry &e)
extends->setAutoDelete(TRUE);
groups = new QList<QString>;
groups->setAutoDelete(TRUE);
anchors = new QList<QString>;
anchors->setAutoDelete(TRUE);
argList = new ArgumentList;
argList->setAutoDelete(TRUE);
//printf("Entry::Entry(copy) tArgList=0\n");
......@@ -94,6 +98,12 @@ Entry::Entry(const Entry &e)
{
groups->append(new QString(*s));
}
QListIterator<QString> sli2(*e.anchors);
for (;(s=sli2.current());++sli2)
{
anchors->append(new QString(*s));
}
// deep copy argument list
QListIterator<Argument> ali(*e.argList);
......@@ -128,6 +138,7 @@ Entry::~Entry()
delete sublist;
delete extends;
delete groups;
delete anchors;
delete argList;
//printf("Entry::~Entry() tArgList=%p\n",tArgList);
delete tArgList;
......@@ -177,6 +188,7 @@ void Entry::reset()
sublist->clear();
extends->clear();
groups->clear();
anchors->clear();
argList->clear();
if (tArgList) { delete tArgList; tArgList=0; }
}
......@@ -211,6 +223,13 @@ int Entry::getSize()
size+=s->length()+1;
s=groups->next();
}
s=anchors->first();
while (s)
{
size+=sizeof(QLNode);
size+=s->length()+1;
s=anchors->next();
}
Entry *e=sublist->first();
while (e)
{
......
......@@ -140,6 +140,7 @@ class Entry
QList<Entry> *sublist; // entries that are children of this one
QList<BaseInfo> *extends; // list of base classes
QList<QString> *groups; // list of groups this entry belongs to
QList<QString> *anchors; // list of anchors defined in this entry
QString fileName; // file this entry was extracted from
int startLine; // start line of entry in the source
int num;
......
......@@ -69,7 +69,7 @@ void FileDef::writeDocumentation(OutputList &ol)
QString pageTitle=name()+" File Reference";
startFile(ol,diskname,pageTitle);
startTitle(ol);
ol.docify(pageTitle);
parseText(ol,theTranslator->trFileReference(name()));
endTitle(ol,name());
//ol.newParagraph();
......@@ -86,8 +86,8 @@ void FileDef::writeDocumentation(OutputList &ol)
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(0,"details");
parseDoc(ol,0,0,theTranslator->trMore());
ol.startTextLink(0,"_details");
parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.enableAll();
}
......@@ -96,6 +96,7 @@ void FileDef::writeDocumentation(OutputList &ol)
ol.enable(OutputGenerator::Man);
ol.writeSynopsis();
ol.startMemberSections();
if (classList->count()>0)
{
ClassDef *cd=classList->first();
......@@ -111,7 +112,7 @@ void FileDef::writeDocumentation(OutputList &ol)
if (!found)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trCompounds());
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
......@@ -124,10 +125,11 @@ void FileDef::writeDocumentation(OutputList &ol)
case ClassDef::Union: ol.writeString("union"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (cd->hasDocumentation())
{
ol.writeObjectLink(cd->getReference(),
cd->classFile(),
cd->getOutputFileBase(),
0,
cd->name()
);
......@@ -146,6 +148,7 @@ void FileDef::writeDocumentation(OutputList &ol)
}
writeMemberDecs(ol,0,0,this,0,0,memList);
ol.endMemberSections();
//doc=doc.stripWhiteSpace();
//int bl=brief.length();
......@@ -153,9 +156,12 @@ void FileDef::writeDocumentation(OutputList &ol)
if (!briefDescription().isEmpty() || !documentation().isEmpty())
{
ol.writeRuler();
ol.writeAnchor("details");
bool latexOn = ol.isEnabled(OutputGenerator::Latex);
if (latexOn) ol.disable(OutputGenerator::Latex);
ol.writeAnchor("_details");
if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trDetailedDescription());
parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
if (!briefDescription().isEmpty())
{
......@@ -177,7 +183,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trDefineDocumentation());
parseText(ol,theTranslator->trDefineDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Define);
}
......@@ -186,7 +192,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trFunctionPrototypeDocumentation());
parseText(ol,theTranslator->trFunctionPrototypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Prototype);
}
......@@ -195,7 +201,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trTypedefDocumentation());
parseText(ol,theTranslator->trTypedefDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Typedef);
}
......@@ -204,7 +210,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trEnumerationTypeDocumentation());
parseText(ol,theTranslator->trEnumerationTypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Enumeration);
}
......@@ -213,7 +219,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trEnumerationValueDocumentation());
parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::EnumValue);
}
......@@ -222,7 +228,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trFunctionDocumentation());
parseText(ol,theTranslator->trFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Function);
}
......@@ -231,7 +237,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trVariableDocumentation());
parseText(ol,theTranslator->trVariableDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Variable);
}
......@@ -239,9 +245,9 @@ void FileDef::writeDocumentation(OutputList &ol)
// write Author section (Man only)
ol.disableAllBut(OutputGenerator::Man);
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trAuthor());
parseText(ol,theTranslator->trAuthor());
ol.endGroupHeader();
parseDoc(ol,0,0,theTranslator->trGeneratedAutomatically(projectName));
parseText(ol,theTranslator->trGeneratedAutomatically(projectName));
ol.enableAll();
endFile(ol);
}
......
......@@ -62,7 +62,8 @@ class FileDef : public Definition
}
/*! Returns nameString with all slashes replaced by underscores. */
const char *diskName() const { return diskname; }
//const char *diskName() const { return diskname; }
QString getOutputFileBase() const { return diskname; }
/*! Returns the absolute path including the file name. */
QString absFilePath() const { return filepath; }
......
......@@ -90,20 +90,20 @@ void GroupDef::writeDocumentation(OutputList &ol)
ol+=briefOutput;
ol.writeString(" \n");
ol.disable(OutputGenerator::Latex);
ol.startTextLink(0,"details");
parseDoc(ol,0,0,theTranslator->trMore());
ol.startTextLink(0,"_details");
parseText(ol,theTranslator->trMore());
ol.enable(OutputGenerator::Latex);
}
if (fileList->count()>0)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trFiles());
parseText(ol,theTranslator->trFiles());
ol.endMemberHeader();
ol.startIndexList();
FileDef *fd=fileList->first();
while (fd)
{
ol.writeStartAnnoItem("file ",fd->diskName(),0,fd->name());
ol.writeStartAnnoItem("file ",fd->getOutputFileBase(),0,fd->name());
ol.writeEndAnnoItem(fd->name());
fd=fileList->next();
}
......@@ -112,7 +112,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (classList->count()>0)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trCompounds());
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startIndexList();
ClassDef *cd=classList->first();
......@@ -125,7 +125,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
case ClassDef::Struct: type="struct"; break;
case ClassDef::Union: type="union"; break;
}
ol.writeStartAnnoItem(type,cd->classFile(),0,cd->name());
ol.writeStartAnnoItem(type,cd->getOutputFileBase(),0,cd->name());
ol.writeEndAnnoItem(cd->name());
cd=classList->next();
}
......@@ -136,9 +136,12 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!briefDescription().isEmpty() || !documentation().isEmpty())
{
ol.writeRuler();
ol.writeAnchor("details");
bool latexOn = ol.isEnabled(OutputGenerator::Latex);
if (latexOn) ol.disable(OutputGenerator::Latex);
ol.writeAnchor("_details");
if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trDetailedDescription());
parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
// repeat brief description
if (!briefDescription().isEmpty())
......
......@@ -35,7 +35,8 @@ class GroupDef : public Definition
public:
GroupDef(const char *name,const char *title);
~GroupDef();
const char *groupFile() const { return fileName; }
//const char *groupFile() const { return fileName; }
QString getOutputFileBase() const { return fileName; }
const char *groupTitle() const { return title; }
void addFile(const FileDef *def);
void addClass(const ClassDef *def);
......
......@@ -51,77 +51,10 @@ void HtmlGenerator::init()
writeLogo(htmlOutputDir);
}
//void HtmlGenerator::generateExternalIndex()
//{
// //printf("Generating external index...\n");
// QFile f;
// f.setName(htmlOutputDir+"/header.html");
// if (f.open(IO_WriteOnly))
// {
// QTextStream tt(&f);
// if (header.length()==0)
// {
// tt << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
// "<html><head><meta name=\"robots\" content=\"noindex\">\n"
// "<title>Doxysearch</title>\n"
// "</head><body bgcolor=\"#ffffff\">\n";
// }
// else
// {
// tt << header;
// }
// if (!noIndexFlag)
// {
// tt << "<center>";
// if (documentedGroups>0)
// tt << "<a doxygen=\"_doc:\" href=\"/modules.html\">Modules</a> &nbsp; ";
// if (hierarchyClasses>0)
// tt << "<a doxygen=\"_doc:\" href=\"/hierarchy.html\">Class hierarchy</a> &nbsp; ";
// if (annotatedClasses>0)
// tt << "<a doxygen=\"_doc:\" href=\"/annotated.html\">Compound list</a> &nbsp; ";
// if (documentedFiles>0)
// tt << "<a doxygen=\"_doc:\" href=\"/files.html\">File list</a> &nbsp; ";
// if (includeFiles.count()>0)
// tt << "<a doxygen=\"_doc:\" href=\"/headers.html\">Header files</a> &nbsp; ";
// if (documentedMembers>0)
// tt << "<a doxygen=\"_doc:\" href=\"/functions.html\">Compound Members</a> &nbsp; ";
// if (documentedFunctions>0)
// tt << "<a doxygen=\"_doc:\" href=\"/globals.html\">File Members</a> &nbsp; ";
// if (pageList.count()>0)
// tt << "<a doxygen=\"_doc:\" href=\"/pages.html\">Related Pages</a> &nbsp; ";
// if (exampleList.count()>0)
// tt << "<a doxygen=\"_doc:\" href=\"/examples.html\">Examples</a> &nbsp; ";
// if (searchEngineFlag)
// tt << "<a doxygen=\"_cgi:\" href=\"\">Search</a>";
// tt << endl << "</center><hr>" << endl;
// }
// }
// f.close();
//
// f.setName(htmlOutputDir+"/footer.html");
// if (f.open(IO_WriteOnly))
// {
// QTextStream tt(&f);
// if (footer.length()==0)
// {
// tt << "<hr><address><small>Generated at " << dateToString(TRUE);
// if (projectName.length()>0) tt << " for " << projectName;
// tt << " by <a href=\"http://www.stack.nl/~dimitri/doxygen/index.html\">"
// "doxygen</a>&nbsp; written by <a href="
// "\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>, &copy; "
// "1997-1999</small></address>\n</body>\n</html>\n";
// }
// else
// {
// tt << footer;
// }
// }
// f.close();
//}
void HtmlGenerator::startFile(const char *name,const char *title,bool external)
{
QString fileName=name;
lastTitle=title;
if (fileName.right(5)!=".html") fileName+=".html";
startPlainFile(fileName);
if (header.length()==0)
......@@ -139,34 +72,14 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
}
else
{
t << header;
t << substitute(
substitute(
substitute(header,"$title",lastTitle),
"$datetime",dateToString(TRUE)
),
"$date",dateToString(FALSE)
);
}
// if (!noIndexFlag)
// {
// t << "<center>";
// if (documentedGroups>0)
// t << "<a href=\"modules.html\">Modules</a> &nbsp; ";
// if (hierarchyClasses>0)
// t << "<a href=\"hierarchy.html\">Class hierarchy</a> &nbsp; ";
// if (annotatedClasses>0)
// t << "<a href=\"annotated.html\">Compound list</a> &nbsp; ";
// if (documentedFiles>0)
// t << "<a href=\"files.html\">File list</a> &nbsp; ";
// if (includeFiles.count()>0)
// t << "<a href=\"headers.html\">Header files</a> &nbsp; ";
// if (documentedMembers>0)
// t << "<a href=\"functions.html\">Compound Members</a> &nbsp; ";
// if (documentedFunctions>0)
// t << "<a href=\"globals.html\">File Members</a> &nbsp; ";
// if (pageList.count()>0)
// t << "<a href=\"pages.html\">Related Pages</a> &nbsp; ";
// if (exampleList.count()>0)
// t << "<a href=\"examples.html\">Examples</a> &nbsp; ";
// if (searchEngineFlag)
// t << "<a doxygen=\"_cgi:\" href=\"\">Search</a>";
// t << endl << "</center><hr>" << endl;
// }
}
void HtmlGenerator::startQuickIndexItem(const char *s,const char *l)
......@@ -189,7 +102,13 @@ void HtmlGenerator::writeFooter(int part,bool external)
if (footer.length()==0)
t << "<hr><address><small>";
else
t << footer;
t << substitute(
substitute(
substitute(footer,"$title",lastTitle),
"$datetime",dateToString(TRUE)
),
"$date",dateToString(FALSE)
);
break;
case 1:
if (footer.length()==0)
......@@ -219,24 +138,6 @@ void HtmlGenerator::writeFooter(int part,bool external)
void HtmlGenerator::endFile()
{
// if (footer.length()==0)
// {
// t << "<hr><address><small>Generated at " << dateToString(TRUE);
// if (projectName.length()>0)
// {
// t << " for ";
// docify(projectName);
// }
// t << " by <a href=\"http://www.stack.nl/~dimitri/doxygen/index.html\">"
// "<img src=\"doxygen.gif\" alt=\"doxygen\" align=center border=0 "
// "width=118 height=53></a>&nbsp; written by <a href="
// "\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>, &copy; "
// "1997-1999</small></address>\n</body>\n</html>\n";
// }
// else
// {
// t << footer;
// }
endPlainFile();
}
......@@ -250,45 +151,6 @@ void HtmlGenerator::endProjectNumber()
t << "</h3>";
}
//void HtmlGenerator::writeIndex()
//{
// startFile("index.html","Main Index");
// t << "<h1 align=center>";
// docify(projectName);
// t << " Documentation</h1>"
// << "<p>" << endl << "<p>" << endl;
// if (!projectNumber.isEmpty())
// {
// t << "<h3 align=center>";
// docify(projectNumber);
// t << "</h3>\n<p>\n<p>\n";
// }
// if (noIndexFlag)
// {
// t << "<ul>" << endl;
// if (hierarchyClasses>0)
// t << "<li><a href=\"hierarchy.html\">Class hierarchy</a>" << endl;
// if (annotatedClasses>0)
// t << "<li><a href=\"annotated.html\">Compound list</a>" << endl;
// if (documentedFiles>0)
// t << "<li><a href=\"files.html\">File list</a>" << endl;
// if (includeFiles.count()>0)
// t << "<li><a href=\"headers.html\">Header files</a>" << endl;
// if (documentedMembers>0)
// t << "<li><a href=\"functions.html\">Compound Members</a>" << endl;
// if (documentedFunctions>0)
// t << "<li><a href=\"globals.html\">File Members</a>" << endl;
// if (pageList.count()>0)
// t << "<li><a href=\"pageList.html\">Related Pages</a>" << endl;
// if (exampleList.count()>0)
// t << "<li><a href=\"examples.html\">Examples</a>" << endl;
// if (searchEngineFlag)
// t << "<li><a doxygen=\"_cgi:\" href=\"\">Search</a>" << endl;
// t << "</ul>" << endl;
// }
// endFile();
//}
void HtmlGenerator::writeStyleInfo(int part)
{
if (part==0)
......@@ -414,9 +276,9 @@ void HtmlGenerator::writeSectionRef(const char *name,const char *lab,
{
QString refName=name;
if (refName.right(5)!=".html") refName+=".html";
t << "&quot;<a href=\"" << refName << "#" << lab << "\">";
t << "<a href=\"" << refName << "#" << lab << "\">";
docify(title);
t << "</a>&quot;";
t << "</a>";
}
void HtmlGenerator::writeSectionRefItem(const char *name,const char *lab,
......@@ -429,12 +291,12 @@ void HtmlGenerator::writeSectionRefItem(const char *name,const char *lab,
t << "</a>";
}
//void HtmlGenerator::docify(const char *str)
//{
// docifyStatic(t,str);
//}
void HtmlGenerator::writeSectionRefAnchor(const char *name,const char *lab,
const char *title)
{
writeSectionRef(name,lab,title);
}
//void HtmlGenerator::docifyStatic(QTextStream &t,const char *str)
void HtmlGenerator::docify(const char *str)
{
if (str)
......@@ -510,3 +372,121 @@ void HtmlGenerator::writeFormula(const char *n,const char *text)
t << "<img align=\"top\" src=\"" << n << "\">" << endl;
if (text && text[0]=='\\') t << "</center></p>" << endl;
}
void HtmlGenerator::startMemberList()
{
if (htmlAlignMemberFlag)
{
//t << endl << "<p><table border=0 cellspacing=2 cellpadding=0>" << endl;
}
else
{
t << "<ul>" << endl;
}
}
void HtmlGenerator::endMemberList()
{
if (htmlAlignMemberFlag)
{
//t << "</table>" << endl;
}
else
{
t << "</ul>" << endl;
}
}
void HtmlGenerator::startMemberItem()
{
if (htmlAlignMemberFlag)
{
t << "<tr><td align=right valign=top>";
}
else
{
t << "<li>";
}
}
void HtmlGenerator::insertMemberAlign()
{
if (htmlAlignMemberFlag)
{
t << "</td><td valign=top>";
}
}
void HtmlGenerator::endMemberItem()
{
if (htmlAlignMemberFlag)
{
t << "</td></tr>";
}
t << endl;
}
void HtmlGenerator::startMemberDescription()
{
if (htmlAlignMemberFlag)
{
t << "<tr><td></td><td><font size=-1><em>";
}
else
{
t << "<dl class=\"el\"><dd><font size=-1><em>";
}
}
void HtmlGenerator::endMemberDescription()
{
if (htmlAlignMemberFlag)
{
t << "</em></font><br><br></td></tr>" << endl;
}
else
{
t << "</em></font></dl>";
}
}
void HtmlGenerator::startMemberSections()
{
if (htmlAlignMemberFlag)
{
t << "<table border=0 cellpadding=0 cellspacing=1>" << endl;
}
}
void HtmlGenerator::endMemberSections()
{
if (htmlAlignMemberFlag)
{
t << "</table>" << endl;
}
}
void HtmlGenerator::startMemberHeader()
{
if (htmlAlignMemberFlag)
{
t << "<tr><td colspan=2><br><h2>";
}
else
{
startGroupHeader();
}
}
void HtmlGenerator::endMemberHeader()
{
if (htmlAlignMemberFlag)
{
t << "</h2></td></tr>" << endl;
}
else
{
endGroupHeader();
}
}
......@@ -81,18 +81,23 @@ class HtmlGenerator : public OutputGenerator
void endGroupHeader();
void writeListItem() { t << "<li>"; }
void startMemberHeader() { startGroupHeader(); }
void endMemberHeader() { endGroupHeader(); }
void startMemberList() { t << "<ul>" << endl; }
void endMemberList() { t << "</ul>" << endl; }
void startMemberItem() { t << "<li>"; }
void endMemberItem() { t << endl; }
void startMemberSections();
void endMemberSections();
void startMemberHeader();
void endMemberHeader();
void startMemberList();
void endMemberList();
void startMemberItem();
void insertMemberAlign();
void endMemberItem();
void startMemberDescription();
void endMemberDescription();
void writeRuler() { t << "<hr>"; }
void writeAnchor(const char *name)
{ t << "<a name=\"" << name <<"\"></a>"; }
void startCodeFragment() { t << "<div class=\"fragment\"><pre>"; }
void endCodeFragment() { t << "</div></pre>"; }
void endCodeFragment() { t << "</pre></div>"; }
void writeBoldString(const char *text)
{ t << "<b>"; docify(text); t << "</b>"; }
void startEmphasis() { t << "<em>"; }
......@@ -111,6 +116,7 @@ class HtmlGenerator : public OutputGenerator
void writeDoxyAnchor(const char *clName,const char *anchor,
const char *name);
void writeLatexSpacing() {}
void writeLatexLabel(const char *,const char *) {}
void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *) { t << endl; }
......@@ -139,8 +145,6 @@ class HtmlGenerator : public OutputGenerator
void writeGrave(char c) { t << "&" << c << "grave;"; }
void writeCirc(char c) { t << "&" << c << "circ;"; }
void writeTilde(char c) { t << "&" << c << "tilde;"; }
void startMemberDescription() { t << "<dl class=\"el\"><dd><font size=-1><em>"; }
void endMemberDescription() { t << "</em></font></dl>"; }
void startDescList() { t << "<dl compact><dt>" << endl; }
void endDescTitle() {}
void writeDescItem() { t << "<dd>" << endl; }
......@@ -148,6 +152,7 @@ class HtmlGenerator : public OutputGenerator
void writeSection(const char *,const char *,bool);
void writeSectionRef(const char *,const char *,const char *);
void writeSectionRefItem(const char *,const char *,const char *);
void writeSectionRefAnchor(const char *,const char *,const char *);
void addToIndex(const char *,const char *) {}
void startIndent() { t << "<div class=\"in\">" << endl; }
void endIndent() { t << "</div>" << endl; }
......@@ -166,6 +171,7 @@ class HtmlGenerator : public OutputGenerator
private:
QString header;
QString footer;
QString lastTitle;
HtmlGenerator &operator=(const HtmlGenerator &g);
HtmlGenerator(const HtmlGenerator &g);
......
......@@ -147,7 +147,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
//printf("Passed...\n");
if (cd->hasDocumentation() || cd->isReference())
{
ol.writeIndexItem(cd->getReference(),cd->classFile(),cd->name());
ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->name());
if (cd->isReference())
{
ol.startTypewriter();
......@@ -191,7 +191,7 @@ void writeClassHierarchy(OutputList &ol)
}
if (cd->hasDocumentation() || cd->isReference())
{
ol.writeIndexItem(cd->getReference(),cd->classFile(),cd->name());
ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->name());
if (cd->isReference())
{
ol.startTypewriter();
......@@ -236,9 +236,9 @@ void writeHierarchicalIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"hierarchy","Hierarchical Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trClassHierarchy());
parseText(ol,projectName+" "+theTranslator->trClassHierarchy());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trClassHierarchyDescription());
parseText(ol,theTranslator->trClassHierarchyDescription());
ol.newParagraph();
writeClassHierarchy(ol);
endFile(ol);
......@@ -247,7 +247,7 @@ void writeHierarchicalIndex(OutputList &ol)
//----------------------------------------------------------------------------
int countFileList()
int countFiles()
{
int count=0;
FileNameListIterator fnli(inputNameList);
......@@ -272,10 +272,10 @@ void writeFileIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"files","File Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trFileList());
parseText(ol,projectName+" "+theTranslator->trFileList());
endTitle(ol,0);
ol.newParagraph();
parseDoc(ol,0,0,theTranslator->trFileListDescription(extractAllFlag));
parseText(ol,theTranslator->trFileListDescription(extractAllFlag));
ol.newParagraph();
ol.startIndexList();
......@@ -299,7 +299,7 @@ void writeFileIndex(OutputList &ol)
}
ol.writeStartAnnoItem("file",
fd->diskName(),
fd->getOutputFileBase(),
path,
fd->name()
);
......@@ -314,7 +314,7 @@ void writeFileIndex(OutputList &ol)
else
{
ol.startEmphasis();
parseDoc(ol,0,0,theTranslator->trNoDescriptionAvailable());
parseText(ol,theTranslator->trNoDescriptionAvailable());
ol.endEmphasis();
}
ol.docify(")");
......@@ -330,15 +330,14 @@ void writeFileIndex(OutputList &ol)
}
//----------------------------------------------------------------------------
int countNamespaceList()
int countNamespaces()
{
int count=0;
NamespaceListIterator nli(namespaceList);
NamespaceDef *nd;
for (;(nd=nli.current());++nli)
{
if (nd->hasDocumentation()) count++;
if (!nd->getReference() && nd->hasDocumentation()) count++;
}
return count;
}
......@@ -351,19 +350,19 @@ void writeNamespaceIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"namespaces","Namespace Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trNamespaceList());
parseText(ol,projectName+" "+theTranslator->trNamespaceList());
endTitle(ol,0);
ol.newParagraph();
parseDoc(ol,0,0,theTranslator->trNamespaceListDescription(extractAllFlag));
parseText(ol,theTranslator->trNamespaceListDescription(extractAllFlag));
ol.newParagraph();
ol.startIndexList();
NamespaceDef *nd=namespaceList.first();
while (nd)
{
if (nd->hasDocumentation())
if (!nd->getReference() && nd->hasDocumentation())
{
ol.writeStartAnnoItem("namespace",nd->namespaceFile(),0,nd->name());
ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name());
ol.docify(" (");
if (nd->briefDescription())
{
......@@ -375,7 +374,7 @@ void writeNamespaceIndex(OutputList &ol)
else
{
ol.startEmphasis();
parseDoc(ol,0,0,theTranslator->trNoDescriptionAvailable());
parseText(ol,theTranslator->trNoDescriptionAvailable());
ol.endEmphasis();
}
ol.docify(")");
......@@ -433,7 +432,7 @@ void writeAnnotatedClassList(OutputList &ol)
case ClassDef::Union: type="union"; break;
default: type="unknown"; break; // an error
}
ol.writeStartAnnoItem(type,cd->classFile(),0,cd->name());
ol.writeStartAnnoItem(type,cd->getOutputFileBase(),0,cd->name());
ol.docify(" (");
if (cd->briefDescription())
{
......@@ -445,7 +444,7 @@ void writeAnnotatedClassList(OutputList &ol)
else
{
ol.startEmphasis();
parseDoc(ol,0,0,theTranslator->trNoDescriptionAvailable());
parseText(ol,theTranslator->trNoDescriptionAvailable());
ol.endEmphasis();
}
ol.docify(")");
......@@ -466,9 +465,9 @@ void writeAnnotatedIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"annotated","Annotated Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trCompoundList());
parseText(ol,projectName+" "+theTranslator->trCompoundList());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trCompoundListDescription());
parseText(ol,theTranslator->trCompoundListDescription());
writeAnnotatedClassList(ol);
endFile(ol);
ol.enable(OutputGenerator::Man);
......@@ -522,7 +521,7 @@ void writeMemberList(OutputList &ol)
ol.docify(": ");
else
ol.docify(", ");
ol.writeObjectLink(cd->getReference(),cd->classFile(),md->anchor(),
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),md->anchor(),
cd->name());
count++;
prevName=cd->name();
......@@ -537,7 +536,7 @@ void writeMemberList(OutputList &ol)
//----------------------------------------------------------------------------
int countMemberList()
int countClassMembers()
{
int count=0;
MemberName *mn=memberNameList.first();
......@@ -575,9 +574,9 @@ void writeMemberIndex(OutputList &ol)
ol.disable(OutputGenerator::Latex);
startFile(ol,"functions","Compound Member Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trCompoundMembers());
parseText(ol,projectName+" "+theTranslator->trCompoundMembers());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trCompoundMembersDescription(extractAllFlag));
parseText(ol,theTranslator->trCompoundMembersDescription(extractAllFlag));
writeMemberList(ol);
endFile(ol);
ol.enable(OutputGenerator::Latex);
......@@ -586,7 +585,7 @@ void writeMemberIndex(OutputList &ol)
//----------------------------------------------------------------------------
void writeFunctionList(OutputList &ol)
void writeFileMemberList(OutputList &ol)
{
ol.startItemList();
MemberName *mn=functionNameList.first();
......@@ -639,7 +638,7 @@ void writeFunctionList(OutputList &ol)
//if ((s=baseName.findRev("/"))!=-1)
// baseName=baseName.right(baseName.length()-s-1);
ol.writeObjectLink(fd->getReference(),
fd->diskName(),md->anchor(), baseName);
fd->getOutputFileBase(),md->anchor(), baseName);
count++;
prevName=fd->name();
}
......@@ -653,7 +652,89 @@ void writeFunctionList(OutputList &ol)
//----------------------------------------------------------------------------
int countFunctionList()
void writeNamespaceMemberList(OutputList &ol)
{
ol.startItemList();
MemberName *mn=functionNameList.first();
while (mn)
{
MemberDef *md=mn->first();
bool found=FALSE;
while (md && !found)
{
NamespaceDef *nd=md->getNamespace();
if (nd && nd->hasDocumentation() &&
!md->isReference() &&
md->hasDocumentation() &&
!md->name().isEmpty() &&
md->name()[0]!='@') found=TRUE;
else
md=mn->next();
}
if (found) // member is documented and in a documented namespace
{
ol.writeListItem();
ol.docify(md->name());
if (md->isFunction()) ol.docify("()");
ol.writeString("\n");
int count=0;
md=mn->first();
QString prevName;
while (md)
{
NamespaceDef *nd=md->getNamespace();
if (nd && nd->hasDocumentation() &&
!md->isReference() &&
md->hasDocumentation() &&
!md->name().isEmpty() && md->name()[0]!='@'
)
{
if (count==0)
ol.docify(": ");
else
ol.docify(", ");
ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),
md->anchor(),nd->name());
count++;
}
md=mn->next();
}
}
mn=functionNameList.next();
}
ol.endItemList();
}
//----------------------------------------------------------------------------
int countNamespaceMembers()
{
int count=0;
MemberName *mn=functionNameList.first();
while (mn)
{
MemberDef *md=mn->first();
bool found=FALSE;
while (md && !found)
{
if (md->getNamespace() &&
!md->isReference() && md->hasDocumentation() &&
!md->name().isEmpty() && md->name()[0]!='@'
)
found=TRUE;
else
md=mn->next();
}
if (found) count++;
mn=functionNameList.next();
}
return count;
}
//----------------------------------------------------------------------------
int countFileMembers()
{
int count=0;
MemberName *mn=functionNameList.first();
......@@ -665,7 +746,7 @@ int countFunctionList()
while (md && !found)
{
if (!md->isReference() && md->hasDocumentation() &&
md->name()[0]!='@' &&
!md->name().isEmpty() && md->name()[0]!='@' &&
(((fd=md->getFileDef()) && fd->hasDocumentation())
||
((fd=md->getFileDec()) && fd->hasDocumentation())
......@@ -683,17 +764,35 @@ int countFunctionList()
//----------------------------------------------------------------------------
void writeFunctionIndex(OutputList &ol)
void writeFileMemberIndex(OutputList &ol)
{
if (documentedFunctions==0) return;
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex);
startFile(ol,"globals","File Member Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trFileMembers());
parseText(ol,projectName+" "+theTranslator->trFileMembers());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trFileMembersDescription(extractAllFlag));
writeFunctionList(ol);
parseText(ol,theTranslator->trFileMembersDescription(extractAllFlag));
writeFileMemberList(ol);
endFile(ol);
ol.enable(OutputGenerator::Latex);
ol.enable(OutputGenerator::Man);
}
//----------------------------------------------------------------------------
void writeNamespaceMemberIndex(OutputList &ol)
{
if (documentedNamespaceMembers==0) return;
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex);
startFile(ol,"namespacemembers","Namespace Member Index");
startTitle(ol);
parseText(ol,projectName+" "+theTranslator->trNamespaceMembers());
endTitle(ol,0);
parseText(ol,theTranslator->trNamespaceMemberDescription(extractAllFlag));
writeNamespaceMemberList(ol);
endFile(ol);
ol.enable(OutputGenerator::Latex);
ol.enable(OutputGenerator::Man);
......@@ -736,9 +835,9 @@ void writeHeaderIndex(OutputList &ol)
ol.disable(OutputGenerator::Latex);
startFile(ol,"headers","Header File Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trHeaderFiles());
parseText(ol,projectName+" "+theTranslator->trHeaderFiles());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trHeaderFilesDescription());
parseText(ol,theTranslator->trHeaderFilesDescription());
writeHeaderFileList(ol);
endFile(ol);
ol.enable(OutputGenerator::Latex);
......@@ -753,9 +852,9 @@ void writeExampleIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"examples","Example Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trExamples());
parseText(ol,projectName+" "+theTranslator->trExamples());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trExamplesDescription());
parseText(ol,theTranslator->trExamplesDescription());
ol.startIndexList();
PageInfo *pi=exampleList.first();
while (pi)
......@@ -788,18 +887,25 @@ void writePageIndex(OutputList &ol)
startTitle(ol);
ol.docify(projectName+" "+theTranslator->trRelatedPages());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trRelatedPagesDescription());
parseText(ol,theTranslator->trRelatedPagesDescription());
ol.startIndexList();
PageInfo *pi=pageList.first();
while (pi)
{
QString pageName;
QString pageName,pageTitle;
if (caseSensitiveNames)
pageName=pi->name.copy();
else
pageName=pi->name.lower();
if (pi->title.isEmpty())
pageTitle=pi->name;
else
pageTitle=pi->title;
ol.writeListItem();
ol.writeObjectLink(0,pageName,0,pi->name);
ol.writeObjectLink(0,pageName,0,pageTitle);
ol.writeString("\n");
pi=pageList.next();
}
......@@ -810,7 +916,7 @@ void writePageIndex(OutputList &ol)
//----------------------------------------------------------------------------
int countGroupList()
int countGroups()
{
int count=0;
GroupListIterator gli(groupList);
......@@ -835,7 +941,7 @@ void writeGroupList(OutputList &ol)
if (gd->countMembers()>0)
{
ol.startDescItem();
ol.startTextLink(gd->groupFile(),0);
ol.startTextLink(gd->getOutputFileBase(),0);
parseDoc(ol,0,0,gd->groupTitle());
ol.endTextLink();
ol.endDescItem();
......@@ -854,9 +960,9 @@ void writeGroupIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"modules","Module Index");
startTitle(ol);
parseDoc(ol,0,0,projectName+" "+theTranslator->trModules());
parseText(ol,projectName+" "+theTranslator->trModules());
endTitle(ol,0);
parseDoc(ol,0,0,theTranslator->trModulesDescription());
parseText(ol,theTranslator->trModulesDescription());
writeGroupList(ol);
endFile(ol);
ol.enable(OutputGenerator::Man);
......@@ -880,7 +986,7 @@ void writeIndex(OutputList &ol)
ol.startFile("index","Main Index",FALSE);
if (!noIndexFlag) writeQuickLinks(ol,TRUE);
ol.startTitleHead();
parseDoc(ol,0,0,projPrefix+theTranslator->trDocumentation());
parseText(ol,projPrefix+theTranslator->trDocumentation());
ol.endTitleHead(0);
ol.newParagraph();
if (!projectNumber.isEmpty())
......@@ -897,7 +1003,7 @@ void writeIndex(OutputList &ol)
ol.enable(OutputGenerator::Latex);
ol.startFile("refman",0,FALSE);
ol.startIndexSection(isTitlePageStart);
parseDoc(ol,0,0,projPrefix+theTranslator->trReferenceManual());
parseText(ol,projPrefix+theTranslator->trReferenceManual());
if (!projectNumber.isEmpty())
{
ol.startProjectNumber();
......@@ -906,60 +1012,72 @@ void writeIndex(OutputList &ol)
}
ol.endIndexSection(isTitlePageStart);
ol.startIndexSection(isTitlePageAuthor);
parseDoc(ol,0,0,theTranslator->trGeneratedBy());
parseText(ol,theTranslator->trGeneratedBy());
ol.endIndexSection(isTitlePageAuthor);
if (documentedGroups>0)
{
ol.startIndexSection(isModuleIndex);
parseDoc(ol,0,0,projPrefix+theTranslator->trModuleIndex());
parseText(ol,projPrefix+theTranslator->trModuleIndex());
ol.endIndexSection(isModuleIndex);
}
if (documentedNamespaces>0)
{
ol.startIndexSection(isNamespaceIndex);
parseText(ol,projPrefix+theTranslator->trNamespaceIndex());
ol.endIndexSection(isNamespaceIndex);
}
if (hierarchyClasses>0)
{
ol.startIndexSection(isClassHierarchyIndex);
parseDoc(ol,0,0,projPrefix+theTranslator->trHierarchicalIndex());
parseText(ol,projPrefix+theTranslator->trHierarchicalIndex());
ol.endIndexSection(isClassHierarchyIndex);
}
if (annotatedClasses>0)
{
ol.startIndexSection(isCompoundIndex);
parseDoc(ol,0,0,projPrefix+theTranslator->trCompoundIndex());
parseText(ol,projPrefix+theTranslator->trCompoundIndex());
ol.endIndexSection(isCompoundIndex);
}
if (documentedFiles>0)
{
ol.startIndexSection(isFileIndex);
parseDoc(ol,0,0,projPrefix+theTranslator->trFileIndex());
parseText(ol,projPrefix+theTranslator->trFileIndex());
ol.endIndexSection(isFileIndex);
}
if (documentedGroups>0)
{
ol.startIndexSection(isModuleDocumentation);
parseDoc(ol,0,0,projPrefix+theTranslator->trModuleDocumentation());
parseText(ol,projPrefix+theTranslator->trModuleDocumentation());
ol.endIndexSection(isModuleDocumentation);
}
if (documentedNamespaces>0)
{
ol.startIndexSection(isNamespaceDocumentation);
parseText(ol,projPrefix+theTranslator->trNamespaceDocumentation());
ol.endIndexSection(isNamespaceDocumentation);
}
if (annotatedClasses>0)
{
ol.startIndexSection(isClassDocumentation);
parseDoc(ol,0,0,projPrefix+theTranslator->trClassDocumentation());
parseText(ol,projPrefix+theTranslator->trClassDocumentation());
ol.endIndexSection(isClassDocumentation);
}
if (documentedFiles>0)
{
ol.startIndexSection(isFileDocumentation);
parseDoc(ol,0,0,projPrefix+theTranslator->trFileDocumentation());
parseText(ol,projPrefix+theTranslator->trFileDocumentation());
ol.endIndexSection(isFileDocumentation);
}
if (exampleList.count()>0)
{
ol.startIndexSection(isExampleDocumentation);
parseDoc(ol,0,0,projPrefix+theTranslator->trExampleDocumentation());
parseText(ol,projPrefix+theTranslator->trExampleDocumentation());
ol.endIndexSection(isExampleDocumentation);
}
if (pageList.count()>0)
{
ol.startIndexSection(isPageDocumentation);
parseDoc(ol,0,0,projPrefix+theTranslator->trPageDocumentation());
parseText(ol,projPrefix+theTranslator->trPageDocumentation());
ol.endIndexSection(isPageDocumentation);
}
ol.endIndexSection(isEndIndex);
......
......@@ -25,10 +25,12 @@ enum IndexSections
isTitlePageStart,
isTitlePageAuthor,
isModuleIndex,
isNamespaceIndex,
isClassHierarchyIndex,
isCompoundIndex,
isFileIndex,
isModuleDocumentation,
isNamespaceDocumentation,
isClassDocumentation,
isFileDocumentation,
isExampleDocumentation,
......@@ -50,16 +52,18 @@ void writeHeaderIndex(OutputList &ol);
void writeHeaderFileList(OutputList &ol);
void writeExampleIndex(OutputList &ol);
void writePageIndex(OutputList &ol);
void writeFunctionIndex(OutputList &ol);
void writeFileMemberIndex(OutputList &ol);
void writeGroupIndex(OutputList &ol);
void writeNamespaceIndex(OutputList &ol);
void writeNamespaceMemberIndex(OutputList &ol);
int countClassHierarchy();
int countMemberList();
int countFunctionList();
int countFileList();
int countGroupList();
int countNamespaceList();
int countClassMembers();
int countFileMembers();
int countFiles();
int countGroups();
int countNamespaces();
int countAnnotatedClasses();
int countNamespaceMembers();
#endif
......@@ -172,6 +172,10 @@ void LatexGenerator::startIndexSection(IndexSections is)
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Module Index}\n"
break;
case isNamespaceIndex:
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Namespace Index}\"
break;
case isClassHierarchyIndex:
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Hierarchical Index}\n"
......@@ -200,17 +204,28 @@ void LatexGenerator::startIndexSection(IndexSections is)
}
}
break;
case isNamespaceDocumentation:
{
NamespaceDef *nd=namespaceList.first();
bool found=FALSE;
while (nd && !found)
{
if (nd->hasDocumentation())
{
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; // Namespace Documentation}\n":
found=TRUE;
}
nd=namespaceList.next();
}
}
break;
case isClassDocumentation:
{
ClassDef *cd=classList.first();
bool found=FALSE;
while (cd && !found)
{
//if (cd->classFile()[0]!='@' && !cd->getReference() &&
// (cd->hasDocumentation() || !hideClassFlag) &&
// (cd->protection()!=Private || extractPrivateFlag)
// )
if (!cd->isReference() && cd->isVisible())
{
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
......@@ -282,6 +297,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
case isModuleIndex:
t << "}\n\\input{modules}\n";
break;
case isNamespaceIndex:
t << "}\n\\input{namespaces}\n";
break;
case isClassHierarchyIndex:
t << "}\n\\input{hierarchy}\n";
break;
......@@ -299,7 +317,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
if (gd->hasDocumentation() || gd->countMembers()>0)
{
t << "}\n\\input{" << gd->groupFile() << "}\n";
t << "}\n\\input{" << gd->getOutputFileBase() << "}\n";
found=TRUE;
}
gd=groupList.next();
......@@ -309,12 +327,36 @@ void LatexGenerator::endIndexSection(IndexSections is)
if (gd->hasDocumentation() || gd->countMembers()>0)
{
if (compactLatexFlag) t << "\\input"; else t << "\\include";
t << "{" << gd->groupFile() << "}\n";
t << "{" << gd->getOutputFileBase() << "}\n";
}
gd=groupList.next();
}
}
break;
case isNamespaceDocumentation:
{
NamespaceDef *nd=namespaceList.first();
bool found=FALSE;
while (nd && !found)
{
if (nd->hasDocumentation() || nd->countMembers()>0)
{
t << "}\n\\input{" << nd->getOutputFileBase() << "}\n";
found=TRUE;
}
nd=namespaceList.next();
}
while (nd)
{
if (nd->hasDocumentation() || nd->countMembers()>0)
{
if (compactLatexFlag) t << "\\input"; else t << "\\include";
t << "{" << nd->getOutputFileBase() << "}\n";
}
nd=namespaceList.next();
}
}
break;
case isClassDocumentation:
{
ClassDef *cd=classList.first();
......@@ -327,7 +369,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
// )
if (!cd->isReference() && cd->isVisible())
{
t << "}\n\\input{" << cd->classFile() << "}\n";
t << "}\n\\input{" << cd->getOutputFileBase() << "}\n";
found=TRUE;
}
cd=classList.next();
......@@ -341,7 +383,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
if (!cd->isReference() && cd->isVisible())
{
if (compactLatexFlag) t << "\\input"; else t << "\\include";
t << "{" << cd->classFile() << "}\n";
t << "{" << cd->getOutputFileBase() << "}\n";
}
cd=classList.next();
}
......@@ -360,13 +402,13 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
if (isFirst)
{
t << "}\n\\input{" << fd->diskName() << "}\n";
t << "}\n\\input{" << fd->getOutputFileBase() << "}\n";
isFirst=FALSE;
}
else
{
if (compactLatexFlag) t << "\\input" ; else t << "\\include";
t << "{" << fd->diskName() << "}\n";
t << "{" << fd->getOutputFileBase() << "}\n";
}
}
fd=fn->next();
......@@ -670,6 +712,11 @@ void LatexGenerator::writeDoxyAnchor(const char *clname,const char *anchor,const
t << "}" << endl;
}
void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor)
{
writeDoxyAnchor(clName,anchor,0);
}
void LatexGenerator::addToIndex(const char *s1,const char *s2)
{
if (s1)
......@@ -709,6 +756,15 @@ void LatexGenerator::writeSectionRefItem(const char *,const char *lab,
t << "}{\\ref{" << lab << "}}" << endl;
}
void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab,
const char *title)
{
startBold();
docify(title);
endBold();
t << " (p. \\pageref{" << lab << "})" << endl;
}
//void LatexGenerator::docify(const char *str)
//{
// docifyStatic(t,str);
......
......@@ -79,17 +79,20 @@ class LatexGenerator : public OutputGenerator
void endGroupHeader();
void writeListItem() { t << "\\item " << endl; }
void startMemberSections() {}
void endMemberSections() {}
void startMemberHeader() { startGroupHeader(); }
void endMemberHeader() { endGroupHeader(); }
void startMemberList() { t << "\\begin{CompactItemize}" << endl; }
void endMemberList() { t << "\\end{CompactItemize}" << endl; }
void startMemberItem() { t << "\\item " << endl; }
void endMemberItem() { t << endl; }
void insertMemberAlign() {}
void writeRuler() { t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}"; }
void writeAnchor(const char *) {}
void writeAnchor(const char *name) { t << "\\label{" << name << "}" << endl; }
void startCodeFragment() { t << "\\small\\begin{verbatim}"; }
void endCodeFragment() { t << "\\end{verbatim}\\normalsize "; }
void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; }
void writeBoldString(const char *text)
{ t << "{\\bf "; docify(text); t << "}"; }
void startEmphasis() { t << "{\\em "; }
......@@ -99,13 +102,14 @@ class LatexGenerator : public OutputGenerator
void startDescription() { t << "\\begin{description}" << endl; }
void endDescription() { t << "\\end{description}" << endl; }
void startDescItem() { t << "\\item["; }
void endDescItem() { t << "]"; }
void endDescItem() { t << "]" << endl; }
void lineBreak() { t << "\\par\n"; }
void startMemberDoc(const char *,const char *,const char *);
void endMemberDoc() { t << "}"; }
void writeDoxyAnchor(const char *,const char *,const char *);
void writeChar(char c);
void writeLatexSpacing() { t << "\\hspace{0.3cm}"; }
void writeLatexLabel(const char *scope,const char *anchor);
void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *name);
......@@ -148,11 +152,12 @@ class LatexGenerator : public OutputGenerator
void endMemberDescription() { t << "\\item\\end{CompactList}"; }
void startDescList() { t << "\\begin{Desc}\\item["; }
void endDescTitle() { t << "]"; }
void writeDescItem() { t << "\\par "; }
void writeDescItem() { t << "\\par" << endl; }
void endDescList() { t << "\\end{Desc}"; }
void writeSection(const char *,const char *,bool);
void writeSectionRef(const char *,const char *,const char *);
void writeSectionRefItem(const char *,const char *,const char *);
void writeSectionRefAnchor(const char *,const char *,const char *);
void addToIndex(const char *,const char *);
void startIndent() {}
void endIndent() {}
......
......@@ -78,7 +78,7 @@ void ManGenerator::startFile(const char *name,const char *,bool)
{
fileName=fileName.left(i);
}
if (fileName.right(2)!=".3") fileName+=".3";
if (fileName.right(2)!=manExtension) fileName+=manExtension;
startPlainFile(fileName);
firstCol=TRUE;
}
......
......@@ -77,8 +77,11 @@ class ManGenerator : public OutputGenerator
void endTypewriter() { t << "\\fR"; firstCol=FALSE; }
void startGroupHeader();
void endGroupHeader();
void startMemberSections() {}
void endMemberSections() {}
void startMemberHeader();
void endMemberHeader();
void insertMemberAlign() {}
void writeListItem();
void startMemberList() { t << "\n.in +1c"; firstCol=FALSE; }
void endMemberList() { t << "\n.in -1c"; firstCol=FALSE; }
......@@ -107,6 +110,7 @@ class ManGenerator : public OutputGenerator
void endMemberDoc() {}
void writeDoxyAnchor(const char *clName,const char *anchor,const char *name);
void writeLatexSpacing() {}
void writeLatexLabel(const char *,const char *) {}
void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *) { t << endl; firstCol=TRUE; }
......@@ -144,6 +148,7 @@ class ManGenerator : public OutputGenerator
void writeSection(const char *,const char *,bool) {}
void writeSectionRef(const char *,const char *,const char *) {}
void writeSectionRefItem(const char *,const char *,const char *) {}
void writeSectionRefAnchor(const char *,const char *,const char *) {}
void addToIndex(const char *,const char *) {}
void startIndent() {}
void endIndent() {}
......
......@@ -20,6 +20,7 @@
#include "membername.h"
#include "doxygen.h"
#include "util.h"
#include "message.h"
/*! Creates a new member definition.
* Members can be function/variables/enums/etc. inside a class or inside a
......@@ -159,7 +160,7 @@ bool MemberDef::hasExamples()
return exampleList->count()>0;
}
#if 0
void MemberDef::writeExample(OutputList &ol)
{
Example *e=exampleList->first();
......@@ -177,4 +178,27 @@ void MemberDef::writeExample(OutputList &ol)
}
ol.writeString(".");
}
#endif
QString MemberDef::getOutputFileBase() const
{
if (classDef)
{
return classDef->getOutputFileBase();
}
else if (fileDef)
{
return fileDef->getOutputFileBase();
}
else if (fileDec)
{
return fileDec->getOutputFileBase();
}
else if (nspace)
{
return nspace->getOutputFileBase();
}
warn("Warning: Internal inconsistency: member %s does not belong to any\n"
" container!\n",name().data());
return "dummy";
}
......@@ -55,6 +55,7 @@ class MemberDef : public Definition
const ArgumentList *al);
~MemberDef();
QString getOutputFileBase() const;
const char *declaration() const { return decl; }
const char *definition() const { return def; }
const char *typeString() const { return type; }
......@@ -72,6 +73,7 @@ class MemberDef : public Definition
void setFileDef(FileDef *fd) { fileDef=fd; }
void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { ref=a; }
void setProtection(Protection p) { prot=p; }
FileDef *getFileDef() { return fileDef; }
FileDef *getFileDec() { return fileDec; }
void setMemberClass(ClassDef *cd) { classDef=cd; }
......@@ -105,8 +107,9 @@ class MemberDef : public Definition
// example related members
bool addExample(const char *anchor,const char *name,const char *file);
void writeExample(OutputList &ol);
//void writeExample(OutputList &ol);
bool hasExamples();
ExampleList *getExampleList() const { return exampleList; }
// prototype related members
const char *getDefFile() { return defFile; }
......
......@@ -43,7 +43,10 @@ void MemberList::countDecMembers()
if ((!hideMemberFlag || md->hasDocumentation()) &&
(!hideMemberFlag || !md->documentation().isEmpty() ||
briefMemDescFlag || repeatBriefFlag
) || extractAllFlag
) || extractAllFlag ||
(md->isEnumerate() &&
md->hasDocumentedEnumValues()
)
)
{
switch(md->memberType())
......
......@@ -22,12 +22,14 @@
#include "classdef.h"
#include "classlist.h"
#include "memberlist.h"
#include "doxygen.h"
NamespaceDef::NamespaceDef(const char *name) : Definition(name)
NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
{
fileName="namespace_"+nameToFile(name);
classList = new ClassList;
memList = new MemberList;
reference=ref;
}
NamespaceDef::~NamespaceDef()
......@@ -61,18 +63,21 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
QString pageTitle=name()+" Namespace Reference";
startFile(ol,fileName,pageTitle);
startTitle(ol);
ol.docify(pageTitle);
//ol.docify(pageTitle);
parseText(ol,theTranslator->trNamespaceReference(name()));
endTitle(ol,name());
if (genTagFile.length()>0) tagFile << "%" << name() << ":\n";
OutputList briefOutput(&ol);
if (briefDescription())
{
parseDoc(briefOutput,0,0,briefDescription());
parseDoc(briefOutput,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(0,"details");
parseDoc(ol,0,0,theTranslator->trMore());
ol.startTextLink(0,"_details");
parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.enableAll();
}
......@@ -81,6 +86,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
ol.enable(OutputGenerator::Man);
ol.writeSynopsis();
ol.startMemberSections();
if (classList->count()>0)
{
ClassDef *cd=classList->first();
......@@ -92,7 +98,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
if (!found)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trCompounds());
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
......@@ -111,13 +117,14 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
case ClassDef::Union: ol.writeString("union"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (cd->hasDocumentation())
{
ol.writeObjectLink(cd->getReference(),
cd->classFile(),
0,
clName
);
cd->getOutputFileBase(),
0,
clName
);
}
else
{
......@@ -133,13 +140,17 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
}
writeMemberDecs(ol,0,this,0,0,0,memList);
ol.endMemberSections();
if (!briefDescription().isEmpty() || !documentation().isEmpty())
{
ol.writeRuler();
ol.writeAnchor("details");
bool latexOn = ol.isEnabled(OutputGenerator::Latex);
if (latexOn) ol.disable(OutputGenerator::Latex);
ol.writeAnchor("_details");
if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trDetailedDescription());
parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
if (!briefDescription().isEmpty())
{
......@@ -148,7 +159,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
}
if (!documentation().isEmpty())
{
parseDoc(ol,0,0,documentation()+"\n");
parseDoc(ol,name(),0,documentation()+"\n");
ol.newParagraph();
}
}
......@@ -159,7 +170,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trFunctionPrototypeDocumentation());
parseText(ol,theTranslator->trFunctionPrototypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Prototype);
}
......@@ -168,7 +179,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trTypedefDocumentation());
parseText(ol,theTranslator->trTypedefDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Typedef);
}
......@@ -177,7 +188,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trEnumerationTypeDocumentation());
parseText(ol,theTranslator->trEnumerationTypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Enumeration);
}
......@@ -186,7 +197,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trEnumerationValueDocumentation());
parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::EnumValue);
}
......@@ -195,7 +206,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trFunctionDocumentation());
parseText(ol,theTranslator->trFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Function);
}
......@@ -204,7 +215,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trVariableDocumentation());
parseText(ol,theTranslator->trVariableDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Variable);
}
......@@ -212,9 +223,15 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
// write Author section (Man only)
ol.disableAllBut(OutputGenerator::Man);
ol.startGroupHeader();
parseDoc(ol,0,0,theTranslator->trAuthor());
parseText(ol,theTranslator->trAuthor());
ol.endGroupHeader();
parseDoc(ol,0,0,theTranslator->trGeneratedAutomatically(projectName));
parseText(ol,theTranslator->trGeneratedAutomatically(projectName));
ol.enableAll();
endFile(ol);
}
int NamespaceDef::countMembers()
{
memList->countDocMembers();
return memList->totalCount()+classList->count();
}
......@@ -31,16 +31,20 @@ class MemberDef;
class NamespaceDef : public Definition
{
public:
NamespaceDef(const char *name);
NamespaceDef(const char *name,const char *ref=0);
~NamespaceDef();
QString namespaceFile() const { return fileName; }
//QString namespaceFile() const { return fileName; }
QString getOutputFileBase() const { return fileName; }
void insertUsedFile(const char *fname);
void writeDocumentation(OutputList &ol);
void insertClass(ClassDef *cd);
void insertMember(MemberDef *md);
void computeAnchors();
int countMembers();
const char *getReference() { return reference; }
private:
QString reference;
QString fileName;
QStrList files;
ClassList *classList;
......
......@@ -84,12 +84,15 @@ class OutputGenerator
virtual void endGroupHeader() = 0;
virtual void writeListItem() = 0;
virtual void startMemberSections() = 0;
virtual void endMemberSections() = 0;
virtual void startMemberHeader() = 0;
virtual void endMemberHeader() = 0;
virtual void startMemberList() = 0;
virtual void endMemberList() = 0;
virtual void startMemberItem() = 0;
virtual void endMemberItem() = 0;
virtual void insertMemberAlign() = 0;
virtual void writeRuler() = 0;
virtual void writeAnchor(const char *name) = 0;
......@@ -103,6 +106,7 @@ class OutputGenerator
virtual void endMemberDoc() = 0;
virtual void writeDoxyAnchor(const char *clName,const char *anchor,const char *name) = 0;
virtual void writeLatexSpacing() = 0;
virtual void writeLatexLabel(const char *clName,const char *anchor) = 0;
virtual void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name) = 0;
virtual void writeEndAnnoItem(const char *name) = 0;
......@@ -144,6 +148,7 @@ class OutputGenerator
virtual void writeSection(const char *,const char *,bool) = 0;
virtual void writeSectionRef(const char *,const char *,const char *) = 0;
virtual void writeSectionRefItem(const char *,const char *,const char *) = 0;
virtual void writeSectionRefAnchor(const char *,const char *,const char *) = 0;
virtual void lineBreak() = 0;
virtual void addToIndex(const char *s1,const char *s2) = 0;
virtual void startIndent() = 0;
......
......@@ -129,6 +129,10 @@ class OutputList
{ forall(&OutputGenerator::endGroupHeader); }
void writeListItem()
{ forall(&OutputGenerator::writeListItem); }
void startMemberSections()
{ forall(&OutputGenerator::startMemberSections); }
void endMemberSections()
{ forall(&OutputGenerator::endMemberSections); }
void startMemberHeader()
{ forall(&OutputGenerator::startMemberHeader); }
void endMemberHeader()
......@@ -141,6 +145,8 @@ class OutputList
{ forall(&OutputGenerator::startMemberItem); }
void endMemberItem()
{ forall(&OutputGenerator::endMemberItem); }
void insertMemberAlign()
{ forall(&OutputGenerator::insertMemberAlign); }
void writeRuler()
{ forall(&OutputGenerator::writeRuler); }
void writeAnchor(const char *name)
......@@ -165,6 +171,8 @@ class OutputList
{ forall(&OutputGenerator::writeDoxyAnchor,clName,anchor,name); }
void writeLatexSpacing()
{ forall(&OutputGenerator::writeLatexSpacing); }
void writeLatexLabel(const char *scope,const char *anchor)
{ forall(&OutputGenerator::writeLatexLabel,scope,anchor); }
void startDescription()
{ forall(&OutputGenerator::startDescription); }
void endDescription()
......@@ -251,6 +259,8 @@ class OutputList
{ forall(&OutputGenerator::writeSectionRef,page,lab,title); }
void writeSectionRefItem(const char *page,const char *lab, const char *title)
{ forall(&OutputGenerator::writeSectionRefItem,page,lab,title); }
void writeSectionRefAnchor(const char *page,const char *lab, const char *title)
{ forall(&OutputGenerator::writeSectionRefAnchor,page,lab,title); }
void addToIndex(const char *s1,const char *s2)
{ forall(&OutputGenerator::addToIndex,s1,s2); }
void writeSynopsis()
......
......@@ -1160,11 +1160,11 @@ BN [ \t\r\n]
<SkipCommand>.
<SkipLine>[^/\n]+
<SkipLine>.
<SkipLine>"//" {
<SkipLine,SkipCommand,SkipCPPBlock>"//" {
lastCPPContext=YY_START;
BEGIN(RemoveCPPComment);
}
<SkipLine>"/*" {
<SkipLine,SkipCommand,SkipCPPBlock>"/*" {
lastCContext=YY_START;
BEGIN(RemoveCComment);
}
......
......@@ -31,4 +31,5 @@ extern void parseDoc(OutputList &ol,const char *clName, const char *memName,
const QString &docString);
extern void parseExample(OutputList &ol,const QString &docString,
const char *fileName);
extern void parseText(OutputList &ol,const QString &txtString);
#endif
......@@ -76,6 +76,7 @@ static int lastCodeState;
static int lastAfterDocContext;
static int lastGroupContext;
static int lastFormulaContext;
static int lastAnchorContext;
static int nextDefContext;
static Protection protection;
static Protection baseProt;
......@@ -120,7 +121,8 @@ static char afterDocTerminator;
static int tmpDocType;
static QString sectionLabel;
static QString sectionTitle;
static bool isSubsection;
static SectionInfo::SectionType
sectionType;
static QString funcPtrType;
static QString templateStr;
static QString baseName;
......@@ -184,7 +186,6 @@ static void initParser()
inParBlock = FALSE;
firstSeeArg = FALSE;
javaDocSee = FALSE;
isSubsection = FALSE;
}
//-----------------------------------------------------------------------------
......@@ -532,12 +533,19 @@ static void addSection()
{
//printf("New section pageName=%s label=%s title=%s\n",
// current->name.data(),sectionLabel.data(),sectionTitle.data());
SectionInfo *si=new SectionInfo(current->name,
sectionLabel,sectionTitle,isSubsection);
sectionDict.insert(sectionLabel,si);
if (sectionLabel.isEmpty()) return;
if (sectionDict[sectionLabel]==0)
{
SectionInfo *si=new SectionInfo(sectionLabel,sectionTitle,sectionType);
sectionDict.insert(sectionLabel,si);
current->anchors->append(new QString(sectionLabel));
}
else
{
warn("Warning: Duplicate label %s found!\n",sectionLabel.data());
}
}
// Adds a formula text to the list/dictionary of formulas if it was
// not already added. Returns the label of the formula.
static QString addFormula()
......@@ -710,6 +718,7 @@ VAR [vV][aA][rR]
%x MemberSpec
%x MemberSpecSkip
%x SkipVerbatim
%x Text
%x DocScan
%x DocParam
%x DocException
......@@ -742,6 +751,8 @@ VAR [vV][aA][rR]
%x DocVerbInc
%x DocIndexWord
%x DocRef
%x DocRefArg
%x DocRefArgStart
%x DocRefItem
%x DocRefItemName
%x SectionLabel
......@@ -756,6 +767,7 @@ VAR [vV][aA][rR]
%x DocSkipHtmlComment
%x ReadFormulaShort
%x ReadFormulaLong
%x AnchorLabel
%%
......@@ -798,13 +810,13 @@ VAR [vV][aA][rR]
<DocScan>"<!--" { BEGIN(DocSkipHtmlComment); }
<DocSkipHtmlComment>"--"[!]?">" { BEGIN(DocScan); }
<DocSkipHtmlComment>.
<DocScan>"&copy;" { outDoc->writeCopyright(); }
<DocScan>"&quot;" { outDoc->writeQuote(); }
<DocScan>"&"[AEIOUYaeiouy]"uml;" { outDoc->writeUmlaut(yytext[1]); }
<DocScan>"&"[AEIOUYaeiouy]"acute;" { outDoc->writeAcute(yytext[1]); }
<DocScan>"&"[AEIOUaeiou]"grave;" { outDoc->writeGrave(yytext[1]); }
<DocScan>"&"[AEIOUaeiou]"circ;" { outDoc->writeCirc(yytext[1]); }
<DocScan>"&"[ANOano]"tilde;" { outDoc->writeTilde(yytext[1]); }
<DocScan,Text>"&copy;" { outDoc->writeCopyright(); }
<DocScan,Text>"&quot;" { outDoc->writeQuote(); }
<DocScan,Text>"&"[AEIOUYaeiouy]"uml;" { outDoc->writeUmlaut(yytext[1]); }
<DocScan,Text>"&"[AEIOUYaeiouy]"acute;" { outDoc->writeAcute(yytext[1]); }
<DocScan,Text>"&"[AEIOUaeiou]"grave;" { outDoc->writeGrave(yytext[1]); }
<DocScan,Text>"&"[AEIOUaeiou]"circ;" { outDoc->writeCirc(yytext[1]); }
<DocScan,Text>"&"[ANOano]"tilde;" { outDoc->writeTilde(yytext[1]); }
<DocScan,DocHtmlScan,DocLatexScan>"$("[a-z_A-Z]+")" {
QString envvar=&yytext[2];
envvar=envvar.left(envvar.length()-1);
......@@ -914,7 +926,7 @@ VAR [vV][aA][rR]
outDoc->writeFormula(formName,formula->getFormulaText());
}
}
<DocIndexWord>[^\n\t ]+ {
<DocIndexWord>[^\n]+ {
//printf("Adding %s to index\n",yytext);
outDoc->addToIndex(yytext,0);
BEGIN(DocScan);
......@@ -1124,7 +1136,7 @@ VAR [vV][aA][rR]
outDoc->docify(" - ");
BEGIN(DocScan);
}
<DocScan>("\\"|"@")"section "{ID}"\n" {
<DocScan>"\\section "{ID}"\n" {
QString secName=&yytext[9]; // skip "\section "
secName=secName.left(secName.length()-1); // remove \n
//printf("SectionName %s found\n",secName.data());
......@@ -1132,7 +1144,17 @@ VAR [vV][aA][rR]
if ((sec=sectionDict[secName]))
{
//printf("Title %s\n",sec->title.data());
outDoc->writeSection(sec->label,sec->title,sec->isSubsection);
outDoc->writeSection(sec->label,sec->title,
sec->type==SectionInfo::Subsection);
}
}
<DocScan>"\\anchor "{ID}"\n" {
QString secName=&yytext[8];
secName=secName.left(secName.length()-1);
SectionInfo *sec;
if ((sec=sectionDict[secName]))
{
outDoc->writeAnchor(sec->label);
}
}
<DocScan>"\\ref" {
......@@ -1146,7 +1168,19 @@ VAR [vV][aA][rR]
SectionInfo *sec;
if ((sec=sectionDict[ref]))
{
outDoc->writeSectionRef(sec->pageName,sec->label,sec->title);
QString text;
if (sec->title.isEmpty())
text=sec->label;
else
text=sec->title;
if (sec->type==SectionInfo::Anchor)
{
outDoc->writeSectionRefAnchor(sec->fileName,sec->label,text);
}
else
{
outDoc->writeSectionRef(sec->fileName,sec->label,text);
}
}
else
{
......@@ -1155,6 +1189,35 @@ VAR [vV][aA][rR]
}
BEGIN(DocScan);
}
<DocRefName>{ID}/{B}+"\"" {
sectionRef=yytext;
BEGIN(DocRefArgStart);
}
<DocRefArgStart>"\"" {
BEGIN(DocRefArg);
}
<DocRefArg>[^\"\n]+[\n\"] {
yytext[yyleng-1]='\0';
QString text=substitute(yytext,"\\\\","\\");
SectionInfo *sec;
if ((sec=sectionDict[sectionRef]))
{
if (sec->type==SectionInfo::Anchor)
{
outDoc->writeSectionRefAnchor(sec->fileName,sec->label,text);
}
else
{
outDoc->writeSectionRef(sec->fileName,sec->label,text);
}
}
else
{
warn("Warning: reference to unknown section %s!\n",sectionRef.data());
outDoc->writeBoldString("unknown reference!");
}
BEGIN(DocScan);
}
<DocRefItem>{ID} {
sectionRef=yytext;
BEGIN(DocRefItemName);
......@@ -1163,7 +1226,7 @@ VAR [vV][aA][rR]
SectionInfo *sec;
if ((sec=sectionDict[sectionRef]))
{
outDoc->writeSectionRefItem(sec->pageName,sec->label,yytext);
outDoc->writeSectionRefItem(sec->fileName,sec->label,yytext);
}
else
{
......@@ -1271,6 +1334,10 @@ VAR [vV][aA][rR]
<DocKeyEnd>("\\"|"@")"until"{BN}+ { BEGIN(DocUntilKey); }
<DocKeyEnd>("\\"|"@")"skipline"{BN}+ { BEGIN(DocSkiplineKey); }
<DocKeyEnd>\n
<DocKeyEnd><<EOF>> {
if (!firstLine) outDoc->endCodeFragment();
yyterminate();
}
<DocKeyEnd>. {
unput(*yytext);
if (!firstLine) outDoc->endCodeFragment();
......@@ -1462,7 +1529,7 @@ VAR [vV][aA][rR]
<DocScan>{BN}+ {
outDoc->writeChar(' ');
}
<DocCode,DocEmphasis,DocBold,DocScan>. {
<DocCode,DocEmphasis,DocBold,DocScan,Text>. {
outDoc->writeChar(*yytext);
}
<NextSemi>"{" { BEGIN(SkipBlock); }
......@@ -1472,6 +1539,9 @@ VAR [vV][aA][rR]
else
BEGIN( NextSemi ) ;
}
<NextSemi>"'"\\[0-7]{1,3}"'"
<NextSemi>"'"\\."'"
<NextSemi>"'"."'"
<NextSemi>\" {
lastStringContext=NextSemi;
BEGIN(SkipString);
......@@ -1556,6 +1626,9 @@ VAR [vV][aA][rR]
/*
<FindMembers>"inline"
*/
<FindMembers>{BN}+ {
lineCount();
}
<FindMembers>{B}*"static"{BN}+ { //current->type += " static ";
current->stat = TRUE;
lineCount();
......@@ -2081,8 +2154,8 @@ VAR [vV][aA][rR]
}
<MemberSpecSkip>"," { BEGIN(MemberSpec); }
<MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); }
<Curly>\n { current->program += yytext ;
yyLineNr++ ;
<Curly>{BN}+ { current->program += yytext ;
lineCount() ;
}
<Curly>. { current->program += yytext ; }
......@@ -2404,7 +2477,9 @@ VAR [vV][aA][rR]
//BEGIN( FindMembers ) ;
BEGIN( lastCurlyContext ) ;
}
<SkipCurly>\'.\'
<SkipCurly>"'"\\[0-7]{1,3}"'"
<SkipCurly>"'"\\."'"
<SkipCurly>"'"."'"
<SkipCurly>\" {
lastStringContext=SkipCurly;
BEGIN( SkipString );
......@@ -2538,15 +2613,16 @@ VAR [vV][aA][rR]
);
BEGIN( Curly ) ;
}
<Comment>\n { current->program += yytext ;
yyLineNr++ ;
<Comment>{BN}+ { current->program += yytext ;
lineCount() ;
}
<Comment>"/*" { current->program += yytext ; }
<Comment>"//" { current->program += yytext ; }
<Comment>. { current->program += *yytext ; }
<Comment>[^\n\*]+ { current->program += yytext ; }
<Comment>.*"*/" { current->program += yytext ;
BEGIN( Curly ) ;
}
<Comment>. { current->program += *yytext ; }
<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator>("//"{B}*)?"/*!" {
removeSlashes=(yytext[1]=='/');
......@@ -2596,7 +2672,7 @@ VAR [vV][aA][rR]
current->inside = current_root->name+"::";
BEGIN( LineDoc );
}
<FindMembers>"extern"{BN}+"\"C"("++")?"\""{BN}+("{")?
<FindMembers>"extern"{BN}+"\"C"("++")?"\""{BN}*("{")?
<FindMembers>"{" {
current->type.resize(0);
current->name.resize(0);
......@@ -2846,13 +2922,18 @@ VAR [vV][aA][rR]
current->doc+=yytext;
}
<PageDoc>("\\"|"@")"section"{B}+ {
isSubsection=FALSE;
sectionType=SectionInfo::Section;
BEGIN(SectionLabel);
}
<PageDoc>("\\"|"@")"subsection"{B}+ {
isSubsection=TRUE;
sectionType=SectionInfo::Subsection;
BEGIN(SectionLabel);
}
<Doc,PageDoc,JavaDoc,ClassDoc>("\\"|"@")anchor{B}+ {
lastAnchorContext = YY_START;
sectionType=SectionInfo::Anchor;
BEGIN(AnchorLabel);
}
<Doc,PageDoc,JavaDoc,ClassDoc>"\\\\verbatim"/[^a-z_A-Z0-9] {
current->doc+="\\\\verbatim";
}
......@@ -2861,6 +2942,9 @@ VAR [vV][aA][rR]
current->doc+="\\verbatim";
BEGIN(SkipVerbatim);
}
<Doc,PageDoc,JavaDoc,ClassDoc>"\\addindex"{B}+[^\n]+ {
current->doc+=yytext;
}
<Doc,PageDoc,JavaDoc,ClassDoc>"\\\\code"/[^a-z_A-Z0-9] {
current->doc+="\\\\code";
}
......@@ -2928,7 +3012,13 @@ VAR [vV][aA][rR]
<SkipCode>. {
current->doc+=*yytext;
}
<SectionLabel>[a-z_A-Z0-9]+ {
<AnchorLabel>{ID} {
sectionLabel=yytext;
addSection();
current->doc += "\\anchor "+sectionLabel+"\n";
BEGIN(lastAnchorContext);
}
<SectionLabel>{ID} {
sectionLabel=yytext;
sectionTitle.resize(0);
BEGIN(SectionTitle);
......@@ -3220,15 +3310,18 @@ void scanString(const char *s)
{
const char *oldInputString = inputString;
int oldInputPosition = inputPosition;
int oldRule = YY_START;
YY_BUFFER_STATE oldBuffer = YY_CURRENT_BUFFER;
yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE));
inputString = s;
inputPosition = 0;
BEGIN( Text );
scanYYlex();
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_switch_to_buffer(oldBuffer);
inputString = oldInputString;
inputPosition = oldInputPosition;
BEGIN( oldRule );
}
//----------------------------------------------------------------------------
......@@ -3308,6 +3401,7 @@ void parseMain(Entry *rt)
global_root = rt;
current = new Entry;
inputString = rt->program;
//printf("parseDoc=`%s'\n",inputString);
inputPosition = 0;
ifCount=0;
scanYYrestart( scanYYin );
......@@ -3367,6 +3461,21 @@ void parseDoc(OutputList &ol,const char *clName,
//----------------------------------------------------------------------------
void parseText(OutputList &ol,const QString &txtString)
{
inputString = txtString;
outDoc = new OutputList(&ol);
inputPosition = 0;
scanYYrestart( scanYYin );
BEGIN( Text );
scanYYlex();
ol+=*outDoc;
delete outDoc;
return;
}
//----------------------------------------------------------------------------
void parseExample(OutputList &ol,const QString &docString,
const char *fileName)
{
......
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-1999 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
* granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
* All output generated with Doxygen is not covered by this license.
*
*/
#ifndef SECTION_H
#define SECTION_H
#include <qlist.h>
#include <qdict.h>
#include <qstring.h>
class Definition;
struct SectionInfo
{
enum SectionType { Section, Subsection, Anchor };
SectionInfo(const char *l,const char *t,SectionType st)
{ label=l; title=t; type=st; definition=0; }
QString fileName;
QString label;
QString title;
SectionType type;
Definition *definition;
};
class SectionList : public QList<SectionInfo>
{
};
class SectionDict : public QDict<SectionInfo>
{
public:
SectionDict(int size) : QDict<SectionInfo>(size) {}
};
#endif
......@@ -25,6 +25,7 @@
#include "classdef.h"
#include "filedef.h"
#include "namespacedef.h"
#include "memberdef.h"
#include "doxygen.h"
#include "util.h"
......@@ -36,12 +37,14 @@
static int yyLineNr;
static QString className;
static QString fileName;
static QString namespaceName;
static QString tagName;
static QString memberName;
static QString anchorName;
static QString argString;
static ClassDef *cd;
static FileDef *fd;
static NamespaceDef *nd;
static void addClass(const char *name,const char *fileName)
{
......@@ -50,6 +53,7 @@ static void addClass(const char *name,const char *fileName)
{
cd = new ClassDef(name,ClassDef::Class,tagName,fileName);
fd = 0;
nd = 0;
classList.inSort(cd);
classDict.insert(className,cd);
}
......@@ -72,10 +76,27 @@ static void addFile(const char *name)
inputNameDict.insert(name,mn);
}
cd = 0;
nd = 0;
//fileList.inSort(fd);
//fileDict.insert(fileName,fd);
}
static void addNamespace(const char *name)
{
if ((nd=namespaceDict[name])==0)
{
// TODO: we assume that each namespace is limited to a single tagfile.
// since namespace are open, this need not to be the case. As a result
// namespace may contain members that are located in
// different namespaces!
nd = new NamespaceDef(name,tagName);
namespaceList.inSort(nd);
namespaceDict.insert(name,nd);
}
cd = 0;
fd = 0;
}
static void addMember(const char *name,const char *anchor,const char *args)
{
//printf("adding member %s\n",name);
......@@ -87,21 +108,24 @@ static void addMember(const char *name,const char *anchor,const char *args)
md=new MemberDef(0,name,args,0,Public,Normal,FALSE,FALSE,
MemberDef::Function,0,0);
md->setReference(anchor);
if (cd)
if (cd) // member of a class
{
//md=new MemberDef(cd,name,args,anchor,tagName);
md->setMemberClass(cd);
cd->insertMember(md);
//printf("Adding member %s %s to class\n",name,args);
mnd=&memberNameDict;
mnl=&memberNameList;
}
else
else if (nd) // member of a namespace
{
md->setNamespace(nd);
nd->insertMember(md);
mnd=&functionNameDict;
mnl=&functionNameList;
}
else // member of a file
{
//md=new MemberDef(&unrelatedClass,name,args,anchor,tagName);
md->setFileDef(fd);
fd->insertMember(md);
//printf("Adding global member %s %s\n",name,args);
mnd=&functionNameDict;
mnl=&functionNameList;
}
......@@ -130,6 +154,7 @@ static void addMember(const char *name,const char *anchor,const char *args)
ID [a-z_A-Z][a-z_A-Z0-9]*
FILE [a-z_A-Z0-9\.\-\+\:\\\/]+
SCOPE ({ID}"::")*{ID}
%x Pass1
%x Pass2
......@@ -139,18 +164,22 @@ FILE [a-z_A-Z0-9\.\-\+\:\\\/]+
%x ClassName1
%x ClassName2
%x FileName
%x NamespaceName
%x BaseClasses
%x ClassFile1
%x ClassFile2
%%
<Pass1>^">" {
<Pass1>^">" { // start of a class
BEGIN(ClassName1);
}
<Pass1>^"&" {
<Pass1>^"&" { // start of a file
BEGIN(FileName);
}
<Pass1>^"%" { // start of a namespace
BEGIN(NamespaceName);
}
<Pass1>^[~a-z_A-Z][^ \n]*/" " {
memberName=yytext;
BEGIN(AnchorName);
......@@ -175,7 +204,12 @@ FILE [a-z_A-Z0-9\.\-\+\:\\\/]+
addFile(yytext);
BEGIN(Pass1);
}
<ClassName1>{ID}/":" {
<NamespaceName>{SCOPE}/":" {
namespaceName=yytext;
addNamespace(yytext);
BEGIN(Pass1);
}
<ClassName1>{SCOPE}/":" {
className=yytext;
BEGIN(ClassFile1);
}
......
......@@ -18,32 +18,67 @@
#define TRANSLATOR_H
#include <qstring.h>
#include "classdef.h"
#include "util.h"
class Translator
{
public:
virtual QString latexBabelPackage()
{ return ""; }
virtual QString trInherits()
//--------------------------------------------------------------------
// NOTICE:
// the following functions are now obsolete: these are no longer used and
// will disappear in future versions. You do not have to translate them!
virtual QString trInherits()
{ return "Inherits"; }
virtual QString trAnd()
virtual QString trAnd()
{ return "and"; }
virtual QString trInheritedBy()
virtual QString trInheritedBy()
{ return "Inherited By"; }
virtual QString trReference()
{ return "Reference"; }
virtual QString trReimplementedFrom()
{ return "Reimplemented from"; }
virtual QString trReimplementedIn()
{ return "Reimplemented in"; }
virtual QString trIncludeFile()
{ return "Include File"; }
virtual QString trNamespaces()
{ return "Namespace List"; }
// end of obsolete functions
//--------------------------------------------------------------------
virtual QString latexBabelPackage()
// returns the name of the package that is included by LaTeX
{ return ""; }
virtual QString trRelatedFunctions()
// used in the compound documentation before a list of related functions.
{ return "Related Functions"; }
virtual QString trRelatedSubscript()
// subscript for the related functions.
{ return "(Note that these are not member functions.)"; }
virtual QString trDetailedDescription()
// header that is put before the detailed description of files, classes and namespaces.
{ return "Detailed Description"; }
virtual QString trMemberTypedefDocumentation()
// header that is put before the list of typedefs.
{ return "Member Typedef Documentation"; }
virtual QString trMemberEnumerationDocumentation()
// header that is put before the list of enumerations.
{ return "Member Enumeration Documentation"; }
virtual QString trMemberFunctionDocumentation()
// header that is put before the list of member functions.
{ return "Member Function Documentation"; }
virtual QString trMemberDataDocumentation()
// header that is put before the list of member attributes.
{ return "Member Data Documentation"; }
virtual QString trGeneratedFrom(const char *s,bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
......@@ -52,62 +87,92 @@ class Translator
if (single) result+=":"; else result+="s:";
return result;
}
virtual QString trMore()
virtual QString trMore()
// this is the text of a link put after brief descriptions.
{ return "More..."; }
virtual QString trReference()
{ return "Reference"; }
virtual QString trListOfAllMembers()
// put in the class documentation
{ return "List of all members."; }
virtual QString trMemberList()
// used as the title of the "list of all members" page of a class
{ return "Member List"; }
virtual QString trThisIsTheListOfAllMembers()
{ return "This is the complete list of members for"; }
// this is the first part of a sentence that is followed by a class name
{ return "This is the complete list of members for "; }
virtual QString trIncludingInheritedMembers()
{ return "including all inherited members."; }
// this is the remainder of the sentence after the class name
{ return ", including all inherited members."; }
virtual QString trGeneratedAutomatically(const char *s)
// this is put at the author sections at the bottom of man pages.
// parameter s is name of the project name.
{ QString result="Generated automatically by Doxygen";
if (s) result+=(QString)" for "+s;
result+=" from the source code.";
return result;
}
virtual QString trEnumName()
// put after an enum name in the list of all members
{ return "enum name"; }
virtual QString trEnumValue()
// put after an enum value in the list of all members
{ return "enum value"; }
virtual QString trDefinedIn()
// put after an undocumented member in the list of all members
{ return "defined in"; }
virtual QString trIncludeFile()
{ return "Include File"; }
virtual QString trVerbatimText(const char *f)
// put as in introduction in the verbatim header file of a class.
// parameter f is the name of the include file.
{ return (QString)"This is the verbatim text of the "+f+" include file."; }
// quick reference sections
virtual QString trModules()
// This is put above each page as a link to the list of all groups of
// compounds or files (see the \group command).
{ return "Modules"; }
virtual QString trClassHierarchy()
// This is put above each page as a link to the class hierarchy
{ return "Class Hierarchy"; }
virtual QString trCompoundList()
// This is put above each page as a link to the list of annotated classes
{ return "Compound List"; }
virtual QString trFileList()
// This is put above each page as a link to the list of documented files
{ return "File List"; }
virtual QString trHeaderFiles()
// This is put above each page as a link to the list of all verbatim headers
{ return "Header Files"; }
virtual QString trCompoundMembers()
// This is put above each page as a link to all members of compounds.
{ return "Compound Members"; }
virtual QString trFileMembers()
// This is put above each page as a link to all members of files.
{ return "File Members"; }
virtual QString trRelatedPages()
// This is put above each page as a link to all related pages.
{ return "Related Pages"; }
virtual QString trExamples()
// This is put above each page as a link to all examples.
{ return "Examples"; }
virtual QString trSearch()
// This is put above each page as a link to the search engine.
{ return "Search"; }
virtual QString trClassHierarchyDescription()
// This is an introduction to the class hierarchy.
{ return "This inheritance list is sorted roughly, "
"but not completely, alphabetically:";
}
virtual QString trFileListDescription(bool extractAll)
// This is an introduction to the list with all files.
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
......@@ -115,10 +180,12 @@ class Translator
return result;
}
virtual QString trCompoundListDescription()
// This is an introduction to the annotated compound list
{ return "Here are the classes, structs and "
"unions with brief descriptions:";
}
virtual QString trCompoundMembersDescription(bool extractAll)
// This is an introduction to the page with all class members
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
......@@ -130,6 +197,7 @@ class Translator
return result;
}
virtual QString trFileMembersDescription(bool extractAll)
// This is an introduction to the page with all file members
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
......@@ -141,76 +209,134 @@ class Translator
return result;
}
virtual QString trHeaderFilesDescription()
// This is an introduction to the page with the list of all header files
{ return "Here are the header files that make up the API:"; }
virtual QString trExamplesDescription()
// This is an introduction to the page with the list of all examples
{ return "Here is a list of all examples:"; }
virtual QString trRelatedPagesDescription()
// This is an introduction to the page with the list of related pages
{ return "Here is a list of all related documentation pages:"; }
virtual QString trModulesDescription()
// This is an introduction to the page with the list of class/file groups
{ return "Here is a list of all modules:"; }
virtual QString trNoDescriptionAvailable()
// This sentences is used in the annotated class/file lists if no brief
// description is given.
{ return "No description available"; }
// index titles (the project name is prepended for these)
virtual QString trDocumentation()
// This is used in HTML as the title of index.html.
{ return "Documentation"; }
virtual QString trModuleIndex()
// This is used in LaTeX as the title of the chapter with the
// index of all groups.
{ return "Module Index"; }
virtual QString trHierarchicalIndex()
// This is used in LaTeX as the title of the chapter with the
// class hierarchy.
{ return "Hierarchical Index"; }
virtual QString trCompoundIndex()
// This is used in LaTeX as the title of the chapter with the
// annotated compound index
{ return "Compound Index"; }
virtual QString trFileIndex()
// This is used in LaTeX as the title of the chapter with the
// list of all files.
{ return "File Index"; }
virtual QString trModuleDocumentation()
// This is used in LaTeX as the title of the chapter containing
// the documentation of all groups.
{ return "Module Documentation"; }
virtual QString trClassDocumentation()
// This is used in LaTeX as the title of the chapter containing
// the documentation of all classes, structs and unions.
{ return "Class Documentation"; }
virtual QString trFileDocumentation()
// This is used in LaTeX as the title of the chapter containing
// the documentation of all files.
{ return "File Documentation"; }
virtual QString trExampleDocumentation()
// This is used in LaTeX as the title of the chapter containing
// the documentation of all examples.
{ return "Example Documentation"; }
virtual QString trPageDocumentation()
// This is used in LaTeX as the title of the chapter containing
// the documentation of all related pages.
{ return "Page Documentation"; }
virtual QString trReferenceManual()
// This is used in LaTeX as the title of the document
{ return "Reference Manual"; }
virtual QString trDefines()
// This is used in the documentation of a file as a header before the
// list of defines
{ return "Defines"; }
virtual QString trFuncProtos()
// This is used in the documentation of a file as a header before the
// list of function prototypes
{ return "Function Prototypes"; }
virtual QString trTypedefs()
// This is used in the documentation of a file as a header before the
// list of typedefs
{ return "Typedefs"; }
virtual QString trEnumerations()
// This is used in the documentation of a file as a header before the
// list of enumerations
{ return "Enumerations"; }
virtual QString trFunctions()
// This is used in the documentation of a file as a header before the
// list of (global) functions
{ return "Functions"; }
virtual QString trVariables()
// This is used in the documentation of a file as a header before the
// list of (global) variables
{ return "Variables"; }
virtual QString trEnumerationValues()
// This is used in the documentation of a file as a header before the
// list of (global) variables
{ return "Enumeration values"; }
virtual QString trReimplementedFrom()
{ return "Reimplemented from"; }
virtual QString trReimplementedIn()
{ return "Reimplemented in"; }
virtual QString trAuthor()
// This is used in man pages as the author section.
{ return "Author"; }
virtual QString trDefineDocumentation()
// This is used in the documentation of a file before the list of
// documentation blocks for defines
{ return "Define Documentation"; }
virtual QString trFunctionPrototypeDocumentation()
// This is used in the documentation of a file/namespace before the list
// of documentation blocks for function prototypes
{ return "Function Prototype Documentation"; }
virtual QString trTypedefDocumentation()
// This is used in the documentation of a file/namespace before the list
// of documentation blocks for typedefs
{ return "Typedef Documentation"; }
virtual QString trEnumerationTypeDocumentation()
// This is used in the documentation of a file/namespace before the list
// of documentation blocks for enumeration types
{ return "Enumeration Type Documentation"; }
virtual QString trEnumerationValueDocumentation()
// This is used in the documentation of a file/namespace before the list
// of documentation blocks for enumeration values
{ return "Enumeration Value Documentation"; }
virtual QString trFunctionDocumentation()
// This is used in the documentation of a file/namespace before the list
// of documentation blocks for functions
{ return "Function Documentation"; }
virtual QString trVariableDocumentation()
// This is used in the documentation of a file/namespace before the list
// of documentation blocks for variables
{ return "Variable Documentation"; }
virtual QString trCompounds()
// This is used in the documentation of a file/namespace/group before
// the list of links to documented compounds
{ return "Compounds"; }
virtual QString trFiles()
// This is used in the documentation of a group before the list of
// links to documented files
{ return "Files"; }
virtual QString trGeneratedAt(const char *date,const char *projName)
......@@ -226,42 +352,56 @@ class Translator
}
virtual QString trClassDiagram(const char *clName)
// this text is put before a class diagram
{
return (QString)"Class diagram for "+clName;
}
virtual QString trForInternalUseOnly()
// this text is generated when the \internal command is used.
{ return "For internal use only."; }
virtual QString trReimplementedForInternalReasons()
// this text is generated when the \reimp command is used.
{ return "Reimplemented for internal reasons; the API is not affected."; }
virtual QString trWarning()
// this text is generated when the \warning command is used.
{ return "Warning"; }
virtual QString trBugsAndLimitations()
// this text is generated when the \bug command is used.
{ return "Bugs and limitations"; }
virtual QString trVersion()
// this text is generated when the \version command is used.
{ return "Version"; }
virtual QString trDate()
// this text is generated when the \date command is used.
{ return "Date"; }
virtual QString trAuthors()
// this text is generated when the \author command is used.
{ return "Author(s)"; }
virtual QString trReturns()
// this text is generated when the \return command is used.
{ return "Returns"; }
virtual QString trSeeAlso()
// this text is generated when the \sa command is used.
{ return "See also"; }
virtual QString trParameters()
// this text is generated when the \param command is used.
{ return "Parameters"; }
virtual QString trExceptions()
// this text is generated when the \exception command is used.
{ return "Exceptions"; }
virtual QString trGeneratedBy()
// this text is used in the title page of a LaTeX document.
{ return "Generated by"; }
// new since 0.49-990307
virtual QString trNamespaces()
{ return "Namespaces"; }
virtual QString trNamespaceList()
// used as the title of page containing all the index of all namespaces.
{ return "Namespace List"; }
virtual QString trNamespaceListDescription(bool extractAll)
// used as an introduction to the namespace list
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
......@@ -269,12 +409,147 @@ class Translator
return result;
}
virtual QString trFriends()
// used in the class documentation as a header before the list of all
// friends of a class
{ return "Friends"; }
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
virtual QString trRelatedFunctionDocumentation()
// used in the class documentation as a header before the list of all
// related classes
{ return "Friends And Related Function Documentation"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
//////////////////////////////////////////////////////////////////////////
virtual QString trCompoundReference(const char *clName,
ClassDef::CompoundType compType)
// used as the title of the HTML page of a class/struct/union
{
QString result=(QString)clName+" ";
switch(compType)
{
case ClassDef::Class: result+=" Class"; break;
case ClassDef::Struct: result+=" Struct"; break;
case ClassDef::Union: result+=" Union"; break;
}
result+=" Reference";
return result;
}
virtual QString trFileReference(const char *fileName)
// used as the title of the HTML page of a file
{
QString result=fileName;
result+=" File Reference";
return result;
}
virtual QString trNamespaceReference(const char *namespaceName)
// used as the title of the HTML page of a namespace
{
QString result=namespaceName;
result+=" Namespace Reference";
return result;
}
// these are for the member sections of a class, struct or union
virtual QString trPublicMembers()
{ return "Public Members"; }
virtual QString trPublicSlots()
{ return "Public Slots"; }
virtual QString trSignals()
{ return "Signals"; }
virtual QString trStaticPublicMembers()
{ return "Static Public Members"; }
virtual QString trProtectedMembers()
{ return "Protected Members"; }
virtual QString trProtectedSlots()
{ return "Protected Slots"; }
virtual QString trStaticProtectedMembers()
{ return "Static Protected Members"; }
virtual QString trPrivateMembers()
{ return "Private Members"; }
virtual QString trPrivateSlots()
{ return "Private Slots"; }
virtual QString trStaticPrivateMembers()
{ return "Static Private Members"; }
// end of member sections
virtual QString trWriteList(int numEntries)
{
// this function is used to produce a comma-separated list of items.
// use generateMarker(i) to indicate where item i should be put.
QString result;
int i;
// the inherits list contain `numEntries' classes
for (i=0;i<numEntries;i++)
{
// use generateMarker to generate placeholders for the class links!
result+=generateMarker(i); // generate marker for entry i in the list
// (order is left to right)
if (i!=numEntries-1) // not the last entry, so we need a separator
{
if (i<numEntries-2) // not the fore last entry
result+=", ";
else // the fore last entry
result+=", and ";
}
}
return result;
}
virtual QString trInheritsList(int numEntries)
// used in class documentation to produce a list of base classes,
// if class diagrams are disabled.
{
return "Inherits "+trWriteList(numEntries)+".";
}
virtual QString trInheritedByList(int numEntries)
// used in class documentation to produce a list of super classes,
// if class diagrams are disabled.
{
return "Inherited by "+trWriteList(numEntries)+".";
}
virtual QString trReimplementedFromList(int numEntries)
// used in member documentation blocks to produce a list of
// members that are hidden by this one.
{
return "Reimplemented from "+trWriteList(numEntries)+".";
}
virtual QString trReimplementedInList(int numEntries)
{
// used in member documentation blocks to produce a list of
// all member that overwrite the implementation of this member.
return "Reimplemented in "+trWriteList(numEntries)+".";
}
virtual QString trNamespaceMembers()
// This is put above each page as a link to all members of namespaces.
{ return "Namespace Members"; }
virtual QString trNamespaceMemberDescription(bool extractAll)
// This is an introduction to the page with all namespace members
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
result+="namespace members with links to ";
if (extractAll)
result+="the namespace documentation for each member:";
else
result+="the namespaces they belong to:";
return result;
}
virtual QString trNamespaceIndex()
// This is used in LaTeX as the title of the chapter with the
// index of all namespaces.
{ return "Namespace Index"; }
virtual QString trNamespaceDocumentation()
// This is used in LaTeX as the title of the chapter containing
// the documentation of all namespaces.
{ return "Namespace Documentation"; }
};
#endif
......@@ -255,7 +255,7 @@ class TranslatorFrench : public Translator
virtual QString trNamespaces()
{ return "Namespaces"; }
virtual QString trNamespaceList()
{ return "List des Namespaces"; }
{ return "Liste des Namespaces"; }
virtual QString trNamespaceListDescription(bool extractAll)
{
QString result="Liste de tous les namespaces ";
......@@ -265,6 +265,11 @@ class TranslatorFrench : public Translator
}
virtual QString trFriends()
{ return "Friends"; }
// new since 0.49-990405
virtual QString trRelatedFunctionDocumentation()
{ return "Documentation des fonctions amies et associées"; }
};
#endif
......@@ -24,12 +24,6 @@ class TranslatorDutch : public Translator
public:
QString latexBabelPackage()
{ return "dutch"; }
QString trInherits()
{ return "Erft over van"; }
QString trAnd()
{ return "en"; }
QString trInheritedBy()
{ return "Wordt overge&euml;rfd door"; }
QString trRelatedFunctions()
{ return "Gerelateerde functies"; }
QString trRelatedSubscript()
......@@ -55,8 +49,6 @@ class TranslatorDutch : public Translator
}
QString trMore()
{ return "Meer..."; }
QString trReference()
{ return "Referentie"; }
QString trListOfAllMembers()
{ return "Lijst van alle members."; }
QString trMemberList()
......@@ -64,7 +56,7 @@ class TranslatorDutch : public Translator
QString trThisIsTheListOfAllMembers()
{ return "Dit is de complete lijst van alle members voor"; }
QString trIncludingInheritedMembers()
{ return "inclusief alle overge&euml;rfde members."; }
{ return ", inclusief alle overge&euml;rfde members."; }
QString trGeneratedAutomatically(const char *s)
{ QString result="Automatisch gegenereerd door Doxygen";
if (s) result+=(QString)" voor "+s;
......@@ -77,8 +69,6 @@ class TranslatorDutch : public Translator
{ return "enum waarde"; }
QString trDefinedIn()
{ return "gedefinieerd in"; }
QString trIncludeFile()
{ return "Include File"; }
QString trVerbatimText(const char *f)
{ return (QString)"Dit is de letterlijke tekst van de include file "+f+"."; }
QString trModules()
......@@ -182,10 +172,6 @@ class TranslatorDutch : public Translator
{ return "Variabelen"; }
QString trEnumerationValues()
{ return "Enumeratie waarden"; }
QString trReimplementedFrom()
{ return "Nieuwe implementatie van"; }
QString trReimplementedIn()
{ return "Opnieuw ge&iuml;mplementeerd in"; }
QString trAuthor()
{ return "auteur"; }
QString trDefineDocumentation()
......@@ -246,10 +232,10 @@ class TranslatorDutch : public Translator
QString trGeneratedBy()
{ return "Gegenereerd door"; }
// new since 0.49-990307
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990307
//////////////////////////////////////////////////////////////////////////
QString trNamespaces()
{ return "Namespaces"; }
QString trNamespaceList()
{ return "Namespace Lijst"; }
QString trNamespaceListDescription(bool extractAll)
......@@ -261,6 +247,142 @@ class TranslatorDutch : public Translator
}
QString trFriends()
{ return "Friends"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
QString trRelatedFunctionDocumentation()
{ return "Documentatie van friends en gerelateerde functies"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
//////////////////////////////////////////////////////////////////////////
virtual QString trCompoundReference(const char *clName,
ClassDef::CompoundType compType)
// used as the title of the HTML page of a class/struct/union
{
QString result=(QString)clName+" ";
switch(compType)
{
case ClassDef::Class: result+=" Class"; break;
case ClassDef::Struct: result+=" Struct"; break;
case ClassDef::Union: result+=" Union"; break;
}
result+=" Referentie";
return result;
}
virtual QString trFileReference(const char *fileName)
// used as the title of the HTML page of a file
{
QString result=fileName;
result+=" File Referentie";
return result;
}
virtual QString trNamespaceReference(const char *namespaceName)
// used as the title of the HTML page of a namespace
{
QString result=namespaceName;
result+=" Namespace Referentie";
return result;
}
// these are for the member sections of a class, struct or union
virtual QString trPublicMembers()
{ return "Public Members"; }
virtual QString trPublicSlots()
{ return "Public Slots"; }
virtual QString trSignals()
{ return "Signals"; }
virtual QString trStaticPublicMembers()
{ return "Static Public Members"; }
virtual QString trProtectedMembers()
{ return "Protected Members"; }
virtual QString trProtectedSlots()
{ return "Protected Slots"; }
virtual QString trStaticProtectedMembers()
{ return "Static Protected Members"; }
virtual QString trPrivateMembers()
{ return "Private Members"; }
virtual QString trPrivateSlots()
{ return "Private Slots"; }
virtual QString trStaticPrivateMembers()
{ return "Static Private Members"; }
// end of member sections
virtual QString trWriteList(int numEntries)
{
// this function is used to produce a comma-separated list of items.
// use generateMarker(i) to indicate where item i should be put.
QString result;
int i;
// the inherits list contain `numEntries' classes
for (i=0;i<numEntries;i++)
{
// use generateMarker to generate placeholders for the class links!
result+=generateMarker(i); // generate marker for entry i in the list
// (order is left to right)
if (i!=numEntries-1) // not the last entry, so we need a separator
{
if (i<numEntries-2) // not the fore last entry
result+=", ";
else // the fore last entry
result+=" en ";
}
}
return result;
}
virtual QString trInheritsList(int numEntries)
// used in class documentation to produce a list of base classes,
// if class diagrams are disabled.
{
return "Erft over van "+trWriteList(numEntries)+".";
}
virtual QString trInheritedByList(int numEntries)
// used in class documentation to produce a list of super classes,
// if class diagrams are disabled.
{
return "Wordt overge&euml;rfd door "+trWriteList(numEntries)+".";
}
virtual QString trReimplementedFromList(int numEntries)
// used in member documentation blocks to produce a list of
// members that are hidden by this one.
{
return "Nieuwe implementatie van "+trWriteList(numEntries)+".";
}
virtual QString trReimplementedInList(int numEntries)
{
// used in member documentation blocks to produce a list of
// all member that overwrite the implementation of this member.
return "Opnieuw ge&iuml;mplementeerd in "+trWriteList(numEntries)+".";
}
virtual QString trNamespaceMembers()
// This is put above each page as a link to all members of namespaces.
{ return "Namespace Members"; }
virtual QString trNamespaceMemberDescription(bool extractAll)
// This is an introduction to the page with all namespace members
{
QString result="Hier is een lijst van alle ";
if (!extractAll) result+="gedocumenteerde ";
result+="namespace members met links naar ";
if (extractAll)
result+="de namespace documentatie voor iedere member:";
else
result+="de namespaces waartoe ze behoren:";
return result;
}
virtual QString trNamespaceIndex()
// This is used in LaTeX as the title of the chapter with the
// index of all namespaces.
{ return "Namespace Index"; }
virtual QString trNamespaceDocumentation()
// This is used in LaTeX as the title of the chapter containing
// the documentation of all namespaces.
{ return "Namespace Documentatie"; }
};
#endif
......@@ -14,6 +14,14 @@
*
*/
/*-------------------------------------------------------------------------
Svensk versttning av:
Samuel Hgglund <sahag96@ite.mh.se>
Xet Erixon <xet@xeqt.com>
Skicka grna synpunkter.
--------------------------------------------------------------------------*/
#ifndef TRANSLATOR_SE_H
#define TRANSLATOR_SE_H
......@@ -35,34 +43,32 @@ class TranslatorSwedish : public Translator
QString trRelatedSubscript()
{ return "(Observera att dessa inte r medlemsfunktioner)"; }
QString trDetailedDescription()
{ return "Utkad beskrivning"; }
{ return "Detaljerad beskrivning"; }
QString trMemberTypedefDocumentation()
{ return "Har inte en aning..."; }
{ return "Dokumentation ver typdefinierade medlemmar"; }
QString trMemberEnumerationDocumentation()
{ return "Upprknad dokumentation???"; }
QString trEnumerationValueDocumentation()
{ return "Documentatie van enumeratie waarden"; }
{ return "Dokumentation ver egenupprknande medlemmar"; }
QString trMemberFunctionDocumentation()
{ return "Dokumentation av medlemsfunktioner"; }
{ return "Dokumentation ver medlemsfunktioner"; }
QString trMemberDataDocumentation()
{ return "Dokumentation av datamedlemmar"; }
{ return "Dokumentation ver datamedlemmar"; }
QString trGeneratedFrom(const char *s,bool single)
{
QString result=(QString)"Dokumentationen fr detta"+s+
" r skapad ur fljande fil";
if (single) result+=":"; else result+="s:";
QString result=(QString)"Dokumentationen fr denna"+s+
" r skapad utifrn fljande fil";
if (single) result+=":"; else result+="er:";
return result;
}
QString trMore()
{ return "Fler..."; }
{ return "Mer..."; }
QString trReference()
{ return "Hnvisning?"; }
{ return "Referens"; }
QString trListOfAllMembers()
{ return "Lista ver alla medlemmar."; }
QString trMemberList()
{ return "Medlemslista"; }
QString trThisIsTheListOfAllMembers()
{ return "Det hr r en fullstndig lista av medlemmar fr?"; }
{ return "Det hr r en fullstndig lista ver medlemmar fr"; }
QString trIncludingInheritedMembers()
{ return "med alla rvda medlemmar."; }
QString trGeneratedAutomatically(const char *s)
......@@ -72,29 +78,29 @@ class TranslatorSwedish : public Translator
return result;
}
QString trEnumName()
{ return "enum namn?"; }
{ return "enum namn"; }
QString trEnumValue()
{ return "enum vrde?"; }
{ return "enum vrde"; }
QString trDefinedIn()
{ return "deklarerad i"; }
QString trIncludeFile()
{ return "Include Fil"; }
{ return "Inkluderingsfil"; }
QString trVerbatimText(const char *f)
{ return (QString)"Detta r den ordagranna texten av "+f+" include fil."; }
{ return (QString)"Detta r den ordagranna texten frn inkluderingsfilen"+f; }
QString trModules()
{ return "Moduler?"; }
{ return "Moduler"; }
QString trClassHierarchy()
{ return "Klasshierarki?"; }
{ return "Klasshierarki"; }
QString trCompoundList()
{ return "Inhgnad lista???"; }
{ return "Sammansatt klasslista"; }
QString trFileList()
{ return "Fillista"; }
QString trHeaderFiles()
{ return "Headerfiler"; }
QString trCompoundMembers()
{ return "Inhgnade medlemmar??"; }
{ return "Sammansatta klassmedlemmar"; }
QString trFileMembers()
{ return "Filmedlemmar???"; }
{ return "Filmedlemmar"; }
QString trRelatedPages()
{ return "Beslktade sidor"; }
QString trExamples()
......@@ -102,8 +108,8 @@ class TranslatorSwedish : public Translator
QString trSearch()
{ return "Sk"; }
QString trClassHierarchyDescription()
{ return "Denna lista ver arv r grovsorterad, men inte helt "
"i alfabetisk ordning:";
{ return "Denna lista ver arv r grovt, men inte helt, "
"sorterad i alfabetisk ordning:";
}
QString trFileListDescription(bool extractAll)
{
......@@ -113,8 +119,8 @@ class TranslatorSwedish : public Translator
return result;
}
QString trCompoundListDescription()
{ return "Hr fljer klasserna, structs och "
"unions? med en kort beskrivning:";
{ return "Hr fljer klasserna, structerna och "
"unionerna med en kort beskrivning:";
}
QString trCompoundMembersDescription(bool extractAll)
{
......@@ -129,18 +135,18 @@ class TranslatorSwedish : public Translator
{
QString result="Hr fljer en lista ver alla ";
if (!extractAll) result+="dokumenterade ";
result+="filmedlemmar? med lnkar till ";
result+="filmedlemmar med lnkar till ";
if (extractAll) result+="dokumentationsfilen fr varje medlem:";
else result+="filerna som de tillhr:";
return result;
}
QString trHeaderFilesDescription()
{ return "Hr fljer headerfilerna som API:n bestr av???:"; }
{ return "Hr fljer headerfilerna som API:n bestr av:"; }
QString trExamplesDescription()
{ return "Hr fljer en lista med alla exempel:"; }
QString trRelatedPagesDescription()
{ return "Hr fljer en lista med alla relevanta? dokumentationssidor:"; }
QString trModulesDescription()
{ return "Hr fljer en lista ver alla relaterade dokumentationssidor:";
} QString trModulesDescription()
{ return "Hr fljer en lista ver alla moduler:"; }
QString trNoDescriptionAvailable()
{ return "Beskrivning saknas"; }
......@@ -148,11 +154,11 @@ class TranslatorSwedish : public Translator
QString trDocumentation()
{ return "Dokumentation"; }
QString trModuleIndex()
{ return "Module Index"; }
{ return "Modul Index"; }
QString trHierarchicalIndex()
{ return "Hierarkiskt Index"; }
QString trCompoundIndex()
{ return "Compound Index"; }
{ return "Sammansatt Index"; }
QString trFileIndex()
{ return "Fil Index"; }
QString trModuleDocumentation()
......@@ -169,39 +175,41 @@ class TranslatorSwedish : public Translator
{ return "Uppslagsbok"; }
QString trDefines()
{ return "Definerar"; }
{ return "Definitioner"; }
QString trFuncProtos()
{ return "Funktionsprototyper"; }
QString trTypedefs()
{ return "Typedefs"; }
{ return "Typdefinitioner"; }
QString trEnumerations()
{ return "Upprkning???"; }
{ return "Egenupprknande typer"; }
QString trFunctions()
{ return "Funktioner"; }
QString trVariables()
{ return "Variabler"; }
QString trEnumerationValues()
{ return "Enum vrden??"; }
{ return "Egenupprknade vrden"; }
QString trReimplementedFrom()
{ return "teranvnd frn???"; }
{ return "teranvnd frn"; }
QString trReimplementedIn()
{ return "teranvnd i??"; }
{ return "teranvnd i"; }
QString trAuthor()
{ return "Frfattare"; }
QString trDefineDocumentation()
{ return "Definiera dokumentation"; }
{ return "Dokumentation ver definitioner"; }
QString trFunctionPrototypeDocumentation()
{ return "Dokumentation ver funktionsprototyper"; }
QString trTypedefDocumentation()
{ return "Dokumentation ver typedefs"; }
{ return "Dokumentation ver typdefinitioner"; }
QString trEnumerationTypeDocumentation()
{ return "Dokumentation ver enum typer"; }
{ return "Dokumentation ver egenupprknande typer (enum)"; }
QString trEnumerationValueDocumentation()
{ return "Dokumentation ver egenupprknande typers vrden"; }
QString trFunctionDocumentation()
{ return "Dokumentation ver funktioner"; }
QString trVariableDocumentation()
{ return "Dokumentation ver variabler"; }
QString trCompounds()
{ return "Compounds??"; }
{ return "Sammansttning"; }
QString trFiles()
{ return "Filer"; }
QString trGeneratedAt(const char *date,const char *projName)
......@@ -217,12 +225,12 @@ class TranslatorSwedish : public Translator
}
QString trClassDiagram(const char *clName)
{
return (QString)"Klass diagram fr "+clName;
return (QString)"Klass-diagram fr "+clName;
}
QString trForInternalUseOnly()
{ return "Endast fr internt bruk."; }
QString trReimplementedForInternalReasons()
{ return "Omskriven av interna orsaker???; "
{ return "Omskriven av intern anledning ; "
"API:n pverkas inte.";
}
QString trWarning()
......
......@@ -37,6 +37,12 @@ bool isId(char c)
return c=='_' || isalnum(c);
}
QString generateMarker(int id)
{
QString result;
result.sprintf("@%d\n",id);
return result;
}
// try to determine if this files is a source or a header file by looking
// at the extension (5 variations are allowed in both upper and lower case)
......@@ -197,6 +203,7 @@ static void linkifyText(OutputList &ol,const char *clName,const char *name,const
ClassDef *cd=0;
FileDef *fd=0;
MemberDef *md=0;
NamespaceDef *nd=0;
// check if `word' is a documented class name
if (word.length()>0 && word!=name && word!=clName)
......@@ -206,24 +213,29 @@ static void linkifyText(OutputList &ol,const char *clName,const char *name,const
// add link to the result
if (cd->isVisible())
{
result.writeObjectLink(cd->getReference(),cd->classFile(),0,word);
result.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,word);
}
else
{
result.docify(word);
}
}
else if (getDefs(word,clName,0,md,cd,fd) && md->hasDocumentation())
else if (getDefs(word,clName,0,md,cd,fd,nd) && md->hasDocumentation())
{
if (cd && cd->isVisible() && !md->isFunction()) // word is a member of cd
{
result.writeObjectLink(cd->getReference(),
cd->classFile(),md->anchor(),word);
cd->getOutputFileBase(),md->anchor(),word);
}
else if (nd && nd->hasDocumentation())
{
result.writeObjectLink(nd->getReference(),
nd->getOutputFileBase(),md->anchor(),word);
}
else if (fd && fd->hasDocumentation()) // word is a global in file fd
{
result.writeObjectLink(fd->getReference(),
fd->diskName(),md->anchor(),word);
fd->getOutputFileBase(),md->anchor(),word);
}
else // add word to the result
{
......@@ -313,6 +325,28 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
}
}
void writeExample(OutputList &ol,ExampleList *el)
{
QString exampleLine=theTranslator->trWriteList(el->count());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
{
bool ok;
parseText(ol,exampleLine.mid(index,newIndex-index));
uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
Example *e=el->at(entryIndex);
if (ok && e) ol.writeObjectLink(0,e->file,e->anchor,e->name);
index=newIndex+matchLen;
}
parseText(ol,exampleLine.right(exampleLine.length()-index));
ol.writeString(".");
}
QString argListToString(ArgumentList *al)
{
QString result;
......@@ -335,11 +369,14 @@ static void writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
FileDef *fd,MemberDef *md,const char *name)
{
if (nd)
ol.writeObjectLink(0 /*TODO: references */,nd->namespaceFile(),md->anchor(),name);
ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),
md->anchor(),name);
else if (fd)
ol.writeObjectLink(fd->getReference(),fd->diskName(),md->anchor(),name);
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),
md->anchor(),name);
else
ol.writeObjectLink(cd->getReference(),cd->classFile(),md->anchor(),name);
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
md->anchor(),name);
}
static void warnForUndocumentedMember(MemberDef *md)
......@@ -388,77 +425,84 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"modules.html");
parseDoc(ol,0,0,theTranslator->trModules());
parseText(ol,theTranslator->trModules());
ol.endQuickIndexItem();
}
if (documentedNamespaces>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"namespaces.html");
parseDoc(ol,0,0,theTranslator->trNamespaces());
parseText(ol,theTranslator->trNamespaceList());
ol.endQuickIndexItem();
}
if (hierarchyClasses>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"hierarchy.html");
parseDoc(ol,0,0,theTranslator->trClassHierarchy());
parseText(ol,theTranslator->trClassHierarchy());
ol.endQuickIndexItem();
}
if (annotatedClasses>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"annotated.html");
parseDoc(ol,0,0,theTranslator->trCompoundList());
parseText(ol,theTranslator->trCompoundList());
ol.endQuickIndexItem();
}
if (documentedFiles>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"files.html");
parseDoc(ol,0,0,theTranslator->trFileList());
parseText(ol,theTranslator->trFileList());
ol.endQuickIndexItem();
}
if (includeFiles.count()>0 && verbatimHeaderFlag)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"headers.html");
parseDoc(ol,0,0,theTranslator->trHeaderFiles());
parseText(ol,theTranslator->trHeaderFiles());
ol.endQuickIndexItem();
}
if (documentedNamespaceMembers>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"namespacemembers.html");
parseText(ol,theTranslator->trNamespaceMembers());
ol.endQuickIndexItem();
}
if (documentedMembers>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"functions.html");
parseDoc(ol,0,0,theTranslator->trCompoundMembers());
parseText(ol,theTranslator->trCompoundMembers());
ol.endQuickIndexItem();
}
if (documentedFunctions>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"globals.html");
parseDoc(ol,0,0,theTranslator->trFileMembers());
parseText(ol,theTranslator->trFileMembers());
ol.endQuickIndexItem();
}
if (pageList.count()>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"pages.html");
parseDoc(ol,0,0,theTranslator->trRelatedPages());
parseText(ol,theTranslator->trRelatedPages());
ol.endQuickIndexItem();
}
if (exampleList.count()>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"examples.html");
parseDoc(ol,0,0,theTranslator->trExamples());
parseText(ol,theTranslator->trExamples());
ol.endQuickIndexItem();
}
if (searchEngineFlag)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem("_cgi:","");
parseDoc(ol,0,0,theTranslator->trSearch());
parseText(ol,theTranslator->trSearch());
ol.endQuickIndexItem();
}
if (compact)
......@@ -489,7 +533,7 @@ void endFile(OutputList &ol,bool external)
ol.writeFooter(0,external); // write the footer
if (footerFile.length()==0)
{
parseDoc(ol,0,0,theTranslator->trGeneratedAt(
parseText(ol,theTranslator->trGeneratedAt(
dateToString(TRUE),
projectName
));
......@@ -497,7 +541,7 @@ void endFile(OutputList &ol,bool external)
ol.writeFooter(1,external); // write the link to the picture
if (footerFile.length()==0)
{
parseDoc(ol,0,0,theTranslator->trWrittenBy());
parseText(ol,theTranslator->trWrittenBy());
}
ol.writeFooter(2,external); // end the footer
if (latexEnabled) ol.enable(OutputGenerator::Latex);
......@@ -516,7 +560,7 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
md->documentation().isEmpty() &&
!briefMemDescFlag &&
!repeatBriefFlag
)
)
) return;
QString type=md->typeString();
QRegExp r("@[0-9]+");
......@@ -539,14 +583,24 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
else if (fd) cname=fd->name();
// If there is no detailed description we need to write the anchor here.
if (!md->detailsAreVisible() && !extractAllFlag)
bool detailsVisible = md->detailsAreVisible();
if (!detailsVisible && !extractAllFlag)
{
ol.writeDoxyAnchor(cname,md->anchor(),md->name());
QString doxyName=md->name().copy();
if (!cname.isEmpty()) doxyName.prepend(cname+"::");
ol.writeDoxyAnchor(cname,md->anchor(),doxyName);
ol.addToIndex(md->name(),cname);
ol.addToIndex(cname,md->name());
ol.docify("\n");
}
else if (!detailsVisible) // when extractAll it true we have to write
// a index reference and label in LaTeX because
// detailed section not shown in LaTeX
{
ol.addToIndex(md->name(),cname);
ol.addToIndex(cname,md->name());
ol.writeLatexLabel(cname,md->anchor());
}
ol.startMemberItem();
// write type
......@@ -564,6 +618,8 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
QString name=md->name().copy();
if (type.length()>0) ol.writeString(" ");
ol.insertMemberAlign();
// write name
if ( extractAllFlag ||
(md->briefDescription().isEmpty() || !briefMemDescFlag) &&
......@@ -610,7 +666,7 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
ol.docify(" ");
ol.startTextLink(0,md->anchor());
//ol.writeObjectLink(0,0,md->anchor()," More...");
parseDoc(ol,0,0,theTranslator->trMore());
parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.startEmphasis();
ol.enableAll();
......@@ -634,11 +690,13 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (title)
{
ol.startMemberHeader();
parseDoc(ol,0,0,title);
parseText(ol,title);
ol.endMemberHeader();
}
if (subtitle) ol.writeString(subtitle);
if (subtitle)
{
parseText(ol,subtitle);
}
if (!fd && !nd) ol.startMemberList();
MemberDef *md;
......@@ -646,7 +704,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd && ml->defineCount()>0)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trDefines());
parseText(ol,theTranslator->trDefines());
ol.endMemberHeader();
ol.startMemberList();
MemberListIterator mli(*ml);
......@@ -663,7 +721,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if ((fd || nd) && ml->protoCount()>0)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trFuncProtos());
parseText(ol,theTranslator->trFuncProtos());
ol.startMemberList();
MemberListIterator mli(*ml);
for ( ; (md=mli.current()); ++mli )
......@@ -678,7 +736,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trTypedefs());
parseText(ol,theTranslator->trTypedefs());
ol.endMemberHeader();
//ol.writeMemberHeader("Typedefs");
ol.startMemberList();
......@@ -697,36 +755,21 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trEnumerations());
parseText(ol,theTranslator->trEnumerations());
ol.endMemberHeader();
ol.startMemberList();
}
MemberListIterator mli(*ml);
for ( ; (md=mli.current()) ; ++mli )
{
bool hasDocs=md->hasDocumentation();
/*bool hasDocs=md->hasDocumentation();*/
QString type=md->typeString();
type=type.stripWhiteSpace();
if (md->isEnumerate() && (hasDocs || !hideMemberFlag))
if (md->isEnumerate() /*&& (hasDocs || !hideMemberFlag)*/)
{
// see if there are any documented enum values
// we need this info to decide if we need to generate a link.
QList<MemberDef> *fmdl=md->enumFieldList();
int documentedEnumValues=0;
if (fmdl)
{
MemberDef *fmd=fmdl->first();
while (fmd)
{
if (fmd->hasDocumentation()) documentedEnumValues++;
fmd=fmdl->next();
}
}
if (documentedEnumValues>0) md->setDocumentedEnumValues(TRUE);
if (!hideMemberFlag || // do not hide undocumented members or
!md->documentation().isEmpty() || // member has detailed descr. or
documentedEnumValues>0 || // member has documented enum vales.
md->hasDocumentedEnumValues() || // member has documented enum vales.
briefMemDescFlag || // brief descr. is shown or
repeatBriefFlag // brief descr. is repeated.
)
......@@ -739,7 +782,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
if (extractAllFlag ||
(md->briefDescription().isEmpty() || !briefMemDescFlag) &&
(!md->documentation().isEmpty() || documentedEnumValues>0 ||
(!md->documentation().isEmpty() || md->hasDocumentedEnumValues() ||
(!md->briefDescription().isEmpty() &&
!briefMemDescFlag &&
repeatBriefFlag
......@@ -760,6 +803,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
}
typeDecl.docify("{ ");
QList<MemberDef> *fmdl=md->enumFieldList();
if (fmdl)
{
MemberDef *fmd=fmdl->first();
......@@ -798,6 +842,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
ol.startMemberItem();
ol.writeString("enum ");
ol.insertMemberAlign();
ol+=typeDecl;
ol.endMemberItem();
//QString brief=md->briefDescription();
......@@ -807,14 +852,14 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
ol.startMemberDescription();
parseDoc(ol,cd?cd->name().data():0,
md->name().data(),md->briefDescription());
if (!md->documentation().isEmpty() || documentedEnumValues>0)
if (!md->documentation().isEmpty() || md->hasDocumentedEnumValues())
{
ol.disableAllBut(OutputGenerator::Html);
ol.endEmphasis();
ol.docify(" ");
ol.startTextLink(0,md->anchor());
//ol.writeObjectLink(0,0,md->anchor()," More...");
parseDoc(ol,0,0,theTranslator->trMore());
parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.startEmphasis();
ol.enableAll();
......@@ -838,7 +883,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trFunctions());
parseText(ol,theTranslator->trFunctions());
ol.endMemberHeader();
ol.startMemberList();
}
......@@ -873,6 +918,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
ol.startMemberItem();
ol.docify("class ");
ol.insertMemberAlign();
ol.writeObjectLink(0,0,md->anchor(),md->name());
ol.endMemberItem();
}
......@@ -880,13 +926,15 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
ol.startMemberItem();
ol.docify("class ");
ol.writeObjectLink(cd->getReference(),cd->classFile(),0,cd->name());
ol.insertMemberAlign();
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
ol.endMemberItem();
}
else if (!hideMemberFlag) // no documentation
{
ol.startMemberItem();
ol.docify("class ");
ol.insertMemberAlign();
ol.writeBoldString(md->name());
ol.endMemberItem();
}
......@@ -901,7 +949,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
parseDoc(ol,0,0,theTranslator->trVariables());
parseText(ol,theTranslator->trVariables());
ol.endMemberHeader();
ol.startMemberList();
}
......@@ -1109,11 +1157,11 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
{
ol.newParagraph();
ol.startBold();
parseDoc(ol,0,0,theTranslator->trEnumerationValues());
parseText(ol,theTranslator->trEnumerationValues());
//ol.writeBoldString("Enumeration values:");
ol.docify(":");
ol.endBold();
ol.startMemberList();
ol.startItemList();
}
ol.writeDoxyAnchor(cname,fmd->anchor(),fmd->name());
ol.addToIndex(fmd->name(),cname);
......@@ -1141,7 +1189,7 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
fmd=fmdl->next();
}
}
if (!first) { ol.endMemberList(); ol.writeChar('\n'); }
if (!first) { ol.endItemList(); ol.writeChar('\n'); }
}
MemberDef *bmd=md->reimplements();
......@@ -1159,33 +1207,49 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
// write class that contains a member that is reimplemented by this one
ClassDef *bcd = bmd->memberClass();
ol.newParagraph();
parseDoc(ol,0,0,theTranslator->trReimplementedFrom());
//ol.writeString("Reimplemented from ");
ol.docify(" ");
if (bmd->hasDocumentation())
//parseText(ol,theTranslator->trReimplementedFrom());
//ol.docify(" ");
QString reimplFromLine = theTranslator->trReimplementedFromList(1);
int markerPos = reimplFromLine.find("@0");
if (markerPos!=-1) // should always pass this.
{
ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
bmd->anchor(),bcd->name());
if (
!bcd->isReference() &&
//(bcd->hasDocumentation() || !hideClassFlag) &&
//(bcd->protection()!=Private || extractPrivateFlag)
bcd->isVisible()
/*&& bmd->detailsAreVisible()*/
) ol.writePageRef(bcd->name(),bmd->anchor());
parseText(ol,reimplFromLine.left(markerPos)); //text left from marker
if (bmd->hasDocumentation() &&
(bmd->protection()!=Private || extractPrivateFlag)
) // replace marker with link
{
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
bmd->anchor(),bcd->name());
if (
!bcd->isReference() &&
//(bcd->hasDocumentation() || !hideClassFlag) &&
//(bcd->protection()!=Private || extractPrivateFlag)
bcd->isVisible()
/*&& bmd->detailsAreVisible()*/
) ol.writePageRef(bcd->name(),bmd->anchor());
}
else
{
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
0,bcd->name());
if (
!bcd->isReference() &&
//(bcd->hasDocumentation() || !hideClassFlag) &&
//(bcd->protection()!=Private || extractPrivateFlag)
bcd->isVisible()
) ol.writePageRef(bcd->name(),0);
}
parseText(ol,reimplFromLine.right(
reimplFromLine.length()-markerPos-2)); // text right from marker
}
else
{
ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
0,bcd->name());
if (
!bcd->isReference() &&
//(bcd->hasDocumentation() || !hideClassFlag) &&
//(bcd->protection()!=Private || extractPrivateFlag)
bcd->isVisible()
) ol.writePageRef(bcd->name(),0);
err("Error: translation error: no marker in trReimplementsFromList()\n");
}
ol.writeString(".");
//ol.writeString(".");
}
MemberList *bml=md->reimplementedBy();
int count;
......@@ -1193,16 +1257,53 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
{
// write the list of classes that overwrite this member
ol.newParagraph();
parseDoc(ol,0,0,theTranslator->trReimplementedIn());
//parseText(ol,theTranslator->trReimplementedIn());
//ol.writeString("Reimplemented in ");
ol.docify(" ");
//ol.docify(" ");
QString reimplInLine =
theTranslator->trReimplementedInList(bml->count());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in reimplInLine with links to the classes
while ((newIndex=marker.match(reimplInLine,index,&matchLen))!=-1)
{
parseText(ol,reimplInLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = reimplInLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
bmd=bml->at(entryIndex);
if (ok && bmd) // write link for marker
{
ClassDef *bcd = bmd->memberClass();
if (bmd->hasDocumentation() &&
(bmd->protection()!=Private || extractPrivateFlag)
)
{
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
bmd->anchor(),bcd->name());
if (!bcd->isReference() && bcd->isVisible())
ol.writePageRef(bcd->name(),bmd->anchor());
}
else
{
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
0,bcd->name());
if (!bcd->isReference() && bcd->isVisible())
ol.writePageRef(bcd->name(),0);
}
}
index=newIndex+matchLen;
}
parseText(ol,reimplInLine.right(reimplInLine.length()-index));
#if 0
bmd=bml->first();
while (bmd)
{
ClassDef *bcd = bmd->memberClass();
if (bmd->hasDocumentation())
{
ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
bmd->anchor(),bcd->name());
if (
!bcd->isReference() &&
......@@ -1214,7 +1315,7 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
}
else
{
ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
0,bcd->name());
if (
!bcd->isReference() &&
......@@ -1228,24 +1329,25 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
{
if (bml->at()==count-1)
//ol.writeString(" and ");
parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
#endif
}
// write the list of examples that use this member
if (md->hasExamples())
{
ol.startDescList();
ol.startBold();
parseDoc(ol,0,0,theTranslator->trExamples()+": ");
parseText(ol,theTranslator->trExamples()+": ");
//ol.writeBoldString("Examples: ");
ol.endBold();
ol.endDescTitle();
ol.writeDescItem();
md->writeExample(ol);
writeExample(ol,md->getExampleList());
//ol.endDescItem();
ol.endDescList();
}
......@@ -1388,8 +1490,7 @@ static QString trimTemplateSpecifiers(const QString &className,const QString &s)
// removes the (one and only) occurrence of name:: from s.
static QString trimScope(const QString &name,const QString &s)
{
int spos;
spos=s.find(name+"::");
int spos=s.find(name+"::");
if (spos!=-1)
{
return s.left(spos)+s.right(s.length()-spos-name.length()-2);
......@@ -1486,8 +1587,12 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
{
srcAType=trimScope(className,srcAType);
dstAType=trimScope(className,dstAType);
ClassDef *cd=getClass(className);
if (cd->baseClasses()->count()>0)
ClassDef *cd;
if (!namespaceName.isEmpty())
cd=getClass(namespaceName+"::"+className);
else
cd=getClass(className);
if (cd && cd->baseClasses()->count()>0)
{
srcAType=trimBaseClassScope(cd->baseClasses(),srcAType);
dstAType=trimBaseClassScope(cd->baseClasses(),dstAType);
......@@ -1703,17 +1808,19 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl)
// returns TRUE if the class and member both could be found
bool getDefs(const QString &memberName,const QString &className,
const char *args,MemberDef *&md, ClassDef *&cd, FileDef *&fd)
const char *args,
MemberDef *&md, ClassDef *&cd, FileDef *&fd,NamespaceDef *&nd)
{
//printf("Search for %s::%s %s\n",className.data(),memberName.data(),args);
fd=0; md=0; cd=0;
fd=0, md=0, cd=0, nd=0;
if (memberName.length()==0) return FALSE;
MemberName *mn;
if ((mn=memberNameDict[memberName]) && className.length()>0)
{
//printf(" >member name found\n");
ClassDef *fcd=0;
if ((fcd=getClass(className)))
//printf("className=%s\n",className.data());
if ((fcd=getClass(className)) && fcd->hasDocumentation())
{
//printf(" >member class found\n");
MemberDef *mmd=mn->first();
......@@ -1744,7 +1851,6 @@ bool getDefs(const QString &memberName,const QString &className,
mdist=m;
cd=mcd;
md=mmd;
fd=0;
}
}
if (argList)
......@@ -1778,7 +1884,6 @@ bool getDefs(const QString &memberName,const QString &className,
mdist=m;
cd=mcd;
md=mmd;
fd=0;
}
}
mmd=mn->next();
......@@ -1788,11 +1893,28 @@ bool getDefs(const QString &memberName,const QString &className,
return mdist<maxInheritanceDepth;
}
}
else // maybe an unrelated member ?
else // maybe an namespace or file member ?
{
MemberName *mn;
if ((mn=functionNameDict[memberName]))
if ((mn=functionNameDict[memberName])) // name is known
{
NamespaceDef *fnd=0;
if (className.length()>0 && (fnd=namespaceDict[className]) &&
fnd->hasDocumentation())
{ // inside a namespace
MemberDef *mmd=mn->first();
while (mmd)
{
if (mmd->getNamespace()==fnd && mmd->hasDocumentation())
{ // namespace is found
nd=fnd;
md=mmd;
return TRUE;
}
mmd=mn->next();
}
}
// maybe a file member (e.g. global function or variable)
md=mn->first();
while (md)
{
......@@ -1801,7 +1923,6 @@ bool getDefs(const QString &memberName,const QString &className,
fd=md->getFileDef();
if (fd && fd->hasDocumentation())
{
cd=0;
return TRUE;
}
}
......@@ -1828,12 +1949,18 @@ void generateClassRef(OutputList &ol,const char *clName,const char *linkTxt)
ol.docify(linkText);
return;
}
ClassDef *cd;
ClassDef *cd=0;
NamespaceDef *nd=0;
if ((cd=getClass(className)) && cd->isVisible())
{
ol.writeObjectLink(cd->getReference(),cd->classFile(),0,linkText);
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,linkText);
if (!cd->isReference()) ol.writePageRef(cd->name(),0);
}
else if ((nd=namespaceDict[className]) && nd->hasDocumentation())
{
ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,linkText);
ol.writePageRef(nd->name(),0);
}
else
ol.docify(linkText);
}
......@@ -1887,8 +2014,11 @@ void generateRef(OutputList &ol,const char *clName,
}
// extract scope
QString scopeStr;
if (scopePos>0) scopeStr=tmpName.left(scopePos); else scopeStr=clName;
QString scopeContext=clName;
QString scopeUser;
if (scopePos>0) scopeUser=tmpName.left(scopePos);
//printf("scopeContext=%s scopeUser=%s\n",scopeContext.data(),scopeUser.data());
// extract name
int startNamePos=scopePos!=-1 ? scopePos+2 : 0;
......@@ -1898,96 +2028,115 @@ void generateRef(OutputList &ol,const char *clName,
// extract arguments
QString argsStr;
if (bracePos!=-1) argsStr=tmpName.right(tmpName.length()-bracePos);
bool explicitLink=TRUE;
// create a default link text if none was explicitly given
bool explicitLink=TRUE;
if (linkText.isNull())
{
if (!scopeStr.isNull() && scopePos>0) linkText=scopeStr+"::";
if (!scopeUser.isEmpty()) linkText=scopeUser+"::";
linkText+=nameStr;
explicitLink=FALSE;
}
//printf("scope=`%s' name=`%s' arg=`%s' linkText=`%s'\n",
// scopeStr.data(),nameStr.data(),argsStr.data(),linkText.data());
//Define *d=0;
MemberDef *md;
ClassDef *cd;
FileDef *fd;
// check if nameStr is a member or global.
if (getDefs(nameStr,scopeStr,argsStr,md,cd,fd))
{
QString anchor = md->hasDocumentation() ? md->anchor() : 0;
QString cName,aName;
if (cd) // nameStr is a member of cd
{
//printf("addObjectLink(%s,%s,%s,%s)\n",cd->getReference(),
// cd->classFile(),anchor.data(),resultName.stripWhiteSpace().data());
ol.writeObjectLink(cd->getReference(),
cd->classFile(),anchor,
linkText.stripWhiteSpace());
cName=cd->name();
aName=md->anchor();
}
else if (fd) // nameStr is a global in file fd
{
//printf("addFileLink(%s,%s,%s)\n",fd->diskName(),anchor.data(),
// resultName.stripWhiteSpace().data());
ol.writeObjectLink(fd->getReference(),fd->diskName(),
anchor, linkText.stripWhiteSpace());
cName=fd->name();
aName=md->anchor();
}
else // should not be reached
MemberDef *md = 0;
ClassDef *cd = 0;
FileDef *fd = 0;
NamespaceDef *nd = 0;
int scopeOffset=scopeContext.length();
do
{
QString totalScope=scopeUser.copy();
if (scopeOffset>0)
{
//printf("add no link fd=cd=0\n");
ol.docify(linkText);
if (!totalScope.isEmpty()) totalScope.prepend("::");
totalScope.prepend(scopeContext.left(scopeOffset));
}
// for functions we add the arguments if explicitly specified or else "()"
if (!rt && (md->isFunction() || md->isPrototype() || md->isSignal() || md->isSlot()))
//printf("Try with totalScope=`%s'\n",totalScope.data());
// check if nameStr is a member or global.
if (getDefs(nameStr,totalScope,argsStr,md,cd,fd,nd))
{
if (argsStr.isNull())
ol.writeString("()");
else
ol.docify(argsStr);
}
// generate the page reference (for LaTeX)
if (cName.length()>0 || aName.length()>0)
{
if (/*md->detailsAreVisible() &&*/
(
(cd && !cd->isReference() &&
// (cd->hasDocumentation() || !hideClassFlag) &&
// (cd->protection()!=Private || extractPrivateFlag)
cd->isVisible()
) ||
(fd && !fd->isReference())
)
) ol.writePageRef(cName,aName);
QString anchor = md->hasDocumentation() ? md->anchor() : 0;
QString cName,aName;
if (cd) // nameStr is a member of cd
{
//printf("addObjectLink(%s,%s,%s,%s)\n",cd->getReference(),
// cd->getOutputFileBase(),anchor.data(),resultName.stripWhiteSpace().data());
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
anchor,linkText.stripWhiteSpace());
cName=cd->name();
aName=md->anchor();
}
else if (nd) // nameStr is a member of nd
{
ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),
anchor,linkText.stripWhiteSpace());
cName=nd->name();
aName=md->anchor();
}
else if (fd) // nameStr is a global in file fd
{
//printf("addFileLink(%s,%s,%s)\n",fd->getOutputFileBase(),anchor.data(),
// resultName.stripWhiteSpace().data());
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),
anchor,linkText.stripWhiteSpace());
cName=fd->name();
aName=md->anchor();
}
else // should not be reached
{
//printf("add no link fd=cd=0\n");
ol.docify(linkText);
}
// for functions we add the arguments if explicitly specified or else "()"
if (!rt && (md->isFunction() || md->isPrototype() || md->isSignal() || md->isSlot()))
{
if (argsStr.isNull())
ol.writeString("()");
else
ol.docify(argsStr);
}
// generate the page reference (for LaTeX)
if (cName.length()>0 || aName.length()>0)
{
if (
(cd && !cd->isReference() && cd->isVisible()) ||
(fd && !fd->isReference()) ||
(nd /* TODO: && !nd->isReference() */)
)
{
ol.writePageRef(cName,aName);
}
}
return;
}
}
// else if (!nameStr.isNull() && (d=defineDict[nameStr]))
// // check if nameStr is perhaps a define
// {
// if (d->hasDocumentation() && d->fileDef)
// {
// ol.writeObjectLink(0,d->fileDef->diskName(),d->anchor,
// linkText.stripWhiteSpace());
// if (!explicitLink) ol.docify(argsStr);
// }
// }
else // nameStr is a false alarm or a typo.
// else if (!nameStr.isNull() && (d=defineDict[nameStr]))
// // check if nameStr is perhaps a define
// {
// if (d->hasDocumentation() && d->fileDef)
// {
// ol.writeObjectLink(0,d->fileDef->getOutputFileBase(),d->anchor,
// linkText.stripWhiteSpace());
// if (!explicitLink) ol.docify(argsStr);
// }
// }
if (scopeOffset==0)
scopeOffset=-1;
else if ((scopeOffset=scopeContext.findRev("::",scopeOffset-1))==-1)
scopeOffset=0;
} while (scopeOffset>=0);
// nothing found
if (rt)
ol.docify(rt);
else
{
if (rt)
ol.docify(rt);
else
{
ol.docify(linkText);
if (!argsStr.isNull()) ol.docify(argsStr);
}
ol.docify(linkText);
if (!argsStr.isNull()) ol.docify(argsStr);
}
return;
}
......@@ -2016,7 +2165,7 @@ void generateLink(OutputList &ol,const char *clName,
else if ((fd=findFileDef(&inputNameDict,linkRef,ambig))
&& fd->hasDocumentation())
// link to documented input file
ol.writeObjectLink(fd->getReference(),fd->diskName(),0,lt);
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,lt);
else // probably a class or member reference
generateRef(ol,clName,lr,inSeeBlock,lt);
}
......@@ -2030,7 +2179,7 @@ void generateFileRef(OutputList &ol,const char *name,const char *text)
if ((fd=findFileDef(&inputNameDict,name,ambig)) &&
fd->hasDocumentation())
// link to documented input file
ol.writeObjectLink(fd->getReference(),fd->diskName(),0,linkText);
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,linkText);
else
ol.docify(linkText);
}
......@@ -2172,3 +2321,17 @@ void showFileDefMatches(const FileNameDict *fnDict,const char *n)
}
}
//----------------------------------------------------------------------
void setFileNameForSections(QList<QString> *anchorList,const char *fileName)
{
if (!anchorList) return;
QString *s=anchorList->first();
while (s)
{
SectionInfo *si;
if (!s->isEmpty() && (si=sectionDict[*s])) si->fileName=fileName;
s=anchorList->next();
}
}
......@@ -46,7 +46,8 @@ extern QString dateToString(bool);
//extern OutputList linkifyText(const char *clName,const char *name,
// const char *text);
extern bool getDefs(const QString &memberName,const QString &className,
const char *, MemberDef *&md, ClassDef *&cd,FileDef *&fd);
const char *, MemberDef *&md, ClassDef *&cd,FileDef *&fd,
NamespaceDef *&nd);
extern void generateRef(OutputList &ol,const char *,
const char *,bool inSeeBlock,const char * =0);
extern void generateLink(OutputList &ol,const char *,
......@@ -78,5 +79,8 @@ void startFile(OutputList &ol,const char *name,
void endFile(OutputList &ol,bool external=FALSE);
void writeQuickLinks(OutputList &ol,bool compact,bool external=FALSE);
QString argListToString(ArgumentList *al);
QString generateMarker(int id);
void writeExample(OutputList &ol,ExampleList *el);
void setFileNameForSections(QList<QString> *anchorList,const char *fileName);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment