Commit 329a4ddc authored by albert-github's avatar albert-github

Limit images sizes and make more uniform (LaTeX)

This patch adjusts some problems regarding image sizes in LaTeX output of doxygen (a.o. Bug 738299 - When using msc or PlantUML, the default latex for the created image should include [width=\linewidth]) this has been done is such a way that all the "image" commands (i.e. image, dot, dotfile, msc, mscfile, diafile, startuml) operate in a similar way / have the same possibilities.

- commands.doc
Adjusted documentation to reflect changes.

- cmdmapper.cpp
- cmdmapper.h
Added utility function to map command id back to command name

- doctokenizer.h
- doctokenizer.l
Handle Caption  and Size indication. Required also that some other rules had to be tightened a bit (like usage of {} in startuml and usage of "" for captions. This was already described in the documentation in this way).

- docparser.cpp
- docparser.h
Created routine to uniformly handle the Caption and size indications and store them in a general way.

- latexgen.cpp
Replaced graphicx package by adjustbox package (includes graphicx) to support "min width" etc.

- doxygen.sty templates\latex
Added commands to make commands with and without caption behave similar.

- docbookvisitor.cpp
- docbookvisitor.h
- htmldocvisitor.cpp
- latexdocvisitor.cpp
- latexdocvisitor.h
- printdocvisitor.h
- xmldocvisitor.cpp
Created routine to uniformly handle the Caption and size indications in a general way.

- indexpage.xml (testing\022)
- indexpage.xml (testing\031)
- class_receiver.xml (testing\037)
- class_sender.xml (testing\037)
Adjusted example output.
parent 0fea3d4c
...@@ -2451,13 +2451,25 @@ only copy the detailed documentation, not the brief description. ...@@ -2451,13 +2451,25 @@ only copy the detailed documentation, not the brief description.
\ref cmdhtmlonly "\\htmlonly". \ref cmdhtmlonly "\\htmlonly".
<hr> <hr>
\section cmddot \\dot \section cmddot \\dot ["caption"] [<sizeindication>=<size>]
\addindex \\dot \addindex \\dot
Starts a text fragment which should contain a valid description of a Starts a text fragment which should contain a valid description of a
dot graph. The text fragment ends with \ref cmdenddot "\\enddot". dot graph. The text fragment ends with \ref cmdenddot "\\enddot".
Doxygen will pass the text on to dot and include the resulting Doxygen will pass the text on to dot and include the resulting
image (and image map) into the output. image (and image map) into the output.
The first argument is optional and can be used to specify the caption
that is displayed below the image. This argument has to be specified
between quotes even if it does not contain any spaces. The quotes are
stripped before the caption is displayed.
The second argument is also optional and can be used to specify the
width or height of the image.
For a descriptionm of the possibilities see the paragraph
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
The nodes of a graph can be made clickable by using the URL attribute. The nodes of a graph can be made clickable by using the URL attribute.
By using the command \ref cmdref "\\ref" inside the URL value you can conveniently By using the command \ref cmdref "\\ref" inside the URL value you can conveniently
link to an item inside doxygen. Here is an example: link to an item inside doxygen. Here is an example:
...@@ -2485,12 +2497,24 @@ class C {}; ...@@ -2485,12 +2497,24 @@ class C {};
\endcode \endcode
<hr> <hr>
\section cmdmsc \\msc \section cmdmsc \\msc ["caption"] [<sizeindication>=<size>]
\addindex \\msc \addindex \\msc
Starts a text fragment which should contain a valid description of a Starts a text fragment which should contain a valid description of a
message sequence chart. See http://www.mcternan.me.uk/mscgen/ for examples. message sequence chart. See http://www.mcternan.me.uk/mscgen/ for examples.
The text fragment ends with \ref cmdendmsc "\\endmsc". The text fragment ends with \ref cmdendmsc "\\endmsc".
The first argument is optional and can be used to specify the caption
that is displayed below the image. This argument has to be specified
between quotes even if it does not contain any spaces. The quotes are
stripped before the caption is displayed.
The second argument is also optional and can be used to specify the
width or height of the image.
For a descriptionm of the possibilities see the paragraph
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
\note The text fragment should only include the part of the message \note The text fragment should only include the part of the message
sequence chart that is sequence chart that is
within the <code>msc {...}</code> block. within the <code>msc {...}</code> block.
...@@ -2534,7 +2558,7 @@ class Receiver ...@@ -2534,7 +2558,7 @@ class Receiver
\sa section \ref cmdmscfile "\\mscfile". \sa section \ref cmdmscfile "\\mscfile".
<hr> <hr>
\section cmdstartuml \\startuml \section cmdstartuml \\startuml [{file}] ["caption"] [<sizeindication>=<size>]
\addindex \\startuml \addindex \\startuml
Starts a text fragment which should contain a valid description of a Starts a text fragment which should contain a valid description of a
...@@ -2544,6 +2568,28 @@ class Receiver ...@@ -2544,6 +2568,28 @@ class Receiver
if you want to use this command. The location of the jar file should be specified if you want to use this command. The location of the jar file should be specified
using \ref cfg_plantuml_jar_path "PLANTUML_JAR_PATH". using \ref cfg_plantuml_jar_path "PLANTUML_JAR_PATH".
The first argument is optional and is for compatibility with running PlantUML as a preprocessing
step before running doxygen, you can also add the name of the image file after \c \\startuml
and inside curly brackets, i.e.
\verbatim
@startuml{myimage.png}
Alice -> Bob : Hello
@enduml
\endverbatim
When the name of the image is specified, doxygen will generate an image with that name.
Without the name doxygen will choose a name automatically.
The second argument is optional and can be used to specify the caption
that is displayed below the image. This argument has to be specified
between quotes even if it does not contain any spaces. The quotes are
stripped before the caption is displayed.
The third argument is also optional and can be used to specify the
width or height of the image.
For a descriptionm of the possibilities see the paragraph
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
Here is an example of the use of the \c \\startuml command. Here is an example of the use of the \c \\startuml command.
\code \code
/** Sender class. Can be used to send a command to the server. /** Sender class. Can be used to send a command to the server.
...@@ -2575,19 +2621,8 @@ class Receiver ...@@ -2575,19 +2621,8 @@ class Receiver
}; };
\endcode \endcode
\note For compatibility with running PlantUML as a preprocessing step before
running doxygen, you can also add the name of the image file after \c \\startuml
and inside curly brackets, i.e.
\verbatim
@startuml{myimage.png}
Alice -> Bob : Hello
@enduml
\endverbatim
When the name of the image is specified, doxygen will generate an image with that name.
Without the name doxygen will choose a name automatically.
<hr> <hr>
\section cmddotfile \\dotfile <file> ["caption"] \section cmddotfile \\dotfile <file> ["caption"] [<sizeindication>=<size>]
\addindex \\dotfile \addindex \\dotfile
Inserts an image generated by dot from \<file\> into the documentation. Inserts an image generated by dot from \<file\> into the documentation.
...@@ -2604,8 +2639,16 @@ Without the name doxygen will choose a name automatically. ...@@ -2604,8 +2639,16 @@ Without the name doxygen will choose a name automatically.
between quotes even if it does not contain any spaces. The quotes are between quotes even if it does not contain any spaces. The quotes are
stripped before the caption is displayed. stripped before the caption is displayed.
The third argument is also optional and can be used to specify the
width or height of the image.
For a descriptionm of the possibilities see the paragraph
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
\sa section \ref cmddot "\\dot".
<hr> <hr>
\section cmdmscfile \\mscfile <file> ["caption"] \section cmdmscfile \\mscfile <file> ["caption"] [<sizeindication>=<size>]
\addindex \\mscfile \addindex \\mscfile
Inserts an image generated by mscgen from \<file\> into the documentation. Inserts an image generated by mscgen from \<file\> into the documentation.
...@@ -2623,10 +2666,16 @@ Without the name doxygen will choose a name automatically. ...@@ -2623,10 +2666,16 @@ Without the name doxygen will choose a name automatically.
between quotes even if it does not contain any spaces. The quotes are between quotes even if it does not contain any spaces. The quotes are
stripped before the caption is displayed. stripped before the caption is displayed.
The third argument is also optional and can be used to specify the
width or height of the image.
For a descriptionm of the possibilities see the paragraph
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
\sa section \ref cmdmsc "\\msc". \sa section \ref cmdmsc "\\msc".
<hr> <hr>
\section cmddiafile \\diafile <file> ["caption"] \section cmddiafile \\diafile <file> ["caption"] [<sizeindication>=<size>]
\addindex \\diafile \addindex \\diafile
Inserts an image made in dia from \<file\> into the documentation. Inserts an image made in dia from \<file\> into the documentation.
...@@ -2643,6 +2692,12 @@ Without the name doxygen will choose a name automatically. ...@@ -2643,6 +2692,12 @@ Without the name doxygen will choose a name automatically.
between quotes even if it does not contain any spaces. The quotes are between quotes even if it does not contain any spaces. The quotes are
stripped before the caption is displayed. stripped before the caption is displayed.
The third argument is also optional and can be used to specify the
width or height of the image.
For a descriptionm of the possibilities see the paragraph
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
<hr> <hr>
\section cmde \\e <word> \section cmde \\e <word>
...@@ -2843,7 +2898,7 @@ Without the name doxygen will choose a name automatically. ...@@ -2843,7 +2898,7 @@ Without the name doxygen will choose a name automatically.
format you'll have to repeat this command for each format. format you'll have to repeat this command for each format.
The first argument specifies the output format. Currently, the The first argument specifies the output format. Currently, the
following values are supported: \c html, \c latex and \c rtf. following values are supported: \c html, \c latex, \c docbook and \c rtf.
The second argument specifies the file name of the image. The second argument specifies the file name of the image.
doxygen will look for files in the paths (or files) that you specified doxygen will look for files in the paths (or files) that you specified
...@@ -2859,12 +2914,16 @@ Without the name doxygen will choose a name automatically. ...@@ -2859,12 +2914,16 @@ Without the name doxygen will choose a name automatically.
spaces. The quotes are stripped before the caption is displayed. spaces. The quotes are stripped before the caption is displayed.
The fourth argument is also optional and can be used to specify the The fourth argument is also optional and can be used to specify the
width or height of the image. This is only useful width or height of the image. This can be useful for \LaTeX output
for \LaTeX output (i.e. format=<code>latex</code>).
(i.e. format=<code>latex</code>). The \c sizeindication can be \anchor image_sizeindicator \par Size indication
either \c width or \c height. The size should be a valid The \c sizeindication can
size specifier in \LaTeX (for example <code>10cm</code> or specify the width or height to be used )or a combination). Possible
<code>6in</code> or a symbolic width like <code>\\textwidth</code>). values are (width, analogous for height):
`width` or `max with` or `min width`. The size should be a valid
size specifier in \LaTeX (for example `10cm` or
`6in` or a symbolic width like `\\textwidth`). (The `max width` etc.
are based on the \LaTeX package `adjustbox`)
Here is example of a comment block: Here is example of a comment block:
......
...@@ -226,6 +226,16 @@ int Mapper::map(const char *n) ...@@ -226,6 +226,16 @@ int Mapper::map(const char *n)
return !name.isEmpty() && (result=m_map.find(name)) ? *result: 0; return !name.isEmpty() && (result=m_map.find(name)) ? *result: 0;
} }
QString Mapper::map(const int n)
{
QDictIterator<int> mapIterator(m_map);
for (int *curVal = mapIterator.toFirst();curVal = mapIterator.current();++mapIterator)
{
if (*curVal == n || (*curVal == (n | SIMPLESECT_BIT))) return mapIterator.currentKey();
}
return NULL;
}
Mapper::Mapper(const CommandMap *cm,bool caseSensitive) : m_map(89), m_cs(caseSensitive) Mapper::Mapper(const CommandMap *cm,bool caseSensitive) : m_map(89), m_cs(caseSensitive)
{ {
m_map.setAutoDelete(TRUE); m_map.setAutoDelete(TRUE);
......
...@@ -201,6 +201,7 @@ class Mapper ...@@ -201,6 +201,7 @@ class Mapper
{ {
public: public:
int map(const char *n); int map(const char *n);
QString map(const int n);
Mapper(const CommandMap *cm,bool caseSensitive); Mapper(const CommandMap *cm,bool caseSensitive);
private: private:
QDict<int> m_map; QDict<int> m_map;
......
...@@ -36,6 +36,68 @@ ...@@ -36,6 +36,68 @@
#include "htmlentity.h" #include "htmlentity.h"
#include "plantuml.h" #include "plantuml.h"
static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, QCString width, QCString height)
{
QCString tmpStr;
t << " <figure>" << endl;
t << " <title></title>" << endl;
t << " <mediaobject>" << endl;
t << " <imageobject>" << endl;
t << " <imagedata";
if (!width.isEmpty())
{
tmpStr = width;
tmpStr = tmpStr.replace(QRegExp("min *width"),"minwidth");
tmpStr = tmpStr.replace(QRegExp("max *width"),"maxwidth");
tmpStr = tmpStr.replace(QRegExp("="),"=\"");
tmpStr = tmpStr.replace(QRegExp(","),"\" ") + "\"";
tmpStr = tmpStr.replace(QRegExp("\"\""),"\"");
tmpStr = tmpStr.replace(QRegExp("\\"),"\\\\");
t << " " << tmpStr;
}
else
{
t << " width=\"50%\"";
}
if (!height.isEmpty())
{
tmpStr = height;
tmpStr = tmpStr.replace(QRegExp("min *height"),"mindepth");
tmpStr = tmpStr.replace(QRegExp("max *height"),"maxdepth");
tmpStr = tmpStr.replace(QRegExp("height="),"depth=");
tmpStr = tmpStr.replace(QRegExp("="),"=\"");
tmpStr = tmpStr.replace(QRegExp(","),"\" ") + "\"";
tmpStr = tmpStr.replace(QRegExp("\"\""),"\"");
tmpStr = tmpStr.replace(QRegExp("\\"),"\\\\");
t << " " << tmpStr;
}
t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << name << "\">";
t << "</imagedata>" << endl;
t << " </imageobject>" << endl;
if (hasCaption)
{
t << " <caption>" << endl;
}
}
static void visitPostEnd(FTextStream &t, const bool hasCaption)
{
t << endl;
if (hasCaption)
{
t << " </caption>" << endl;
}
t << " </mediaobject>" << endl;
t << " </figure>" << endl;
}
static void visitCaption(DocbookDocVisitor *parent, QList<DocNode> children)
{
QListIterator<DocNode> cli(children);
DocNode *n;
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
}
DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci) DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
: DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
{ {
...@@ -205,14 +267,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s) ...@@ -205,14 +267,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
} }
file.writeBlock( stext, stext.length() ); file.writeBlock( stext, stext.length() );
file.close(); file.close();
m_t << " <figure>" << endl; writeDotFile(baseName, s);
m_t << " <title>" << name << "</title>" << endl;
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
writeDotFile(baseName);
m_t << " </imageobject>" << endl;
m_t << " </mediaobject>" << endl;
m_t << " </figure>" << endl;
m_t << "</para>" << endl; m_t << "</para>" << endl;
} }
break; break;
...@@ -238,14 +293,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s) ...@@ -238,14 +293,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
text+="}"; text+="}";
file.writeBlock( text, text.length() ); file.writeBlock( text, text.length() );
file.close(); file.close();
m_t << " <figure>" << endl; writeMscFile(baseName,s);
m_t << " <title>" << name << "</title>" << endl;
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
writeMscFile(baseName);
m_t << " </imageobject>" << endl;
m_t << " </mediaobject>" << endl;
m_t << " </figure>" << endl;
m_t << "</para>" << endl; m_t << "</para>" << endl;
} }
break; break;
...@@ -259,14 +307,8 @@ void DocbookDocVisitor::visit(DocVerbatim *s) ...@@ -259,14 +307,8 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
{ {
shortName=shortName.right(shortName.length()-i-1); shortName=shortName.right(shortName.length()-i-1);
} }
m_t << " <figure>" << endl; m_t << "<para>" << endl;
m_t << " <title>" << shortName << "</title>" << endl; writePlantUMLFile(baseName,s);
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
writePlantUMLFile(baseName);
m_t << " </imageobject>" << endl;
m_t << " </mediaobject>" << endl;
m_t << " </figure>" << endl;
m_t << "</para>" << endl; m_t << "</para>" << endl;
} }
break; break;
...@@ -850,8 +892,13 @@ void DocbookDocVisitor::visitPre(DocImage *img) ...@@ -850,8 +892,13 @@ void DocbookDocVisitor::visitPre(DocImage *img)
{ {
if (m_hide) return; if (m_hide) return;
m_t << endl; m_t << endl;
m_t << " <figure>" << endl; QCString baseName=img->name();
m_t << " <title>"; int i;
if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
}
visitPreStart(m_t, img -> hasCaption(), baseName, img -> width(), img -> height());
} }
else else
{ {
...@@ -865,39 +912,14 @@ void DocbookDocVisitor::visitPost(DocImage *img) ...@@ -865,39 +912,14 @@ void DocbookDocVisitor::visitPost(DocImage *img)
if (img->type()==DocImage::DocBook) if (img->type()==DocImage::DocBook)
{ {
if (m_hide) return; if (m_hide) return;
QCString typevar; visitPostEnd(m_t, img -> hasCaption());
m_t << "</title>" << endl; // copy the image to the output dir
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
QCString baseName=img->name(); QCString baseName=img->name();
int i; int i;
if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1) if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
{ {
baseName=baseName.right(baseName.length()-i-1); baseName=baseName.right(baseName.length()-i-1);
} }
m_t << " <imagedata";
if (!img->width().isEmpty())
{
m_t << " width=\"";
filter(img->width());
m_t << "\"";
}
else
{
m_t << " width=\"50%\"";
}
if (!img->height().isEmpty())
{
m_t << " depth=\"";
filter(img->height());
m_t << "\"";
}
m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "\">";
m_t << "</imagedata>" << endl;
m_t << " </imageobject>" << endl;
m_t << " </mediaobject>" << endl;
m_t << " </figure>" << endl;
// copy the image to the output dir
QCString m_file; QCString m_file;
bool ambig; bool ambig;
FileDef *fd=findFileDef(Doxygen::imageNameDict, baseName, ambig); FileDef *fd=findFileDef(Doxygen::imageNameDict, baseName, ambig);
...@@ -1203,7 +1225,7 @@ void DocbookDocVisitor::popEnabled() ...@@ -1203,7 +1225,7 @@ void DocbookDocVisitor::popEnabled()
delete v; delete v;
} }
void DocbookDocVisitor::writeMscFile(const QCString &baseName) void DocbookDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s)
{ {
QCString shortName = baseName; QCString shortName = baseName;
int i; int i;
...@@ -1213,13 +1235,12 @@ void DocbookDocVisitor::writeMscFile(const QCString &baseName) ...@@ -1213,13 +1235,12 @@ void DocbookDocVisitor::writeMscFile(const QCString &baseName)
} }
QCString outDir = Config_getString("DOCBOOK_OUTPUT"); QCString outDir = Config_getString("DOCBOOK_OUTPUT");
writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP); writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP);
m_t << " <imagedata"; visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
m_t << " width=\"50%\""; visitCaption(this, s->m_children);
m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << ".png" << "\">"; visitPostEnd(m_t, s->hasCaption());
m_t << "</imagedata>" << endl;
} }
void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName) void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName, DocVerbatim *s)
{ {
QCString shortName = baseName; QCString shortName = baseName;
int i; int i;
...@@ -1229,10 +1250,9 @@ void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName) ...@@ -1229,10 +1250,9 @@ void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName)
} }
QCString outDir = Config_getString("DOCBOOK_OUTPUT"); QCString outDir = Config_getString("DOCBOOK_OUTPUT");
generatePlantUMLOutput(baseName,outDir,PUML_BITMAP); generatePlantUMLOutput(baseName,outDir,PUML_BITMAP);
m_t << " <imagedata"; visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
m_t << " width=\"50%\""; visitCaption(this, s->m_children);
m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << ".png" << "\">"; visitPostEnd(m_t, s->hasCaption());
m_t << "</imagedata>" << endl;
} }
void DocbookDocVisitor::startMscFile(const QCString &fileName, void DocbookDocVisitor::startMscFile(const QCString &fileName,
...@@ -1255,50 +1275,17 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName, ...@@ -1255,50 +1275,17 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName,
QCString outDir = Config_getString("DOCBOOK_OUTPUT"); QCString outDir = Config_getString("DOCBOOK_OUTPUT");
writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP); writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
m_t << "<para>" << endl; m_t << "<para>" << endl;
m_t << " <figure>" << endl; visitPreStart(m_t, hasCaption, baseName + ".png", width, height);
m_t << " <title></title>" << endl;
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
m_t << " <imagedata";
if (!width.isEmpty())
{
m_t << " width=\"";
m_t << width;
m_t << "\"";
}
else
{
m_t << " width=\"50%\"";
}
if (!height.isEmpty())
{
m_t << " depth=\"";
m_t << height;
m_t << "\"";
}
m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << ".png" << "\">";
m_t << "</imagedata>" << endl;
m_t << " </imageobject>" << endl;
if (hasCaption)
{
m_t << " <caption>" << endl;
}
} }
void DocbookDocVisitor::endMscFile(bool hasCaption) void DocbookDocVisitor::endMscFile(bool hasCaption)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "endl"; visitPostEnd(m_t, hasCaption);
if (hasCaption)
{
m_t << " </caption>" << endl;
}
m_t << " </mediaobject>" << endl;
m_t << " </figure>" << endl;
m_t << "</para>" << endl; m_t << "</para>" << endl;
} }
void DocbookDocVisitor::writeDiaFile(const QCString &baseName) void DocbookDocVisitor::writeDiaFile(const QCString &baseName, DocVerbatim *s)
{ {
QCString shortName = baseName; QCString shortName = baseName;
int i; int i;
...@@ -1308,9 +1295,9 @@ void DocbookDocVisitor::writeDiaFile(const QCString &baseName) ...@@ -1308,9 +1295,9 @@ void DocbookDocVisitor::writeDiaFile(const QCString &baseName)
} }
QCString outDir = Config_getString("DOCBOOK_OUTPUT"); QCString outDir = Config_getString("DOCBOOK_OUTPUT");
writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_BITMAP); writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_BITMAP);
m_t << " <imagedata"; visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">"; visitCaption(this, s->m_children);
m_t << "</imagedata>" << endl; visitPostEnd(m_t, s->hasCaption());
} }
void DocbookDocVisitor::startDiaFile(const QCString &fileName, void DocbookDocVisitor::startDiaFile(const QCString &fileName,
...@@ -1333,46 +1320,17 @@ void DocbookDocVisitor::startDiaFile(const QCString &fileName, ...@@ -1333,46 +1320,17 @@ void DocbookDocVisitor::startDiaFile(const QCString &fileName,
QCString outDir = Config_getString("DOCBOOK_OUTPUT"); QCString outDir = Config_getString("DOCBOOK_OUTPUT");
writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP); writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP);
m_t << "<para>" << endl; m_t << "<para>" << endl;
m_t << " <figure>" << endl; visitPreStart(m_t, hasCaption, baseName + ".png", width, height);
m_t << " <title></title>" << endl;
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
m_t << " <imagedata";
if (!width.isEmpty())
{
m_t << " width=\"";
m_t << width;
m_t << "\"";
}
else if (!height.isEmpty())
{
m_t << " depth=\"";
m_t << height;
m_t << "\"";
}
m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">";
m_t << "</imagedata>" << endl;
m_t << " </imageobject>" << endl;
if (hasCaption)
{
m_t << " <caption>" << endl;
}
} }
void DocbookDocVisitor::endDiaFile(bool hasCaption) void DocbookDocVisitor::endDiaFile(bool hasCaption)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "endl"; visitPostEnd(m_t, hasCaption);
if (hasCaption)
{
m_t << " </caption>" << endl;
}
m_t << " </mediaobject>" << endl;
m_t << " </figure>" << endl;
m_t << "</para>" << endl; m_t << "</para>" << endl;
} }
void DocbookDocVisitor::writeDotFile(const QCString &baseName) void DocbookDocVisitor::writeDotFile(const QCString &baseName, DocVerbatim *s)
{ {
QCString shortName = baseName; QCString shortName = baseName;
int i; int i;
...@@ -1383,11 +1341,9 @@ void DocbookDocVisitor::writeDotFile(const QCString &baseName) ...@@ -1383,11 +1341,9 @@ void DocbookDocVisitor::writeDotFile(const QCString &baseName)
QCString outDir = Config_getString("DOCBOOK_OUTPUT"); QCString outDir = Config_getString("DOCBOOK_OUTPUT");
QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP); writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP);
m_t << " <imagedata"; visitPreStart(m_t, s->hasCaption(), baseName + ".dot", s->width(),s->height());
//If no width is specified use default value for PDF rendering visitCaption(this, s->m_children);
m_t << " width=\"50%\""; visitPostEnd(m_t, s->hasCaption());
m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << "." << imgExt << "\">";
m_t << "</imagedata>" << endl;
} }
void DocbookDocVisitor::startDotFile(const QCString &fileName, void DocbookDocVisitor::startDotFile(const QCString &fileName,
...@@ -1411,46 +1367,14 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName, ...@@ -1411,46 +1367,14 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName,
QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP); writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP);
m_t << "<para>" << endl; m_t << "<para>" << endl;
m_t << " <figure>" << endl; visitPreStart(m_t, hasCaption, baseName + "." + imgExt, width, height);
m_t << " <title></title>" << endl;
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
m_t << " <imagedata";
if (!width.isEmpty())
{
m_t << " width=\"";
m_t << width;
m_t << "\"";
}
else
{
m_t << " width=\"50%\"";
}
if (!height.isEmpty())
{
m_t << " depth=\"";
m_t << height;
m_t << "\"";
}
m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "." << imgExt << "\">";
m_t << "</imagedata>" << endl;
m_t << " </imageobject>" << endl;
if (hasCaption)
{
m_t << " <caption>" << endl;
}
} }
void DocbookDocVisitor::endDotFile(bool hasCaption) void DocbookDocVisitor::endDotFile(bool hasCaption)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "endl"; m_t << endl;
if (hasCaption) visitPostEnd(m_t, hasCaption);
{
m_t << " </caption>" << endl;
}
m_t << " </mediaobject>" << endl;
m_t << " </figure>" << endl;
m_t << "</para>" << endl; m_t << "</para>" << endl;
} }
...@@ -147,16 +147,16 @@ class DocbookDocVisitor : public DocVisitor ...@@ -147,16 +147,16 @@ class DocbookDocVisitor : public DocVisitor
void startMscFile(const QCString &fileName,const QCString &width, void startMscFile(const QCString &fileName,const QCString &width,
const QCString &height, bool hasCaption); const QCString &height, bool hasCaption);
void endMscFile(bool hasCaption); void endMscFile(bool hasCaption);
void writeMscFile(const QCString &fileName); void writeMscFile(const QCString &fileName, DocVerbatim *s);
void startDiaFile(const QCString &fileName,const QCString &width, void startDiaFile(const QCString &fileName,const QCString &width,
const QCString &height, bool hasCaption); const QCString &height, bool hasCaption);
void endDiaFile(bool hasCaption); void endDiaFile(bool hasCaption);
void writeDiaFile(const QCString &fileName); void writeDiaFile(const QCString &fileName, DocVerbatim *s);
void startDotFile(const QCString &fileName,const QCString &width, void startDotFile(const QCString &fileName,const QCString &width,
const QCString &height, bool hasCaption); const QCString &height, bool hasCaption);
void endDotFile(bool hasCaption); void endDotFile(bool hasCaption);
void writeDotFile(const QCString &fileName); void writeDotFile(const QCString &fileName, DocVerbatim *s);
void writePlantUMLFile(const QCString &fileName); void writePlantUMLFile(const QCString &fileName, DocVerbatim *s);
//-------------------------------------- //--------------------------------------
// state variables // state variables
//-------------------------------------- //--------------------------------------
......
...@@ -818,6 +818,8 @@ static bool findDocsForMemberOrCompound(const char *commandName, ...@@ -818,6 +818,8 @@ static bool findDocsForMemberOrCompound(const char *commandName,
static bool defaultHandleToken(DocNode *parent,int tok, static bool defaultHandleToken(DocNode *parent,int tok,
QList<DocNode> &children,bool QList<DocNode> &children,bool
handleWord=TRUE); handleWord=TRUE);
static void defaultHandleCaptionSize(const int cmd, DocNode *parent, QList<DocNode> &children,
QCString &height, QCString &width);
static int handleStyleArgument(DocNode *parent,QList<DocNode> &children, static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
...@@ -1220,6 +1222,135 @@ static DocAnchor *handleAnchor(DocNode *parent) ...@@ -1220,6 +1222,135 @@ static DocAnchor *handleAnchor(DocNode *parent)
} }
/* Helper function that deals with the Caption and size argument.
* @param parent Parent node, owner of the children list passed as
* the third argument.
* @param children The list of child nodes to which the node representing
* the token can be added.
* @param height Storagre for, optional, height
* @param width Storagre for, optional, width
*/
static void defaultHandleCaptionSize(const int cmd, DocNode *parent, QList<DocNode> &children, QCString &height, QCString &width)
{
QCString preamble = "";
int insideString = 0;
g_nodeStack.push(parent);
// parse title
doctokenizerYYsetStateCaption();
int tok;
while ((tok=doctokenizerYYlex()))
{
if (tok==TK_WORD && g_token->name=="width=")
{
// special case: no title, but we do have a size indicator
doctokenizerYYsetStateTitleAttr();
// strip =
width=preamble + g_token->name + g_token->chars;
g_token->chars = "";
g_token->name = "";
preamble = "";
do
{
tok=doctokenizerYYlex();
} while (tok == TK_WHITESPACE);
break;
}
if (tok==TK_WORD && g_token->name=="height=")
{
// special case: no title, but we do have a size indicator
doctokenizerYYsetStateTitleAttr();
// strip =
height=preamble + g_token->name + g_token->chars;
g_token->chars = "";
g_token->name = "";
preamble = "";
do
{
tok=doctokenizerYYlex();
} while (tok == TK_WHITESPACE);
break;
}
if (tok==TK_WORD && (g_token->name=="min" || g_token->name=="max"))
{
// special case: no title, but we do have a size indicator min or max
if (!insideString)
{
preamble = g_token->name + " ";
break;
}
}
insideString = 1;
if (!defaultHandleToken(parent,tok,children))
{
switch (tok)
{
case TK_COMMAND:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\%s",
qPrint(g_token->name), Mappers::cmdMapper->map(cmd).data());
break;
case TK_SYMBOL:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
}
}
// parse size attributes
if (tok == 0)
{
tok=doctokenizerYYlex();
}
while (tok==TK_WORD) // there are values following the title
{
if (g_token->name=="width")
{
if (!width.isEmpty()) width += ",";
width+=preamble + "width=" + g_token->chars;
preamble = "";
doctokenizerYYsetStateTitleAttr();
}
else if (g_token->name=="height")
{
if (!height.isEmpty()) height += ",";
height+=preamble + "height=" + g_token->chars;
preamble = "";
doctokenizerYYsetStateTitleAttr();
}
else if (g_token->name=="max")
{
preamble = "max ";
}
else if (g_token->name=="min")
{
preamble = "min ";
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after \\%s command",
qPrint(g_token->name), Mappers::cmdMapper->map(cmd).data());
}
do
{
tok=doctokenizerYYlex();
if (tok==TK_WORD && (g_token->name=="width=" || g_token->name=="height="))
{
g_token->name=g_token->name.left(g_token->name.length()-1);
tok=doctokenizerYYlex();
}
} while (tok == TK_WHITESPACE);
}
doctokenizerYYsetStatePara();
handlePendingStyleCommands(parent,children);
DocNode *n=g_nodeStack.pop();
ASSERT(n==parent);
}
/* Helper function that deals with the most common tokens allowed in /* Helper function that deals with the most common tokens allowed in
* title like sections. * title like sections.
* @param parent Parent node, owner of the children list passed as * @param parent Parent node, owner of the children list passed as
...@@ -2619,53 +2750,7 @@ DocDotFile::DocDotFile(DocNode *parent,const QCString &name,const QCString &cont ...@@ -2619,53 +2750,7 @@ DocDotFile::DocDotFile(DocNode *parent,const QCString &name,const QCString &cont
void DocDotFile::parse() void DocDotFile::parse()
{ {
g_nodeStack.push(this); defaultHandleCaptionSize(CMD_DOTFILE,this,m_children,m_height, m_width);
DBG(("DocDotFile::parse() start\n"));
doctokenizerYYsetStateTitle();
int tok;
while ((tok=doctokenizerYYlex()))
{
if (!defaultHandleToken(this,tok,m_children))
{
switch (tok)
{
case TK_COMMAND:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\dotfile",
qPrint(g_token->name));
break;
case TK_SYMBOL:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
}
}
tok=doctokenizerYYlex();
while (tok==TK_WORD) // there are values following the title
{
if (g_token->name=="width")
{
m_width=g_token->chars;
}
else if (g_token->name=="height")
{
m_height=g_token->chars;
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
qPrint(g_token->name));
}
tok=doctokenizerYYlex();
}
ASSERT(tok==0);
doctokenizerYYsetStatePara();
handlePendingStyleCommands(this,m_children);
bool ambig; bool ambig;
FileDef *fd = findFileDef(Doxygen::dotFileNameDict,m_name,ambig); FileDef *fd = findFileDef(Doxygen::dotFileNameDict,m_name,ambig);
...@@ -2689,10 +2774,6 @@ void DocDotFile::parse() ...@@ -2689,10 +2774,6 @@ void DocDotFile::parse()
warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file %s is not found " warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file %s is not found "
"in any of the paths specified via DOTFILE_DIRS!",qPrint(m_name)); "in any of the paths specified via DOTFILE_DIRS!",qPrint(m_name));
} }
DBG(("DocDotFile::parse() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
} }
DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &context) : DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &context) :
...@@ -2703,53 +2784,7 @@ DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &cont ...@@ -2703,53 +2784,7 @@ DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &cont
void DocMscFile::parse() void DocMscFile::parse()
{ {
g_nodeStack.push(this); defaultHandleCaptionSize(CMD_MSCFILE,this,m_children,m_height, m_width);
DBG(("DocMscFile::parse() start\n"));
doctokenizerYYsetStateTitle();
int tok;
while ((tok=doctokenizerYYlex()))
{
if (!defaultHandleToken(this,tok,m_children))
{
switch (tok)
{
case TK_COMMAND:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\mscfile",
qPrint(g_token->name));
break;
case TK_SYMBOL:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
}
}
tok=doctokenizerYYlex();
while (tok==TK_WORD) // there are values following the title
{
if (g_token->name=="width")
{
m_width=g_token->chars;
}
else if (g_token->name=="height")
{
m_height=g_token->chars;
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
qPrint(g_token->name));
}
tok=doctokenizerYYlex();
}
ASSERT(tok==0);
doctokenizerYYsetStatePara();
handlePendingStyleCommands(this,m_children);
bool ambig; bool ambig;
FileDef *fd = findFileDef(Doxygen::mscFileNameDict,m_name,ambig); FileDef *fd = findFileDef(Doxygen::mscFileNameDict,m_name,ambig);
...@@ -2773,10 +2808,6 @@ void DocMscFile::parse() ...@@ -2773,10 +2808,6 @@ void DocMscFile::parse()
warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file %s is not found " warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file %s is not found "
"in any of the paths specified via MSCFILE_DIRS!",qPrint(m_name)); "in any of the paths specified via MSCFILE_DIRS!",qPrint(m_name));
} }
DBG(("DocMscFile::parse() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
...@@ -2789,53 +2820,7 @@ DocDiaFile::DocDiaFile(DocNode *parent,const QCString &name,const QCString &cont ...@@ -2789,53 +2820,7 @@ DocDiaFile::DocDiaFile(DocNode *parent,const QCString &name,const QCString &cont
void DocDiaFile::parse() void DocDiaFile::parse()
{ {
g_nodeStack.push(this); defaultHandleCaptionSize(CMD_DIAFILE,this,m_children,m_height, m_width);
DBG(("DocDiaFile::parse() start\n"));
doctokenizerYYsetStateTitle();
int tok;
while ((tok=doctokenizerYYlex()))
{
if (!defaultHandleToken(this,tok,m_children))
{
switch (tok)
{
case TK_COMMAND:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\diafile",
qPrint(g_token->name));
break;
case TK_SYMBOL:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
}
}
tok=doctokenizerYYlex();
while (tok==TK_WORD) // there are values following the title
{
if (g_token->name=="width")
{
m_width=g_token->chars;
}
else if (g_token->name=="height")
{
m_height=g_token->chars;
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
qPrint(g_token->name));
}
tok=doctokenizerYYlex();
}
ASSERT(tok==0);
doctokenizerYYsetStatePara();
handlePendingStyleCommands(this,m_children);
bool ambig; bool ambig;
FileDef *fd = findFileDef(Doxygen::diaFileNameDict,m_name,ambig); FileDef *fd = findFileDef(Doxygen::diaFileNameDict,m_name,ambig);
...@@ -2859,10 +2844,6 @@ void DocDiaFile::parse() ...@@ -2859,10 +2844,6 @@ void DocDiaFile::parse()
warn_doc_error(g_fileName,doctokenizerYYlineno,"included dia file %s is not found " warn_doc_error(g_fileName,doctokenizerYYlineno,"included dia file %s is not found "
"in any of the paths specified via DIAFILE_DIRS!",qPrint(m_name)); "in any of the paths specified via DIAFILE_DIRS!",qPrint(m_name));
} }
DBG(("DocDiaFile::parse() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
...@@ -2925,66 +2906,7 @@ DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QCString ...@@ -2925,66 +2906,7 @@ DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QCString
void DocImage::parse() void DocImage::parse()
{ {
g_nodeStack.push(this); defaultHandleCaptionSize(CMD_IMAGE,this,m_children,m_height, m_width);
DBG(("DocImage::parse() start\n"));
// parse title
doctokenizerYYsetStateTitle();
int tok;
while ((tok=doctokenizerYYlex()))
{
if (tok==TK_WORD && (g_token->name=="width=" || g_token->name=="height="))
{
// special case: no title, but we do have a size indicator
doctokenizerYYsetStateTitleAttrValue();
// strip =
g_token->name=g_token->name.left(g_token->name.length()-1);
break;
}
if (!defaultHandleToken(this,tok,m_children))
{
switch (tok)
{
case TK_COMMAND:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\image",
qPrint(g_token->name));
break;
case TK_SYMBOL:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
}
}
// parse size attributes
tok=doctokenizerYYlex();
while (tok==TK_WORD) // there are values following the title
{
if (g_token->name=="width")
{
m_width=g_token->chars;
}
else if (g_token->name=="height")
{
m_height=g_token->chars;
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
qPrint(g_token->name));
}
tok=doctokenizerYYlex();
}
doctokenizerYYsetStatePara();
handlePendingStyleCommands(this,m_children);
DBG(("DocImage::parse() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
} }
...@@ -5563,18 +5485,44 @@ int DocPara::handleCommand(const QCString &cmdName) ...@@ -5563,18 +5485,44 @@ int DocPara::handleCommand(const QCString &cmdName)
break; break;
case CMD_DOT: case CMD_DOT:
{ {
/*
* need a temporary variable to store information for width, height and caption
* which will be written into te right variable.
*/
DocVerbatim *tmp_dv = new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Dot,g_isExample,g_exampleName);
doctokenizerYYsetStatePara();
defaultHandleCaptionSize(CMD_DOT,tmp_dv,tmp_dv->m_children,tmp_dv->m_height,tmp_dv-> m_width);
doctokenizerYYsetStateDot(); doctokenizerYYsetStateDot();
retval = doctokenizerYYlex(); retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Dot,g_isExample,g_exampleName)); DocVerbatim *dv = new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Dot,g_isExample,g_exampleName);
dv -> m_width = tmp_dv -> m_width;
dv -> m_height = tmp_dv -> m_height;
dv -> m_children = tmp_dv -> m_children;
delete tmp_dv;
m_children.append(dv);
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"dot section ended without end marker"); if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"dot section ended without end marker");
doctokenizerYYsetStatePara(); doctokenizerYYsetStatePara();
} }
break; break;
case CMD_MSC: case CMD_MSC:
{ {
/*
* need a temporary variable to store information for width, height and caption
* which will be written into te right variable.
*/
DocVerbatim *tmp_dv = new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName);
doctokenizerYYsetStatePara();
defaultHandleCaptionSize(CMD_MSC,tmp_dv,tmp_dv->m_children,tmp_dv->m_height,tmp_dv-> m_width);
doctokenizerYYsetStateMsc(); doctokenizerYYsetStateMsc();
retval = doctokenizerYYlex(); retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName)); DocVerbatim *dv = new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName);
dv -> m_width = tmp_dv -> m_width;
dv -> m_height = tmp_dv -> m_height;
dv -> m_children = tmp_dv -> m_children;
delete tmp_dv;
m_children.append(dv);
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"msc section ended without end marker"); if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"msc section ended without end marker");
doctokenizerYYsetStatePara(); doctokenizerYYsetStatePara();
} }
...@@ -5582,15 +5530,31 @@ int DocPara::handleCommand(const QCString &cmdName) ...@@ -5582,15 +5530,31 @@ int DocPara::handleCommand(const QCString &cmdName)
case CMD_STARTUML: case CMD_STARTUML:
{ {
static QCString jarPath = Config_getString("PLANTUML_JAR_PATH"); static QCString jarPath = Config_getString("PLANTUML_JAR_PATH");
doctokenizerYYsetStatePlantUMLOpt();
retval = doctokenizerYYlex();
QCString plantFile(g_token->sectionId);
/*
* need a temporary variable to store information for width, height and caption
* which will be written into te right variable.
*/
DocVerbatim *tmp_dv = new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName);
doctokenizerYYsetStatePara();
defaultHandleCaptionSize(CMD_STARTUML,tmp_dv,tmp_dv->m_children,tmp_dv->m_height,tmp_dv-> m_width);
doctokenizerYYsetStatePlantUML(); doctokenizerYYsetStatePlantUML();
retval = doctokenizerYYlex(); retval = doctokenizerYYlex();
if (jarPath.isEmpty()) if (jarPath.isEmpty())
{ {
warn_doc_error(g_fileName,doctokenizerYYlineno,"ignoring startuml command because PLANTUML_JAR_PATH is not set"); warn_doc_error(g_fileName,doctokenizerYYlineno,"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
} }
else else
{ {
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::PlantUML,FALSE,g_token->sectionId)); DocVerbatim *dv = new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::PlantUML,FALSE,plantFile);
dv -> m_width = tmp_dv -> m_width;
dv -> m_height = tmp_dv -> m_height;
dv -> m_children = tmp_dv -> m_children;
delete tmp_dv;
m_children.append(dv);
} }
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"startuml section ended without end marker"); if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"startuml section ended without end marker");
doctokenizerYYsetStatePara(); doctokenizerYYsetStatePara();
......
...@@ -447,6 +447,11 @@ class DocVerbatim : public DocNode ...@@ -447,6 +447,11 @@ class DocVerbatim : public DocNode
QCString relPath() const { return m_relPath; } QCString relPath() const { return m_relPath; }
QCString language() const { return m_lang; } QCString language() const { return m_lang; }
bool isBlock() const { return m_isBlock; } bool isBlock() const { return m_isBlock; }
bool hasCaption() const { return !m_children.isEmpty(); }
QCString width() const { return m_width; }
QCString height() const { return m_height; }
const QList<DocNode> &children() const { return m_children; }
QList<DocNode> &children() { return m_children; }
private: private:
QCString m_context; QCString m_context;
...@@ -457,6 +462,10 @@ class DocVerbatim : public DocNode ...@@ -457,6 +462,10 @@ class DocVerbatim : public DocNode
QCString m_relPath; QCString m_relPath;
QCString m_lang; QCString m_lang;
bool m_isBlock; bool m_isBlock;
public:
QCString m_width;
QCString m_height;
QList<DocNode> m_children;
}; };
...@@ -668,7 +677,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode ...@@ -668,7 +677,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode
class DocImage : public CompAccept<DocImage>, public DocNode class DocImage : public CompAccept<DocImage>, public DocNode
{ {
public: public:
enum Type { Html, Latex, Rtf, DocBook }; enum Type { None, Html, Latex, Rtf, DocBook };
DocImage(DocNode *parent,const HtmlAttribList &attribs, DocImage(DocNode *parent,const HtmlAttribList &attribs,
const QCString &name,Type t,const QCString &url=QCString()); const QCString &name,Type t,const QCString &url=QCString());
Kind kind() const { return Kind_Image; } Kind kind() const { return Kind_Image; }
...@@ -686,7 +695,7 @@ class DocImage : public CompAccept<DocImage>, public DocNode ...@@ -686,7 +695,7 @@ class DocImage : public CompAccept<DocImage>, public DocNode
private: private:
HtmlAttribList m_attribs; HtmlAttribList m_attribs;
QCString m_name; QCString m_name;
Type m_type; Type m_type;
QCString m_width; QCString m_width;
QCString m_height; QCString m_height;
QCString m_relPath; QCString m_relPath;
......
...@@ -131,8 +131,10 @@ void doctokenizerYYpushContext(); ...@@ -131,8 +131,10 @@ void doctokenizerYYpushContext();
bool doctokenizerYYpopContext(); bool doctokenizerYYpopContext();
int doctokenizerYYlex(); int doctokenizerYYlex();
void doctokenizerYYsetStatePara(); void doctokenizerYYsetStatePara();
void doctokenizerYYsetStateCaption();
void doctokenizerYYsetStateTitle(); void doctokenizerYYsetStateTitle();
void doctokenizerYYsetStateTitleAttrValue(); void doctokenizerYYsetStateTitleAttrValue();
void doctokenizerYYsetStateTitleAttr();
void doctokenizerYYsetStateCode(); void doctokenizerYYsetStateCode();
void doctokenizerYYsetStateXmlCode(); void doctokenizerYYsetStateXmlCode();
void doctokenizerYYsetStateHtmlOnly(); void doctokenizerYYsetStateHtmlOnly();
...@@ -161,5 +163,6 @@ void doctokenizerYYsetStateSnippet(); ...@@ -161,5 +163,6 @@ void doctokenizerYYsetStateSnippet();
void doctokenizerYYstartAutoList(); void doctokenizerYYstartAutoList();
void doctokenizerYYendAutoList(); void doctokenizerYYendAutoList();
void doctokenizerYYsetStatePlantUML(); void doctokenizerYYsetStatePlantUML();
void doctokenizerYYsetStatePlantUMLOpt();
#endif #endif
...@@ -400,6 +400,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} ...@@ -400,6 +400,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
%x St_Para %x St_Para
%x St_Comment %x St_Comment
%x St_Title %x St_Title
%x St_Caption
%x St_TitleN %x St_TitleN
%x St_TitleQ %x St_TitleQ
%x St_TitleA %x St_TitleA
...@@ -853,14 +854,18 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} ...@@ -853,14 +854,18 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
<St_Msc>. { /* msc text */ <St_Msc>. { /* msc text */
g_token->verb+=yytext; g_token->verb+=yytext;
} }
<St_PlantUMLOpt>\n { <St_PlantUMLOpt>{BLANK}*"{"[^}]*"}" { // skip curly brackets around the optional image name
g_token->sectionId=g_token->sectionId.stripWhiteSpace(); g_token->sectionId = yytext;
BEGIN(St_PlantUML); g_token->sectionId = g_token->sectionId.stripWhiteSpace();
} g_token->sectionId = g_token->sectionId.left(g_token->sectionId.length()-1);
<St_PlantUMLOpt>["{}] { // skip curly brackets or quotes around the optional image name g_token->sectionId = g_token->sectionId.right(g_token->sectionId.length()-1);
g_token->sectionId = g_token->sectionId.stripWhiteSpace();
return RetVal_OK;
} }
<St_PlantUMLOpt>. { <St_PlantUMLOpt>. {
g_token->sectionId += yytext; g_token->sectionId = "";
unput(*yytext);
return RetVal_OK;
} }
<St_PlantUML>{CMD}"enduml" { <St_PlantUML>{CMD}"enduml" {
return RetVal_OK; return RetVal_OK;
...@@ -870,6 +875,19 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} ...@@ -870,6 +875,19 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
<St_PlantUML>. { /* plantuml text */ <St_PlantUML>. { /* plantuml text */
g_token->verb+=yytext; g_token->verb+=yytext;
} }
<St_Caption>"\"" { // quoted title
BEGIN(St_TitleQ);
return TK_WORD;
}
<St_Caption>[ \t]+ {
g_token->name="";
g_token->chars=yytext;
return TK_WHITESPACE;
}
<St_Caption>\n {
unput(*yytext);
return 0;
}
<St_Title>"\"" { // quoted title <St_Title>"\"" { // quoted title
BEGIN(St_TitleQ); BEGIN(St_TitleQ);
} }
...@@ -940,10 +958,38 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} ...@@ -940,10 +958,38 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
unput(*yytext); unput(*yytext);
return 0; return 0;
} }
<St_Caption>{BLANK}*"min"{BLANK}* { // title special case min / max
g_token->name = "min";
BEGIN(St_TitleA);
return TK_WORD;
}
<St_Caption>{BLANK}*"max"{BLANK}* { // title special case min / max
g_token->name = "max";
BEGIN(St_TitleA);
return TK_WORD;
}
<St_Caption>{BLANK}*"width="{BLANK}* { // title attribute
g_token->name = yytext;
g_token->name = g_token->name.stripWhiteSpace();
BEGIN(St_TitleV);
}
<St_Caption>{BLANK}*"height="{BLANK}* { // title attribute
g_token->name = yytext;
g_token->name = g_token->name.stripWhiteSpace();
BEGIN(St_TitleV);
}
<St_TitleA>{BLANK}*"min"{BLANK}* { // title special case min / max
g_token->name = "min";
return TK_WORD;
}
<St_TitleA>{BLANK}*"max"{BLANK}* { // title special case min / max
g_token->name = "max";
return TK_WORD;
}
<St_TitleA>{BLANK}*{ID}{BLANK}*"="{BLANK}* { // title attribute <St_TitleA>{BLANK}*{ID}{BLANK}*"="{BLANK}* { // title attribute
g_token->name = yytext; g_token->name = yytext;
g_token->name = g_token->name.left( g_token->name = g_token->name.left(
g_token->name.find('=')).stripWhiteSpace(); g_token->name.find('=')).stripWhiteSpace();
BEGIN(St_TitleV); BEGIN(St_TitleV);
} }
<St_TitleV>[^ \t\r\n]+ { // attribute value <St_TitleV>[^ \t\r\n]+ { // attribute value
...@@ -951,6 +997,10 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} ...@@ -951,6 +997,10 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
BEGIN(St_TitleN); BEGIN(St_TitleN);
return TK_WORD; return TK_WORD;
} }
<St_TitleV,St_TitleA>[ \t] {
g_token->chars=yytext;
return TK_WHITESPACE;
}
<St_TitleV,St_TitleA>. { <St_TitleV,St_TitleA>. {
unput(*yytext); unput(*yytext);
return 0; return 0;
...@@ -1224,7 +1274,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} ...@@ -1224,7 +1274,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
return TK_COMMAND; return TK_COMMAND;
} }
<*>. { <*>. {
warn(g_fileName,yylineno,"Unexpected character `%s'",yytext); warn(g_fileName,yylineno,"Unexpected character `%s'",yytext);
} }
%% %%
...@@ -1267,6 +1317,16 @@ void doctokenizerYYsetStateTitle() ...@@ -1267,6 +1317,16 @@ void doctokenizerYYsetStateTitle()
BEGIN(St_Title); BEGIN(St_Title);
} }
void doctokenizerYYsetStateCaption()
{
BEGIN(St_Caption);
}
void doctokenizerYYsetStateTitleAttr()
{
BEGIN(St_TitleA);
}
void doctokenizerYYsetStateTitleAttrValue() void doctokenizerYYsetStateTitleAttrValue()
{ {
BEGIN(St_TitleV); BEGIN(St_TitleV);
...@@ -1341,13 +1401,19 @@ void doctokenizerYYsetStateMsc() ...@@ -1341,13 +1401,19 @@ void doctokenizerYYsetStateMsc()
BEGIN(St_Msc); BEGIN(St_Msc);
} }
void doctokenizerYYsetStatePlantUML() void doctokenizerYYsetStatePlantUMLOpt()
{ {
g_token->verb=""; g_token->verb="";
g_token->sectionId=""; g_token->sectionId="";
BEGIN(St_PlantUMLOpt); BEGIN(St_PlantUMLOpt);
} }
void doctokenizerYYsetStatePlantUML()
{
g_token->verb="";
BEGIN(St_PlantUML);
}
void doctokenizerYYsetStateParam() void doctokenizerYYsetStateParam()
{ {
BEGIN(St_Param); BEGIN(St_Param);
......
...@@ -325,6 +325,32 @@ void HtmlDocVisitor::visit(DocStyleChange *s) ...@@ -325,6 +325,32 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
} }
static void visitPreCaption(FTextStream &t, DocVerbatim *s)
{
if (s->hasCaption())
{
t << "<div class=\"caption\">" << endl;
}
}
static void visitPostCaption(FTextStream &t, DocVerbatim *s)
{
if (s->hasCaption())
{
t << "</div>" << endl;
}
}
static void visitCaption(HtmlDocVisitor *parent, QList<DocNode> children)
{
QListIterator<DocNode> cli(children);
DocNode *n;
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
}
void HtmlDocVisitor::visit(DocVerbatim *s) void HtmlDocVisitor::visit(DocVerbatim *s)
{ {
if (m_hide) return; if (m_hide) return;
...@@ -382,6 +408,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) ...@@ -382,6 +408,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
static int dotindex = 1; static int dotindex = 1;
QCString fileName(4096); QCString fileName(4096);
forceEndParagraph(s);
fileName.sprintf("%s%d%s", fileName.sprintf("%s%d%s",
(Config_getString("HTML_OUTPUT")+"/inline_dotgraph_").data(), (Config_getString("HTML_OUTPUT")+"/inline_dotgraph_").data(),
dotindex++, dotindex++,
...@@ -392,16 +419,21 @@ void HtmlDocVisitor::visit(DocVerbatim *s) ...@@ -392,16 +419,21 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
{ {
err("Could not open file %s for writing\n",fileName.data()); err("Could not open file %s for writing\n",fileName.data());
} }
file.writeBlock( s->text(), s->text().length() ); else
file.close(); {
file.writeBlock( s->text(), s->text().length() );
file.close();
forceEndParagraph(s); m_t << "<div align=\"center\">" << endl;
m_t << "<div align=\"center\">" << endl; writeDotFile(fileName,s->relPath(),s->context());
writeDotFile(fileName,s->relPath(),s->context()); visitPreCaption(m_t, s);
m_t << "</div>" << endl; visitCaption(this, s->m_children);
forceStartParagraph(s); visitPostCaption(m_t, s);
m_t << "</div>" << endl;
if (Config_getBool("DOT_CLEANUP")) file.remove(); if (Config_getBool("DOT_CLEANUP")) file.remove();
}
forceStartParagraph(s);
} }
break; break;
case DocVerbatim::Msc: case DocVerbatim::Msc:
...@@ -420,17 +452,24 @@ void HtmlDocVisitor::visit(DocVerbatim *s) ...@@ -420,17 +452,24 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
{ {
err("Could not open file %s.msc for writing\n",baseName.data()); err("Could not open file %s.msc for writing\n",baseName.data());
} }
QCString text = "msc {"; else
text+=s->text(); {
text+="}"; QCString text = "msc {";
text+=s->text();
text+="}";
file.writeBlock( text, text.length() ); file.writeBlock( text, text.length() );
file.close(); file.close();
m_t << "<div align=\"center\">" << endl; m_t << "<div align=\"center\">" << endl;
writeMscFile(baseName+".msc",s->relPath(),s->context()); writeMscFile(baseName+".msc",s->relPath(),s->context());
if (Config_getBool("DOT_CLEANUP")) file.remove(); visitPreCaption(m_t, s);
m_t << "</div>" << endl; visitCaption(this, s->m_children);
visitPostCaption(m_t, s);
m_t << "</div>" << endl;
if (Config_getBool("DOT_CLEANUP")) file.remove();
}
forceStartParagraph(s); forceStartParagraph(s);
} }
break; break;
...@@ -442,6 +481,9 @@ void HtmlDocVisitor::visit(DocVerbatim *s) ...@@ -442,6 +481,9 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
QCString baseName = writePlantUMLSource(htmlOutput,s->exampleFile(),s->text()); QCString baseName = writePlantUMLSource(htmlOutput,s->exampleFile(),s->text());
m_t << "<div align=\"center\">" << endl; m_t << "<div align=\"center\">" << endl;
writePlantUMLFile(baseName,s->relPath(),s->context()); writePlantUMLFile(baseName,s->relPath(),s->context());
visitPreCaption(m_t, s);
visitCaption(this, s->m_children);
visitPostCaption(m_t, s);
m_t << "</div>" << endl; m_t << "</div>" << endl;
forceStartParagraph(s); forceStartParagraph(s);
} }
......
...@@ -71,6 +71,75 @@ static const char *getSectionName(int level) ...@@ -71,6 +71,75 @@ static const char *getSectionName(int level)
return secLabels[QMIN(maxLevels-1,l)]; return secLabels[QMIN(maxLevels-1,l)];
} }
static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, QCString width, QCString height)
{
if (hasCaption)
{
t << "\n\\begin{DoxyImage}\n";
}
else
{
t << "\n\\begin{DoxyImageNoCaption}\n"
" \\mbox{";
}
t << "\\includegraphics";
if (!width.isEmpty() || !height.isEmpty())
{
t << "[";
}
if (!width.isEmpty())
{
t << width;
}
if (!width.isEmpty() && !height.isEmpty())
{
t << ",";
}
if (!height.isEmpty())
{
t << height;
}
if (width.isEmpty() && height.isEmpty())
{
/* default setting */
t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
}
else
{
t << "]";
}
t << "{" << name << "}";
if (hasCaption)
{
t << "\n\\caption{";
}
}
static void visitPostEnd(FTextStream &t, const bool hasCaption)
{
t << "}\n"; // end mbox or caption
if (hasCaption)
{
t << "\\end{DoxyImage}\n";
}
else{
t << "\\end{DoxyImageNoCaption}\n";
}
}
static void visitCaption(LatexDocVisitor *parent, QList<DocNode> children)
{
QListIterator<DocNode> cli(children);
DocNode *n;
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
}
QCString LatexDocVisitor::escapeMakeIndexChars(const char *s) QCString LatexDocVisitor::escapeMakeIndexChars(const char *s)
{ {
QCString result; QCString result;
...@@ -284,15 +353,17 @@ void LatexDocVisitor::visit(DocVerbatim *s) ...@@ -284,15 +353,17 @@ void LatexDocVisitor::visit(DocVerbatim *s)
{ {
err("Could not open file %s for writing\n",fileName.data()); err("Could not open file %s for writing\n",fileName.data());
} }
file.writeBlock( s->text(), s->text().length() ); else
file.close(); {
file.writeBlock( s->text(), s->text().length() );
file.close();
m_t << "\\begin{center}\n"; startDotFile(fileName,s->width(),s->height(),s->hasCaption());
startDotFile(fileName,"","",FALSE); visitCaption(this, s->m_children);
endDotFile(FALSE); endDotFile(s->hasCaption());
m_t << "\\end{center}\n";
if (Config_getBool("DOT_CLEANUP")) file.remove(); if (Config_getBool("DOT_CLEANUP")) file.remove();
}
} }
break; break;
case DocVerbatim::Msc: case DocVerbatim::Msc:
...@@ -309,17 +380,18 @@ void LatexDocVisitor::visit(DocVerbatim *s) ...@@ -309,17 +380,18 @@ void LatexDocVisitor::visit(DocVerbatim *s)
{ {
err("Could not open file %s.msc for writing\n",baseName.data()); err("Could not open file %s.msc for writing\n",baseName.data());
} }
QCString text = "msc {"; else
text+=s->text(); {
text+="}"; QCString text = "msc {";
file.writeBlock( text, text.length() ); text+=s->text();
file.close(); text+="}";
file.writeBlock( text, text.length() );
file.close();
m_t << "\\begin{center}\n"; writeMscFile(baseName, s);
writeMscFile(baseName);
m_t << "\\end{center}\n";
if (Config_getBool("DOT_CLEANUP")) file.remove(); if (Config_getBool("DOT_CLEANUP")) file.remove();
}
} }
break; break;
case DocVerbatim::PlantUML: case DocVerbatim::PlantUML:
...@@ -327,9 +399,7 @@ void LatexDocVisitor::visit(DocVerbatim *s) ...@@ -327,9 +399,7 @@ void LatexDocVisitor::visit(DocVerbatim *s)
QCString latexOutput = Config_getString("LATEX_OUTPUT"); QCString latexOutput = Config_getString("LATEX_OUTPUT");
QCString baseName = writePlantUMLSource(latexOutput,s->exampleFile(),s->text()); QCString baseName = writePlantUMLSource(latexOutput,s->exampleFile(),s->text());
m_t << "\\begin{center}\n"; writePlantUMLFile(baseName, s);
writePlantUMLFile(baseName);
m_t << "\\end{center}\n";
} }
break; break;
} }
...@@ -1098,40 +1168,18 @@ void LatexDocVisitor::visitPost(DocHtmlHeader *) ...@@ -1098,40 +1168,18 @@ void LatexDocVisitor::visitPost(DocHtmlHeader *)
if (m_hide) return; if (m_hide) return;
m_t << "}"; m_t << "}";
} }
void LatexDocVisitor::visitPre(DocImage *img) void LatexDocVisitor::visitPre(DocImage *img)
{ {
if (img->type()==DocImage::Latex) if (img->type()==DocImage::Latex)
{ {
if (m_hide) return; if (m_hide) return;
if (img->hasCaption())
{
m_t << "\n\\begin{DoxyImage}\n";
}
else
{
m_t << "\n\\begin{DoxyImageNoCaption}\n"
" \\mbox{";
}
QCString gfxName = img->name(); QCString gfxName = img->name();
if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf") if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
{ {
gfxName=gfxName.left(gfxName.length()-4); gfxName=gfxName.left(gfxName.length()-4);
} }
m_t << "\\includegraphics";
if (!img->width().isEmpty()) visitPreStart(m_t,img->hasCaption(), gfxName, img->width(), img->height());
{
m_t << "[width=" << img->width() << "]";
}
else if (!img->height().isEmpty())
{
m_t << "[height=" << img->height() << "]";
}
m_t << "{" << gfxName << "}";
if (img->hasCaption())
{
m_t << "\n\\caption{";
}
} }
else // other format -> skip else // other format -> skip
{ {
...@@ -1145,14 +1193,7 @@ void LatexDocVisitor::visitPost(DocImage *img) ...@@ -1145,14 +1193,7 @@ void LatexDocVisitor::visitPost(DocImage *img)
if (img->type()==DocImage::Latex) if (img->type()==DocImage::Latex)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "}\n"; // end mbox or caption visitPostEnd(m_t,img->hasCaption());
if (img->hasCaption())
{
m_t << "\\end{DoxyImage}\n";
}
else{
m_t << "\\end{DoxyImageNoCaption}\n";
}
} }
else // other format else // other format
{ {
...@@ -1610,57 +1651,13 @@ void LatexDocVisitor::startDotFile(const QCString &fileName, ...@@ -1610,57 +1651,13 @@ void LatexDocVisitor::startDotFile(const QCString &fileName,
QCString outDir = Config_getString("LATEX_OUTPUT"); QCString outDir = Config_getString("LATEX_OUTPUT");
QCString name = fileName; QCString name = fileName;
writeDotGraphFromFile(name,outDir,baseName,GOF_EPS); writeDotGraphFromFile(name,outDir,baseName,GOF_EPS);
if (hasCaption) visitPreStart(m_t,hasCaption, baseName, width, height);
{
m_t << "\n\\begin{DoxyImage}\n";
}
else
{
m_t << "\n\\begin{DoxyImageNoCaption}\n"
" \\mbox{";
}
m_t << "\\includegraphics";
if (!width.isEmpty())
{
m_t << "[width=" << width << "]";
}
else if (!height.isEmpty())
{
m_t << "[height=" << height << "]";
}
else
{
m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
}
m_t << "{" << baseName;
//if (Config_getBool("USE_PDFLATEX"))
//{
// m_t << ".pdf";
//}
//else
//{
// m_t << ".eps";
//}
m_t << "}";
if (hasCaption)
{
m_t << "\n\\caption{";
}
} }
void LatexDocVisitor::endDotFile(bool hasCaption) void LatexDocVisitor::endDotFile(bool hasCaption)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "}\n"; // end caption or mbox visitPostEnd(m_t,hasCaption);
if (hasCaption)
{
m_t << "\\end{DoxyImage}\n";
}
else
{
m_t << "\\end{DoxyImageNoCaption}\n";
}
} }
void LatexDocVisitor::startMscFile(const QCString &fileName, void LatexDocVisitor::startMscFile(const QCString &fileName,
...@@ -1683,61 +1680,17 @@ void LatexDocVisitor::startMscFile(const QCString &fileName, ...@@ -1683,61 +1680,17 @@ void LatexDocVisitor::startMscFile(const QCString &fileName,
QCString outDir = Config_getString("LATEX_OUTPUT"); QCString outDir = Config_getString("LATEX_OUTPUT");
writeMscGraphFromFile(fileName,outDir,baseName,MSC_EPS); writeMscGraphFromFile(fileName,outDir,baseName,MSC_EPS);
if (hasCaption) visitPreStart(m_t,hasCaption, baseName, width, height);
{
m_t << "\n\\begin{DoxyImage}\n";
}
else
{
m_t << "\n\\begin{DoxyImageNoCaption}\n"
" \\mbox{";
}
m_t << "\\includegraphics";
if (!width.isEmpty())
{
m_t << "[width=" << width << "]";
}
else if (!height.isEmpty())
{
m_t << "[height=" << height << "]";
}
else
{
m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
}
m_t << "{" << baseName;
//if (Config_getBool("USE_PDFLATEX"))
//{
// m_t << ".pdf";
//}
//else
//{
// m_t << ".eps";
//}
m_t << "}";
if (hasCaption)
{
m_t << "\n\\caption{";
}
} }
void LatexDocVisitor::endMscFile(bool hasCaption) void LatexDocVisitor::endMscFile(bool hasCaption)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "}\n"; // end caption or mbox visitPostEnd(m_t,hasCaption);
if (hasCaption)
{
m_t << "\\end{DoxyImage}\n";
}
else
{
m_t << "\\end{DoxyImageNoCaption}\n";
}
} }
void LatexDocVisitor::writeMscFile(const QCString &baseName) void LatexDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s)
{ {
QCString shortName = baseName; QCString shortName = baseName;
int i; int i;
...@@ -1747,11 +1700,9 @@ void LatexDocVisitor::writeMscFile(const QCString &baseName) ...@@ -1747,11 +1700,9 @@ void LatexDocVisitor::writeMscFile(const QCString &baseName)
} }
QCString outDir = Config_getString("LATEX_OUTPUT"); QCString outDir = Config_getString("LATEX_OUTPUT");
writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_EPS); writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_EPS);
m_t << "\n\\begin{DoxyImageNoCaption}" visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
" \\mbox{\\includegraphics"; visitCaption(this, s->m_children);
m_t << "{" << shortName << "}"; visitPostEnd(m_t, s->hasCaption());
m_t << "}\n"; // end mbox
m_t << "\\end{DoxyImageNoCaption}\n";
} }
...@@ -1775,61 +1726,17 @@ void LatexDocVisitor::startDiaFile(const QCString &fileName, ...@@ -1775,61 +1726,17 @@ void LatexDocVisitor::startDiaFile(const QCString &fileName,
QCString outDir = Config_getString("LATEX_OUTPUT"); QCString outDir = Config_getString("LATEX_OUTPUT");
writeDiaGraphFromFile(fileName,outDir,baseName,DIA_EPS); writeDiaGraphFromFile(fileName,outDir,baseName,DIA_EPS);
if (hasCaption) visitPreStart(m_t,hasCaption, baseName, width, height);
{
m_t << "\n\\begin{DoxyImage}\n";
}
else
{
m_t << "\n\\begin{DoxyImageNoCaption}\n"
" \\mbox{";
}
m_t << "\\includegraphics";
if (!width.isEmpty())
{
m_t << "[width=" << width << "]";
}
else if (!height.isEmpty())
{
m_t << "[height=" << height << "]";
}
else
{
m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
}
m_t << "{" << baseName;
//if (Config_getBool("USE_PDFLATEX"))
//{
// m_t << ".pdf";
//}
//else
//{
// m_t << ".eps";
//}
m_t << "}";
if (hasCaption)
{
m_t << "\n\\caption{";
}
} }
void LatexDocVisitor::endDiaFile(bool hasCaption) void LatexDocVisitor::endDiaFile(bool hasCaption)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "}\n"; // end caption or mbox visitPostEnd(m_t,hasCaption);
if (hasCaption)
{
m_t << "\\end{DoxyImage}\n";
}
else
{
m_t << "\\end{DoxyImageNoCaption}\n";
}
} }
void LatexDocVisitor::writeDiaFile(const QCString &baseName) void LatexDocVisitor::writeDiaFile(const QCString &baseName, DocVerbatim *s)
{ {
QCString shortName = baseName; QCString shortName = baseName;
int i; int i;
...@@ -1839,14 +1746,12 @@ void LatexDocVisitor::writeDiaFile(const QCString &baseName) ...@@ -1839,14 +1746,12 @@ void LatexDocVisitor::writeDiaFile(const QCString &baseName)
} }
QCString outDir = Config_getString("LATEX_OUTPUT"); QCString outDir = Config_getString("LATEX_OUTPUT");
writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_EPS); writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_EPS);
m_t << "\n\\begin{DoxyImageNoCaption}" visitPreStart(m_t, s->hasCaption(), shortName, s->width(), s->height());
" \\mbox{\\includegraphics"; visitCaption(this, s->m_children);
m_t << "{" << shortName << "}"; visitPostEnd(m_t, s->hasCaption());
m_t << "}\n"; // end mbox
m_t << "\\end{DoxyImageNoCaption}\n";
} }
void LatexDocVisitor::writePlantUMLFile(const QCString &baseName) void LatexDocVisitor::writePlantUMLFile(const QCString &baseName, DocVerbatim *s)
{ {
QCString shortName = baseName; QCString shortName = baseName;
int i; int i;
...@@ -1856,10 +1761,8 @@ void LatexDocVisitor::writePlantUMLFile(const QCString &baseName) ...@@ -1856,10 +1761,8 @@ void LatexDocVisitor::writePlantUMLFile(const QCString &baseName)
} }
QCString outDir = Config_getString("LATEX_OUTPUT"); QCString outDir = Config_getString("LATEX_OUTPUT");
generatePlantUMLOutput(baseName,outDir,PUML_EPS); generatePlantUMLOutput(baseName,outDir,PUML_EPS);
m_t << "\n\\begin{DoxyImageNoCaption}" visitPreStart(m_t, s->hasCaption(), shortName, s->width(), s->height());
" \\mbox{\\includegraphics"; visitCaption(this, s->m_children);
m_t << "{" << shortName << "}"; visitPostEnd(m_t, s->hasCaption());
m_t << "}\n"; // end mbox
m_t << "\\end{DoxyImageNoCaption}\n";
} }
...@@ -170,13 +170,13 @@ class LatexDocVisitor : public DocVisitor ...@@ -170,13 +170,13 @@ class LatexDocVisitor : public DocVisitor
void startMscFile(const QCString &fileName,const QCString &width, void startMscFile(const QCString &fileName,const QCString &width,
const QCString &height, bool hasCaption); const QCString &height, bool hasCaption);
void endMscFile(bool hasCaption); void endMscFile(bool hasCaption);
void writeMscFile(const QCString &fileName); void writeMscFile(const QCString &fileName, DocVerbatim *s);
void startDiaFile(const QCString &fileName,const QCString &width, void startDiaFile(const QCString &fileName,const QCString &width,
const QCString &height, bool hasCaption); const QCString &height, bool hasCaption);
void endDiaFile(bool hasCaption); void endDiaFile(bool hasCaption);
void writeDiaFile(const QCString &fileName); void writeDiaFile(const QCString &fileName, DocVerbatim *s);
void writePlantUMLFile(const QCString &fileName); void writePlantUMLFile(const QCString &fileName, DocVerbatim *s);
void pushEnabled(); void pushEnabled();
void popEnabled(); void popEnabled();
......
...@@ -270,7 +270,7 @@ static void writeDefaultHeaderPart1(FTextStream &t) ...@@ -270,7 +270,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
"\\usepackage{fixltx2e}\n" // for \textsubscript "\\usepackage{fixltx2e}\n" // for \textsubscript
"\\usepackage{calc}\n" "\\usepackage{calc}\n"
"\\usepackage{doxygen}\n" "\\usepackage{doxygen}\n"
"\\usepackage{graphicx}\n" "\\usepackage[export]{adjustbox} % also loads graphicx\n"
"\\usepackage[utf8]{inputenc}\n" "\\usepackage[utf8]{inputenc}\n"
"\\usepackage{makeidx}\n" "\\usepackage{makeidx}\n"
"\\usepackage{multicol}\n" "\\usepackage{multicol}\n"
......
...@@ -483,7 +483,7 @@ class PrintDocVisitor : public DocVisitor ...@@ -483,7 +483,7 @@ class PrintDocVisitor : public DocVisitor
case DocImage::Rtf: printf("rtf"); break; case DocImage::Rtf: printf("rtf"); break;
case DocImage::DocBook: printf("docbook"); break; case DocImage::DocBook: printf("docbook"); break;
} }
printf("\" width=%s height=%s>\n",img->width().data(),img->height().data()); printf("\" %s %s>\n",img->width().data(),img->height().data());
} }
void visitPost(DocImage *) void visitPost(DocImage *)
{ {
......
...@@ -32,6 +32,71 @@ ...@@ -32,6 +32,71 @@
#include "config.h" #include "config.h"
#include "htmlentity.h" #include "htmlentity.h"
static void visitCaption(XmlDocVisitor *parent, QList<DocNode> children)
{
QListIterator<DocNode> cli(children);
DocNode *n;
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
}
static void visitPreStart(FTextStream &t, const char *cmd, const bool doCaption, XmlDocVisitor *parent, QList<DocNode> children, QCString name, DocImage::Type type, QCString width, QCString height)
{
QCString tmpStr;
t << "<" << cmd;
if (type != DocImage::None)
{
t << " type=\"";
switch(type)
{
case DocImage::Html: t << "html"; break;
case DocImage::Latex: t << "latex"; break;
case DocImage::Rtf: t << "rtf"; break;
case DocImage::DocBook: t << "docbook"; break;
}
t << "\"";
}
if (!name.isEmpty())
{
t << " name=\"" << name << "\"";
}
if (!width.isEmpty())
{
tmpStr = width;
tmpStr = tmpStr.replace(QRegExp("min *width"),"minwidth");
tmpStr = tmpStr.replace(QRegExp("max *width"),"maxwidth");
tmpStr = tmpStr.replace(QRegExp("="),"=\"");
tmpStr = tmpStr.replace(QRegExp(","),"\" ") + "\"";
tmpStr = tmpStr.replace(QRegExp("\"\""),"\"");
tmpStr = tmpStr.replace(QRegExp("\\"),"\\\\");
t << " " << tmpStr;
}
if (!height.isEmpty())
{
tmpStr = height;
tmpStr = tmpStr.replace(QRegExp("min *height"),"minheight");
tmpStr = tmpStr.replace(QRegExp("max *height"),"maxheight");
tmpStr = tmpStr.replace(QRegExp("="),"=\"");
tmpStr = tmpStr.replace(QRegExp(","),"\" ") + "\"";
tmpStr = tmpStr.replace(QRegExp("\"\""),"\"");
tmpStr = tmpStr.replace(QRegExp("\\"),"\\\\");
t << " " << tmpStr;
}
if (doCaption)
{
t << " caption=\"";
visitCaption(parent, children);
t << "\"";
}
t << ">";
}
static void visitPostEnd(FTextStream &t, const char *cmd, const bool doCaption)
{
t << "</" << cmd << ">" << endl;
}
XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci) XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci)
: DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) : DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
{ {
...@@ -200,19 +265,19 @@ void XmlDocVisitor::visit(DocVerbatim *s) ...@@ -200,19 +265,19 @@ void XmlDocVisitor::visit(DocVerbatim *s)
m_t << "</docbookonly>"; m_t << "</docbookonly>";
break; break;
case DocVerbatim::Dot: case DocVerbatim::Dot:
m_t << "<dot>"; visitPreStart(m_t, "dot", s->hasCaption(), this, s->children(), QCString(""), DocImage::None, s->width(), s->height());
filter(s->text()); filter(s->text());
m_t << "</dot>"; visitPostEnd(m_t, "dot", s->hasCaption());
break; break;
case DocVerbatim::Msc: case DocVerbatim::Msc:
m_t << "<msc>"; visitPreStart(m_t, "msc", s->hasCaption(), this, s->children(), QCString(""), DocImage::None, s->width(), s->height());
filter(s->text()); filter(s->text());
m_t << "</msc>"; visitPostEnd(m_t, "msc", s->hasCaption());
break; break;
case DocVerbatim::PlantUML: case DocVerbatim::PlantUML:
m_t << "<plantuml>"; visitPreStart(m_t, "plantuml", s->hasCaption(), this, s->children(), QCString(""), DocImage::None, s->width(), s->height());
filter(s->text()); filter(s->text());
m_t << "</plantuml>"; visitPostEnd(m_t, "plantuml", s->hasCaption());
break; break;
} }
} }
...@@ -682,15 +747,6 @@ void XmlDocVisitor::visitPost(DocHtmlHeader *) ...@@ -682,15 +747,6 @@ void XmlDocVisitor::visitPost(DocHtmlHeader *)
void XmlDocVisitor::visitPre(DocImage *img) void XmlDocVisitor::visitPre(DocImage *img)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "<image type=\"";
switch(img->type())
{
case DocImage::Html: m_t << "html"; break;
case DocImage::Latex: m_t << "latex"; break;
case DocImage::Rtf: m_t << "rtf"; break;
case DocImage::DocBook: m_t << "docbook"; break;
}
m_t << "\"";
QCString baseName=img->name(); QCString baseName=img->name();
int i; int i;
...@@ -698,20 +754,7 @@ void XmlDocVisitor::visitPre(DocImage *img) ...@@ -698,20 +754,7 @@ void XmlDocVisitor::visitPre(DocImage *img)
{ {
baseName=baseName.right(baseName.length()-i-1); baseName=baseName.right(baseName.length()-i-1);
} }
m_t << " name=\"" << baseName << "\""; visitPreStart(m_t, "image", FALSE, this, img->children(), baseName, img->type(), img->width(), img->height());
if (!img->width().isEmpty())
{
m_t << " width=\"";
filter(img->width());
m_t << "\"";
}
else if (!img->height().isEmpty())
{
m_t << " height=\"";
filter(img->height());
m_t << "\"";
}
m_t << ">";
// copy the image to the output dir // copy the image to the output dir
QFile inImage(img->name()); QFile inImage(img->name());
...@@ -732,43 +775,43 @@ void XmlDocVisitor::visitPre(DocImage *img) ...@@ -732,43 +775,43 @@ void XmlDocVisitor::visitPre(DocImage *img)
void XmlDocVisitor::visitPost(DocImage *) void XmlDocVisitor::visitPost(DocImage *)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "</image>" << endl; visitPostEnd(m_t, "image", FALSE);
} }
void XmlDocVisitor::visitPre(DocDotFile *df) void XmlDocVisitor::visitPre(DocDotFile *df)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "<dotfile name=\"" << df->file() << "\">"; visitPreStart(m_t, "dotfile", FALSE, this, df->children(), df->file(), DocImage::None, df->width(), df->height());
} }
void XmlDocVisitor::visitPost(DocDotFile *) void XmlDocVisitor::visitPost(DocDotFile *)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "</dotfile>" << endl; visitPostEnd(m_t, "dotfile", FALSE);
} }
void XmlDocVisitor::visitPre(DocMscFile *df) void XmlDocVisitor::visitPre(DocMscFile *df)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "<mscfile name=\"" << df->file() << "\">"; visitPreStart(m_t, "mscfile", FALSE, this, df->children(), df->file(), DocImage::None, df->width(), df->height());
} }
void XmlDocVisitor::visitPost(DocMscFile *) void XmlDocVisitor::visitPost(DocMscFile *)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "</mscfile>" << endl; visitPostEnd(m_t, "mscfile", FALSE);
} }
void XmlDocVisitor::visitPre(DocDiaFile *df) void XmlDocVisitor::visitPre(DocDiaFile *df)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "<diafile name=\"" << df->file() << "\">"; visitPreStart(m_t, "diafile", FALSE, this, df->children(), df->file(), DocImage::None, df->width(), df->height());
} }
void XmlDocVisitor::visitPost(DocDiaFile *) void XmlDocVisitor::visitPost(DocDiaFile *)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "</diafile>" << endl; visitPostEnd(m_t, "diafile", FALSE);
} }
void XmlDocVisitor::visitPre(DocLink *lnk) void XmlDocVisitor::visitPre(DocLink *lnk)
......
...@@ -142,7 +142,9 @@ ...@@ -142,7 +142,9 @@
% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc % Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
% (only if no caption is specified) % (only if no caption is specified)
\newenvironment{DoxyImageNoCaption}{% \newenvironment{DoxyImageNoCaption}{%
\begin{center}%
}{% }{%
\end{center}%
} }
% Used by @attention % Used by @attention
......
...@@ -4,14 +4,15 @@ ...@@ -4,14 +4,15 @@
<compoundname>index</compoundname> <compoundname>index</compoundname>
<title>My Project</title> <title>My Project</title>
<detaileddescription> <detaileddescription>
<para>Class relations expressed via an inline dot graph: <dot> <para>Class relations expressed via an inline dot graph: <dot>
digraph example { digraph example {
node [shape=record, fontname=Helvetica, fontsize=10]; node [shape=record, fontname=Helvetica, fontsize=10];
b [ label="class B" URL="\ref B"]; b [ label="class B" URL="\ref B"];
c [ label="class C" URL="\ref C"]; c [ label="class C" URL="\ref C"];
b -&gt; c [ arrowhead="open", style="dashed" ]; b -&gt; c [ arrowhead="open", style="dashed" ];
} }
</dot> </para> </dot>
</para>
</detaileddescription> </detaileddescription>
</compounddef> </compounddef>
</doxygen> </doxygen>
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<detaileddescription> <detaileddescription>
<para>Some text. <image type="html" name="sample.png"/> <para>Some text. <image type="html" name="sample.png"/>
<image type="latex" name="sample.png" width="5cm">Doxygen logo</image> <image type="latex" name="sample.png" width="5cm">Doxygen logo</image>
More text. </para> More text. </para>
</detaileddescription> </detaileddescription>
</compounddef> </compounddef>
</doxygen> </doxygen>
...@@ -25,11 +25,12 @@ ...@@ -25,11 +25,12 @@
<briefdescription> <briefdescription>
</briefdescription> </briefdescription>
<detaileddescription> <detaileddescription>
<para><ref refid="class_receiver" kindref="compound">Receiver</ref> class. Can be used to receive and execute commands. After execution of a command, the receiver will send an acknowledgement <msc> <para><ref refid="class_receiver" kindref="compound">Receiver</ref> class. Can be used to receive and execute commands. After execution of a command, the receiver will send an acknowledgement <msc>
Receiver,Sender; Receiver,Sender;
Receiver&lt;-Sender [label="Command()", URL="\ref Command()"]; Receiver&lt;-Sender [label="Command()", URL="\ref Command()"];
Receiver-&gt;Sender [label="Ack()", URL="\ref Sender::Ack()", ID="1"]; Receiver-&gt;Sender [label="Ack()", URL="\ref Sender::Ack()", ID="1"];
</msc> </para> </msc>
</para>
</detaileddescription> </detaileddescription>
<location file="037_msc.cpp" bodystart="28" bodyend="33"/> <location file="037_msc.cpp" bodystart="28" bodyend="33"/>
<listofallmembers> <listofallmembers>
......
...@@ -25,11 +25,12 @@ ...@@ -25,11 +25,12 @@
<briefdescription> <briefdescription>
</briefdescription> </briefdescription>
<detaileddescription> <detaileddescription>
<para><ref refid="class_sender" kindref="compound">Sender</ref> class. Can be used to send a command to the server. The receiver will acknowledge the command by calling <ref refid="class_sender_1a8ad2c6f9baa4e798868fe4a4d45f8fda" kindref="member">Ack()</ref>. <msc> <para><ref refid="class_sender" kindref="compound">Sender</ref> class. Can be used to send a command to the server. The receiver will acknowledge the command by calling <ref refid="class_sender_1a8ad2c6f9baa4e798868fe4a4d45f8fda" kindref="member">Ack()</ref>. <msc>
Sender,Receiver; Sender,Receiver;
Sender-&gt;Receiver [label="Command()", URL="\ref Receiver::Command()"]; Sender-&gt;Receiver [label="Command()", URL="\ref Receiver::Command()"];
Sender&lt;-Receiver [label="Ack()", URL="\ref Ack()", ID="1"]; Sender&lt;-Receiver [label="Ack()", URL="\ref Ack()", ID="1"];
</msc> </para> </msc>
</para>
</detaileddescription> </detaileddescription>
<location file="037_msc.cpp" bodystart="13" bodyend="18"/> <location file="037_msc.cpp" bodystart="13" bodyend="18"/>
<listofallmembers> <listofallmembers>
......
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