Commit 67e8d626 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Merge branch 'feature/bug_size_latex' of...

Merge branch 'feature/bug_size_latex' of https://github.com/albert-github/doxygen into albert-github-feature/bug_size_latex

Conflicts:
	src/doctokenizer.h
	src/latexgen.cpp
parents c09f84c2 329a4ddc
......@@ -2451,13 +2451,25 @@ only copy the detailed documentation, not the brief description.
\ref cmdhtmlonly "\\htmlonly".
<hr>
\section cmddot \\dot
\section cmddot \\dot ["caption"] [<sizeindication>=<size>]
\addindex \\dot
Starts a text fragment which should contain a valid description of a
dot graph. The text fragment ends with \ref cmdenddot "\\enddot".
Doxygen will pass the text on to dot and include the resulting
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.
By using the command \ref cmdref "\\ref" inside the URL value you can conveniently
link to an item inside doxygen. Here is an example:
......@@ -2485,12 +2497,24 @@ class C {};
\endcode
<hr>
\section cmdmsc \\msc
\section cmdmsc \\msc ["caption"] [<sizeindication>=<size>]
\addindex \\msc
Starts a text fragment which should contain a valid description of a
message sequence chart. See http://www.mcternan.me.uk/mscgen/ for examples.
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
sequence chart that is
within the <code>msc {...}</code> block.
......@@ -2534,7 +2558,7 @@ class Receiver
\sa section \ref cmdmscfile "\\mscfile".
<hr>
\section cmdstartuml \\startuml
\section cmdstartuml \\startuml [{file}] ["caption"] [<sizeindication>=<size>]
\addindex \\startuml
Starts a text fragment which should contain a valid description of a
......@@ -2544,6 +2568,28 @@ class Receiver
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".
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.
\code
/** Sender class. Can be used to send a command to the server.
......@@ -2575,19 +2621,8 @@ class Receiver
};
\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>
\section cmddotfile \\dotfile <file> ["caption"]
\section cmddotfile \\dotfile <file> ["caption"] [<sizeindication>=<size>]
\addindex \\dotfile
Inserts an image generated by dot from \<file\> into the documentation.
......@@ -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
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>
\section cmdmscfile \\mscfile <file> ["caption"]
\section cmdmscfile \\mscfile <file> ["caption"] [<sizeindication>=<size>]
\addindex \\mscfile
Inserts an image generated by mscgen from \<file\> into the documentation.
......@@ -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
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".
<hr>
\section cmddiafile \\diafile <file> ["caption"]
\section cmddiafile \\diafile <file> ["caption"] [<sizeindication>=<size>]
\addindex \\diafile
Inserts an image made in dia from \<file\> into the documentation.
......@@ -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
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>
\section cmde \\e <word>
......@@ -2843,7 +2898,7 @@ Without the name doxygen will choose a name automatically.
format you'll have to repeat this command for each format.
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.
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.
spaces. The quotes are stripped before the caption is displayed.
The fourth argument is also optional and can be used to specify the
width or height of the image. This is only useful
for \LaTeX output
(i.e. format=<code>latex</code>). The \c sizeindication can be
either \c width or \c height. The size should be a valid
size specifier in \LaTeX (for example <code>10cm</code> or
<code>6in</code> or a symbolic width like <code>\\textwidth</code>).
width or height of the image. This can be useful for \LaTeX output
(i.e. format=<code>latex</code>).
\anchor image_sizeindicator \par Size indication
The \c sizeindication can
specify the width or height to be used )or a combination). Possible
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:
......
......@@ -227,6 +227,16 @@ int Mapper::map(const char *n)
return !name.isEmpty() && (result=m_map.find(name)) ? *result: 0;
}
QString Mapper::find(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)
{
m_map.setAutoDelete(TRUE);
......
......@@ -202,6 +202,7 @@ class Mapper
{
public:
int map(const char *n);
QString find(const int n);
Mapper(const CommandMap *cm,bool caseSensitive);
private:
QDict<int> m_map;
......
This diff is collapsed.
......@@ -147,16 +147,16 @@ class DocbookDocVisitor : public DocVisitor
void startMscFile(const QCString &fileName,const QCString &width,
const QCString &height, 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,
const QCString &height, 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,
const QCString &height, bool hasCaption);
void endDotFile(bool hasCaption);
void writeDotFile(const QCString &fileName);
void writePlantUMLFile(const QCString &fileName);
void writeDotFile(const QCString &fileName, DocVerbatim *s);
void writePlantUMLFile(const QCString &fileName, DocVerbatim *s);
//--------------------------------------
// state variables
//--------------------------------------
......
This diff is collapsed.
......@@ -447,6 +447,11 @@ class DocVerbatim : public DocNode
QCString relPath() const { return m_relPath; }
QCString language() const { return m_lang; }
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:
QCString m_context;
......@@ -457,6 +462,10 @@ class DocVerbatim : public DocNode
QCString m_relPath;
QCString m_lang;
bool m_isBlock;
public:
QCString m_width;
QCString m_height;
QList<DocNode> m_children;
};
......@@ -686,7 +695,7 @@ class DocImage : public CompAccept<DocImage>, public DocNode
private:
HtmlAttribList m_attribs;
QCString m_name;
Type m_type;
Type m_type;
QCString m_width;
QCString m_height;
QCString m_relPath;
......
......@@ -131,8 +131,10 @@ void doctokenizerYYpushContext();
bool doctokenizerYYpopContext();
int doctokenizerYYlex();
void doctokenizerYYsetStatePara();
void doctokenizerYYsetStateCaption();
void doctokenizerYYsetStateTitle();
void doctokenizerYYsetStateTitleAttrValue();
void doctokenizerYYsetStateTitleAttr();
void doctokenizerYYsetStateCode();
void doctokenizerYYsetStateXmlCode();
void doctokenizerYYsetStateHtmlOnly();
......@@ -162,5 +164,6 @@ void doctokenizerYYstartAutoList();
void doctokenizerYYendAutoList();
void doctokenizerYYsetStatePlantUML();
void doctokenizerYYsetStateSetScope();
void doctokenizerYYsetStatePlantUMLOpt();
#endif
......@@ -404,6 +404,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
%x St_Para
%x St_Comment
%x St_Title
%x St_Caption
%x St_TitleN
%x St_TitleQ
%x St_TitleA
......@@ -859,14 +860,18 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
<St_Msc>. { /* msc text */
g_token->verb+=yytext;
}
<St_PlantUMLOpt>\n {
g_token->sectionId=g_token->sectionId.stripWhiteSpace();
BEGIN(St_PlantUML);
}
<St_PlantUMLOpt>["{}] { // skip curly brackets or quotes around the optional image name
<St_PlantUMLOpt>{BLANK}*"{"[^}]*"}" { // skip curly brackets around the optional image name
g_token->sectionId = yytext;
g_token->sectionId = g_token->sectionId.stripWhiteSpace();
g_token->sectionId = g_token->sectionId.left(g_token->sectionId.length()-1);
g_token->sectionId = g_token->sectionId.right(g_token->sectionId.length()-1);
g_token->sectionId = g_token->sectionId.stripWhiteSpace();
return RetVal_OK;
}
<St_PlantUMLOpt>. {
g_token->sectionId += yytext;
g_token->sectionId = "";
unput(*yytext);
return RetVal_OK;
}
<St_PlantUML>{CMD}"enduml" {
return RetVal_OK;
......@@ -876,6 +881,19 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
<St_PlantUML>. { /* plantuml text */
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
BEGIN(St_TitleQ);
}
......@@ -946,10 +964,38 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
unput(*yytext);
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
g_token->name = yytext;
g_token->name = g_token->name.left(
g_token->name.find('=')).stripWhiteSpace();
g_token->name.find('=')).stripWhiteSpace();
BEGIN(St_TitleV);
}
<St_TitleV>[^ \t\r\n]+ { // attribute value
......@@ -957,6 +1003,10 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
BEGIN(St_TitleN);
return TK_WORD;
}
<St_TitleV,St_TitleA>[ \t] {
g_token->chars=yytext;
return TK_WHITESPACE;
}
<St_TitleV,St_TitleA>. {
unput(*yytext);
return 0;
......@@ -1258,7 +1308,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
return TK_COMMAND;
}
<*>. {
warn(g_fileName,yylineno,"Unexpected character `%s'",yytext);
warn(g_fileName,yylineno,"Unexpected character `%s'",yytext);
}
%%
......@@ -1301,6 +1351,16 @@ void doctokenizerYYsetStateTitle()
BEGIN(St_Title);
}
void doctokenizerYYsetStateCaption()
{
BEGIN(St_Caption);
}
void doctokenizerYYsetStateTitleAttr()
{
BEGIN(St_TitleA);
}
void doctokenizerYYsetStateTitleAttrValue()
{
BEGIN(St_TitleV);
......@@ -1375,13 +1435,19 @@ void doctokenizerYYsetStateMsc()
BEGIN(St_Msc);
}
void doctokenizerYYsetStatePlantUML()
void doctokenizerYYsetStatePlantUMLOpt()
{
g_token->verb="";
g_token->sectionId="";
BEGIN(St_PlantUMLOpt);
}
void doctokenizerYYsetStatePlantUML()
{
g_token->verb="";
BEGIN(St_PlantUML);
}
void doctokenizerYYsetStateParam()
{
BEGIN(St_Param);
......
......@@ -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)
{
if (m_hide) return;
......@@ -382,6 +408,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
static int dotindex = 1;
QCString fileName(4096);
forceEndParagraph(s);
fileName.sprintf("%s%d%s",
(Config_getString("HTML_OUTPUT")+"/inline_dotgraph_").data(),
dotindex++,
......@@ -392,16 +419,21 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
{
err("Could not open file %s for writing\n",fileName.data());
}
file.writeBlock( s->text(), s->text().length() );
file.close();
else
{
file.writeBlock( s->text(), s->text().length() );
file.close();
forceEndParagraph(s);
m_t << "<div align=\"center\">" << endl;
writeDotFile(fileName,s->relPath(),s->context());
m_t << "</div>" << endl;
forceStartParagraph(s);
m_t << "<div align=\"center\">" << endl;
writeDotFile(fileName,s->relPath(),s->context());
visitPreCaption(m_t, s);
visitCaption(this, s->m_children);
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;
case DocVerbatim::Msc:
......@@ -420,17 +452,24 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
{
err("Could not open file %s.msc for writing\n",baseName.data());
}
QCString text = "msc {";
text+=s->text();
text+="}";
else
{
QCString text = "msc {";
text+=s->text();
text+="}";
file.writeBlock( text, text.length() );
file.close();
file.writeBlock( text, text.length() );
file.close();
m_t << "<div align=\"center\">" << endl;
writeMscFile(baseName+".msc",s->relPath(),s->context());
if (Config_getBool("DOT_CLEANUP")) file.remove();
m_t << "</div>" << endl;
m_t << "<div align=\"center\">" << endl;
writeMscFile(baseName+".msc",s->relPath(),s->context());
visitPreCaption(m_t, s);
visitCaption(this, s->m_children);
visitPostCaption(m_t, s);
m_t << "</div>" << endl;
if (Config_getBool("DOT_CLEANUP")) file.remove();
}
forceStartParagraph(s);
}
break;
......@@ -442,6 +481,9 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
QCString baseName = writePlantUMLSource(htmlOutput,s->exampleFile(),s->text());
m_t << "<div align=\"center\">" << endl;
writePlantUMLFile(baseName,s->relPath(),s->context());
visitPreCaption(m_t, s);
visitCaption(this, s->m_children);
visitPostCaption(m_t, s);
m_t << "</div>" << endl;
forceStartParagraph(s);
}
......
This diff is collapsed.
......@@ -170,13 +170,13 @@ class LatexDocVisitor : public DocVisitor
void startMscFile(const QCString &fileName,const QCString &width,
const QCString &height, 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,
const QCString &height, bool hasCaption);
void endDiaFile(bool hasCaption);
void writeDiaFile(const QCString &fileName);
void writePlantUMLFile(const QCString &fileName);
void writeDiaFile(const QCString &fileName, DocVerbatim *s);
void writePlantUMLFile(const QCString &fileName, DocVerbatim *s);
void pushEnabled();
void popEnabled();
......
......@@ -269,28 +269,29 @@ static void writeDefaultHeaderPart1(FTextStream &t)
t << "% Packages required by doxygen\n"
"\\usepackage{fixltx2e}\n" // for \textsubscript
"\\usepackage{calc}\n"
"\\usepackage{doxygen}\n";
QStrList extraLatexStyle = Config_getList("LATEX_EXTRA_STYLESHEET");
for (uint i=0; i<extraLatexStyle.count(); ++i)
{
QCString fileName(extraLatexStyle.at(i));
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
if (fi.exists())
{
if (checkExtension(fi.fileName().data(), latexStyleExtension))
{
// strip the extension, it will be added by the usepackage in the tex conversion process
t << "\\usepackage{" << stripExtensionGeneral(fi.fileName().data(), latexStyleExtension) << "}\n";
}
else
{
t << "\\usepackage{" << fi.fileName().utf8() << "}\n";
}
}
}
}
"\\usepackage{doxygen}\n"
"\\usepackage[export]{adjustbox} % also loads graphicx\n";
QStrList extraLatexStyle = Config_getList("LATEX_EXTRA_STYLESHEET");
for (uint i=0; i<extraLatexStyle.count(); ++i)
{
QCString fileName(extraLatexStyle.at(i));
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
if (fi.exists())
{
if (checkExtension(fi.fileName().data(), latexStyleExtension))
{
// strip the extension, it will be added by the usepackage in the tex conversion process
t << "\\usepackage{" << stripExtensionGeneral(fi.fileName().data(), latexStyleExtension) << "}\n";
}
else
{
t << "\\usepackage{" << fi.fileName().utf8() << "}\n";
}
}
}
}
t << "\\usepackage{graphicx}\n"
"\\usepackage[utf8]{inputenc}\n"
"\\usepackage{makeidx}\n"
......
......@@ -483,7 +483,7 @@ class PrintDocVisitor : public DocVisitor
case DocImage::Rtf: printf("rtf"); 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 *)
{
......
......@@ -32,6 +32,74 @@
#include "config.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,
const QCString &name, bool writeType, DocImage::Type type, const QCString &width,
const QCString &height)
{
QCString tmpStr;
t << "<" << cmd;
if (writeType)
{
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)
{
t << "</" << cmd << ">" << endl;
}
XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci)
: DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
{
......@@ -199,20 +267,20 @@ void XmlDocVisitor::visit(DocVerbatim *s)
filter(s->text());
m_t << "</docbookonly>";
break;
case DocVerbatim::Dot:
m_t << "<dot>";
case DocVerbatim::Dot:
visitPreStart(m_t, "dot", s->hasCaption(), this, s->children(), QCString(""), FALSE, DocImage::Html, s->width(), s->height());
filter(s->text());
m_t << "</dot>";
visitPostEnd(m_t, "dot");
break;
case DocVerbatim::Msc:
m_t << "<msc>";
case DocVerbatim::Msc:
visitPreStart(m_t, "msc", s->hasCaption(), this, s->children(), QCString(""), FALSE, DocImage::Html, s->width(), s->height());
filter(s->text());
m_t << "</msc>";
visitPostEnd(m_t, "msc");
break;
case DocVerbatim::PlantUML:
m_t << "<plantuml>";
visitPreStart(m_t, "plantuml", s->hasCaption(), this, s->children(), QCString(""), FALSE, DocImage::Html, s->width(), s->height());
filter(s->text());
m_t << "</plantuml>";
visitPostEnd(m_t, "plantuml");
break;
}
}
......@@ -682,15 +750,6 @@ void XmlDocVisitor::visitPost(DocHtmlHeader *)
void XmlDocVisitor::visitPre(DocImage *img)
{
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();
int i;
......@@ -698,20 +757,7 @@ void XmlDocVisitor::visitPre(DocImage *img)
{
baseName=baseName.right(baseName.length()-i-1);
}
m_t << " name=\"" << baseName << "\"";
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 << ">";
visitPreStart(m_t, "image", FALSE, this, img->children(), baseName, TRUE, img->type(), img->width(), img->height());
// copy the image to the output dir
QFile inImage(img->name());
......@@ -732,43 +778,43 @@ void XmlDocVisitor::visitPre(DocImage *img)
void XmlDocVisitor::visitPost(DocImage *)
{
if (m_hide) return;
m_t << "</image>" << endl;
visitPostEnd(m_t, "image");
}
void XmlDocVisitor::visitPre(DocDotFile *df)
{
if (m_hide) return;
m_t << "<dotfile name=\"" << df->file() << "\">";
visitPreStart(m_t, "dotfile", FALSE, this, df->children(), df->file(), FALSE, DocImage::Html, df->width(), df->height());
}
void XmlDocVisitor::visitPost(DocDotFile *)
{
if (m_hide) return;
m_t << "</dotfile>" << endl;
visitPostEnd(m_t, "dotfile");
}
void XmlDocVisitor::visitPre(DocMscFile *df)
{
if (m_hide) return;
m_t << "<mscfile name=\"" << df->file() << "\">";
visitPreStart(m_t, "mscfile", FALSE, this, df->children(), df->file(), FALSE, DocImage::Html, df->width(), df->height());
}
void XmlDocVisitor::visitPost(DocMscFile *)
{
if (m_hide) return;
m_t << "</mscfile>" << endl;
visitPostEnd(m_t, "mscfile");
}
void XmlDocVisitor::visitPre(DocDiaFile *df)
{
if (m_hide) return;
m_t << "<diafile name=\"" << df->file() << "\">";
visitPreStart(m_t, "diafile", FALSE, this, df->children(), df->file(), FALSE, DocImage::Html, df->width(), df->height());
}
void XmlDocVisitor::visitPost(DocDiaFile *)
{
if (m_hide) return;
m_t << "</diafile>" << endl;
visitPostEnd(m_t, "diafile");
}
void XmlDocVisitor::visitPre(DocLink *lnk)
......
......@@ -142,7 +142,9 @@
% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
% (only if no caption is specified)
\newenvironment{DoxyImageNoCaption}{%
\begin{center}%
}{%
\end{center}%
}
% Used by @attention
......
......@@ -4,14 +4,15 @@
<compoundname>index</compoundname>
<title>My Project</title>
<detaileddescription>
<para>Class relations expressed via an inline dot graph: <dot>
<para>Class relations expressed via an inline dot graph: <dot>
digraph example {
node [shape=record, fontname=Helvetica, fontsize=10];
b [ label="class B" URL="\ref B"];
c [ label="class C" URL="\ref C"];
b -&gt; c [ arrowhead="open", style="dashed" ];
}
</dot> </para>
</dot>
</para>
</detaileddescription>
</compounddef>
</doxygen>
......@@ -6,7 +6,7 @@
<detaileddescription>
<para>Some text. <image type="html" name="sample.png"/>
<image type="latex" name="sample.png" width="5cm">Doxygen logo</image>
More text. </para>
More text. </para>
</detaileddescription>
</compounddef>
</doxygen>
......@@ -25,11 +25,12 @@
<briefdescription>
</briefdescription>
<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&lt;-Sender [label="Command()", URL="\ref Command()"];
Receiver-&gt;Sender [label="Ack()", URL="\ref Sender::Ack()", ID="1"];
</msc> </para>
</msc>
</para>
</detaileddescription>
<location file="037_msc.cpp" bodystart="28" bodyend="33"/>
<listofallmembers>
......
......@@ -25,11 +25,12 @@
<briefdescription>
</briefdescription>
<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-&gt;Receiver [label="Command()", URL="\ref Receiver::Command()"];
Sender&lt;-Receiver [label="Ack()", URL="\ref Ack()", ID="1"];
</msc> </para>
</msc>
</para>
</detaileddescription>
<location file="037_msc.cpp" bodystart="13" bodyend="18"/>
<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