Skip to content

Commit a1c6006

Browse files
committed
Support SVG for different formats in Mermaid diagrams
- support SVG for different formats in Mermaid diagrams - synchronize handling of output format and output extension for Mermaid
1 parent e5fb95b commit a1c6006

File tree

6 files changed

+68
-52
lines changed

6 files changed

+68
-52
lines changed

src/docbookvisitor.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,9 @@ DB_VIS_C
403403
if (Config_getBool(MERMAID_RENDER_MODE)!=MERMAID_RENDER_MODE_t::CLIENT_SIDE)
404404
{
405405
QCString docbookOutput = Config_getString(DOCBOOK_OUTPUT);
406+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
406407
QCString baseName = MermaidManager::instance().writeMermaidSource(docbookOutput,
407-
s.exampleFile(),s.text(),MermaidManager::OutputFormat::Bitmap,
408+
s.exampleFile(),s.text(),format,
408409
s.srcFile(),s.srcLine());
409410
m_t << "<para>\n";
410411
writeMermaidFile(baseName,s);
@@ -1620,8 +1621,10 @@ DB_VIS_C
16201621
if (Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE) return;
16211622
QCString shortName = stripPath(baseName);
16221623
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
1623-
MermaidManager::instance().generateMermaidOutput(baseName,outDir,MermaidManager::OutputFormat::Bitmap,false);
1624-
visitPreStart(m_t, s.children(), s.hasCaption(), s.relPath() + shortName + ".png", s.width(),s.height());
1624+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
1625+
QCString imgExt = MermaidManager::imageExtension(format);
1626+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,format,false);
1627+
visitPreStart(m_t, s.children(), s.hasCaption(), s.relPath() + shortName + "." + imgExt, s.width(),s.height());
16251628
visitCaption(s.children());
16261629
visitPostEnd(m_t, s.hasCaption());
16271630
}
@@ -1641,12 +1644,14 @@ DB_VIS_C
16411644
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
16421645
std::string inBuf;
16431646
readInputFile(fileName,inBuf);
1647+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
1648+
QCString imgExt = MermaidManager::imageExtension(format);
16441649
QCString baseName = MermaidManager::instance().writeMermaidSource(outDir,
1645-
QCString(),inBuf,MermaidManager::OutputFormat::Bitmap,srcFile,srcLine);
1650+
QCString(),inBuf,format,srcFile,srcLine);
16461651
QCString shortName = stripPath(baseName);
1647-
MermaidManager::instance().generateMermaidOutput(baseName,outDir,MermaidManager::OutputFormat::Bitmap,false);
1652+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,format,false);
16481653
m_t << "<para>\n";
1649-
visitPreStart(m_t, children, hasCaption, relPath + shortName + ".png", width, height);
1654+
visitPreStart(m_t, children, hasCaption, relPath + shortName + "." + imgExt, width, height);
16501655
}
16511656

16521657
void DocbookDocVisitor::endMermaidFile(bool hasCaption)

src/htmldocvisitor.cpp

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -656,12 +656,7 @@ void HtmlDocVisitor::operator()(const DocVerbatim &s)
656656
if (Config_getEnum(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLI) // CLI mode: pre-generate image via mmdc
657657
{
658658
QCString htmlOutput = Config_getString(HTML_OUTPUT);
659-
QCString imgExt = getDotImageExtension();
660-
MermaidManager::OutputFormat format = MermaidManager::OutputFormat::Bitmap;
661-
if (imgExt=="svg")
662-
{
663-
format = MermaidManager::OutputFormat::SVG;
664-
}
659+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
665660
QCString baseName = MermaidManager::instance().writeMermaidSource(
666661
htmlOutput,s.exampleFile(),
667662
s.text(),format,s.srcFile(),s.srcLine());
@@ -1882,12 +1877,7 @@ void HtmlDocVisitor::operator()(const DocMermaidFile &df)
18821877
if (Config_getEnum(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLI)
18831878
{
18841879
QCString htmlOutput = Config_getString(HTML_OUTPUT);
1885-
QCString imgExt = getDotImageExtension();
1886-
MermaidManager::OutputFormat format = MermaidManager::OutputFormat::Bitmap;
1887-
if (imgExt=="svg")
1888-
{
1889-
format = MermaidManager::OutputFormat::SVG;
1890-
}
1880+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
18911881
std::string inBuf;
18921882
readInputFile(df.file(),inBuf);
18931883
QCString baseName = MermaidManager::instance().writeMermaidSource(htmlOutput,QCString(),
@@ -2336,16 +2326,17 @@ void HtmlDocVisitor::writeMermaidFile(const QCString &fileName, const QCString &
23362326
{
23372327
QCString baseName=makeBaseName(fileName,".mmd");
23382328
QCString outDir = Config_getString(HTML_OUTPUT);
2339-
QCString imgExt = getDotImageExtension();
2340-
if (imgExt=="svg")
2329+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
2330+
QCString imgExt = MermaidManager::imageExtension(format);
2331+
2332+
MermaidManager::instance().generateMermaidOutput(fileName,outDir,format,true);
2333+
if (format == MermaidManager::OutputFormat::SVG)
23412334
{
2342-
MermaidManager::instance().generateMermaidOutput(fileName,outDir,MermaidManager::OutputFormat::SVG,true);
2343-
m_t << "<object type=\"image/svg+xml\" data=\"" << relPath << baseName << ".svg\"></object>\n";
2335+
m_t << "<object type=\"image/svg+xml\" data=\"" << relPath << baseName << "." << imgExt << "\"></object>\n";
23442336
}
23452337
else
23462338
{
2347-
MermaidManager::instance().generateMermaidOutput(fileName,outDir,MermaidManager::OutputFormat::Bitmap,true);
2348-
m_t << "<img src=\"" << relPath << baseName << ".png" << "\" />\n";
2339+
m_t << "<img src=\"" << relPath << baseName << "." << imgExt << "\" />\n";
23492340
}
23502341
}
23512342

src/latexdocvisitor.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -502,10 +502,9 @@ void LatexDocVisitor::operator()(const DocVerbatim &s)
502502
if (Config_getBool(MERMAID_RENDER_MODE)!=MERMAID_RENDER_MODE_t::CLIENT_SIDE)
503503
{
504504
QCString latexOutput = Config_getString(LATEX_OUTPUT);
505-
bool usePDFLatex = Config_getBool(USE_PDFLATEX);
505+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::PDF);
506506
QCString baseName = MermaidManager::instance().writeMermaidSource(
507-
latexOutput,s.exampleFile(),s.text(),
508-
usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap,
507+
latexOutput,s.exampleFile(),s.text(),format,
509508
s.srcFile(),s.srcLine());
510509
writeMermaidFile(baseName, s);
511510
}
@@ -2068,10 +2067,11 @@ void LatexDocVisitor::writeMermaidFile(const QCString &baseName, const DocVerbat
20682067
{
20692068
if (Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE) return;
20702069
QCString shortName = stripPath(baseName);
2071-
bool usePDFLatex = Config_getBool(USE_PDFLATEX);
2072-
if (shortName.find('.')==-1) shortName += usePDFLatex ? ".pdf" : ".png";
2070+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::PDF);
2071+
QCString imgExt = MermaidManager::imageExtension(format);
2072+
if (shortName.find('.')==-1) shortName += "." + imgExt;
20732073
QCString outDir = Config_getString(LATEX_OUTPUT);
2074-
MermaidManager::instance().generateMermaidOutput(baseName,outDir,usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap,false);
2074+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,format,false);
20752075
visitPreStart(m_t, s.hasCaption(), shortName, s.width(), s.height());
20762076
visitCaption(s.children());
20772077
visitPostEnd(m_t, s.hasCaption());
@@ -2089,15 +2089,16 @@ void LatexDocVisitor::startMermaidFile(const QCString &fileName,
20892089
QCString outDir = Config_getString(LATEX_OUTPUT);
20902090
std::string inBuf;
20912091
readInputFile(fileName,inBuf);
2092+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::PDF);
2093+
QCString imgExt = MermaidManager::imageExtension(format);
20922094

20932095
bool usePDFLatex = Config_getBool(USE_PDFLATEX);
20942096
QCString baseName = MermaidManager::instance().writeMermaidSource(
2095-
outDir,QCString(),inBuf,
2096-
usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap,
2097+
outDir,QCString(),inBuf,format,
20972098
srcFile,srcLine);
20982099
QCString shortName = stripPath(baseName);
2099-
if (shortName.find('.')==-1) shortName += usePDFLatex ? ".pdf" : ".png";
2100-
MermaidManager::instance().generateMermaidOutput(baseName,outDir,usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap,false);
2100+
if (shortName.find('.')==-1) shortName += "." + imgExt;
2101+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,format,false);
21012102
visitPreStart(m_t,hasCaption, shortName, width, height);
21022103
}
21032104

src/mermaid.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,33 @@ QCString MermaidManager::imageExtension(OutputFormat format)
4444
{
4545
switch (format)
4646
{
47-
case OutputFormat::Bitmap: return ".png";
48-
case OutputFormat::SVG: return ".svg";
49-
case OutputFormat::PDF: return ".pdf";
47+
case OutputFormat::Bitmap: return "png";
48+
case OutputFormat::SVG: return "svg";
49+
case OutputFormat::PDF: return "pdf";
5050
}
51-
return ".png";
51+
return "png";
5252
}
5353

54+
MermaidManager::OutputFormat MermaidManager::imageFormat(OutputFormat format)
55+
{
56+
if (format == MermaidManager::OutputFormat::Bitmap)
57+
{
58+
QCString imgExt = getDotImageExtension();
59+
if (imgExt=="svg")
60+
{
61+
return MermaidManager::OutputFormat::SVG;
62+
}
63+
}
64+
else if (format == MermaidManager::OutputFormat::PDF)
65+
{
66+
bool usePDFLatex = Config_getBool(USE_PDFLATEX);
67+
return usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap;
68+
}
69+
70+
return format;
71+
}
72+
73+
5474
QCString MermaidManager::writeMermaidSource(const QCString &outDirArg, const QCString &fileName,
5575
const QCString &content, OutputFormat format,
5676
const QCString &srcFile, int srcLine)
@@ -108,7 +128,7 @@ void MermaidManager::generateMermaidOutput(const QCString &baseName, const QCStr
108128
{
109129
imgName = imgName.mid(i + 1);
110130
}
111-
imgName += imageExtension(format);
131+
imgName += "." + imageExtension(format);
112132
Doxygen::indexList->addImageFile(imgName);
113133
}
114134

@@ -143,13 +163,7 @@ static void runMermaid(const MermaidManager::DiagramList &diagrams)
143163
//printf("content=%s\n",qPrint(mc.content));
144164
if (diagram.info.content.isEmpty()) continue;
145165

146-
QCString ext;
147-
switch (diagram.format)
148-
{
149-
case MermaidManager::OutputFormat::Bitmap: ext = "png"; break;
150-
case MermaidManager::OutputFormat::SVG: ext = "svg"; break;
151-
case MermaidManager::OutputFormat::PDF: ext = "pdf"; break;
152-
}
166+
QCString ext = MermaidManager::imageExtension(diagram.format);
153167

154168
QCString inputFile = diagram.info.baseName + ".mmd";
155169
QCString outputFile = diagram.info.baseName + "." + ext;

src/mermaid.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,12 @@ class MermaidManager
7777
};
7878
using DiagramList = std::vector<MermaidDiagram>;
7979

80+
static QCString imageExtension(OutputFormat format);
81+
static OutputFormat imageFormat(OutputFormat format);
82+
8083
private:
8184
MermaidManager();
8285

83-
static QCString imageExtension(OutputFormat format);
84-
8586
DiagramList m_diagrams;
8687
};
8788

src/rtfdocvisitor.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -405,8 +405,9 @@ void RTFDocVisitor::operator()(const DocVerbatim &s)
405405
if (Config_getBool(MERMAID_RENDER_MODE)!=MERMAID_RENDER_MODE_t::CLIENT_SIDE)
406406
{
407407
QCString rtfOutput = Config_getString(RTF_OUTPUT);
408+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
408409
QCString baseName = MermaidManager::instance().writeMermaidSource(
409-
rtfOutput,s.exampleFile(),s.text(),MermaidManager::OutputFormat::Bitmap,
410+
rtfOutput,s.exampleFile(),s.text(),format,
410411
s.srcFile(),s.srcLine());
411412
writeMermaidFile(baseName, s.hasCaption());
412413
visitChildren(s);
@@ -1340,8 +1341,9 @@ void RTFDocVisitor::operator()(const DocMermaidFile &df)
13401341
QCString rtfOutput = Config_getString(RTF_OUTPUT);
13411342
std::string inBuf;
13421343
readInputFile(df.file(),inBuf);
1344+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
13431345
QCString baseName = MermaidManager::instance().writeMermaidSource(
1344-
rtfOutput,QCString(),inBuf,MermaidManager::OutputFormat::Bitmap,
1346+
rtfOutput,QCString(),inBuf,format,
13451347
df.srcFile(),df.srcLine());
13461348
writeMermaidFile(baseName, df.hasCaption());
13471349
visitChildren(df);
@@ -1801,6 +1803,8 @@ void RTFDocVisitor::writeMermaidFile(const QCString &fileName, bool hasCaption)
18011803
if (Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE) return;
18021804
QCString baseName=makeBaseName(fileName,".mmd");
18031805
QCString outDir = Config_getString(RTF_OUTPUT);
1804-
MermaidManager::instance().generateMermaidOutput(fileName,outDir,MermaidManager::OutputFormat::Bitmap,false);
1805-
includePicturePreRTF(baseName + ".png", true, hasCaption);
1806+
MermaidManager::OutputFormat format = MermaidManager::imageFormat(MermaidManager::OutputFormat::Bitmap);
1807+
QCString imgExt = MermaidManager::imageExtension(format);
1808+
MermaidManager::instance().generateMermaidOutput(fileName,outDir,format,false);
1809+
includePicturePreRTF(baseName + "." + imgExt, true, hasCaption);
18061810
}

0 commit comments

Comments
 (0)