Skip to content

Commit 3cec2c4

Browse files
committed
Merge branch 'albert-github-feature/bug_mermaid_svg'
2 parents de60052 + 39f39b0 commit 3cec2c4

File tree

6 files changed

+109
-88
lines changed

6 files changed

+109
-88
lines changed

src/docbookvisitor.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -402,9 +402,11 @@ DB_VIS_C
402402
case DocVerbatim::Mermaid:
403403
if (Config_getBool(MERMAID_RENDER_MODE)!=MERMAID_RENDER_MODE_t::CLIENT_SIDE)
404404
{
405-
QCString docbookOutput = Config_getString(DOCBOOK_OUTPUT);
406-
QCString baseName = MermaidManager::instance().writeMermaidSource(docbookOutput,
407-
s.exampleFile(),s.text(),MermaidManager::OutputFormat::Bitmap,
405+
auto docbookOutput = Config_getString(DOCBOOK_OUTPUT);
406+
auto outputFormat = MermaidManager::OutputFormat::Docbook;
407+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
408+
auto baseName = MermaidManager::instance().writeMermaidSource(docbookOutput,
409+
s.exampleFile(),s.text(),imageFormat,
408410
s.srcFile(),s.srcLine());
409411
m_t << "<para>\n";
410412
writeMermaidFile(baseName,s);
@@ -1618,10 +1620,13 @@ void DocbookDocVisitor::writeMermaidFile(const QCString &baseName, const DocVerb
16181620
{
16191621
DB_VIS_C
16201622
if (Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE) return;
1621-
QCString shortName = stripPath(baseName);
1622-
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());
1623+
auto shortName = stripPath(baseName);
1624+
auto outDir = Config_getString(DOCBOOK_OUTPUT);
1625+
auto outputFormat = MermaidManager::OutputFormat::Docbook;
1626+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
1627+
auto imgExt = MermaidManager::imageExtension(imageFormat);
1628+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,imageFormat,false);
1629+
visitPreStart(m_t, s.children(), s.hasCaption(), s.relPath() + shortName + "." + imgExt, s.width(),s.height());
16251630
visitCaption(s.children());
16261631
visitPostEnd(m_t, s.hasCaption());
16271632
}
@@ -1641,12 +1646,14 @@ DB_VIS_C
16411646
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
16421647
std::string inBuf;
16431648
readInputFile(fileName,inBuf);
1644-
QCString baseName = MermaidManager::instance().writeMermaidSource(outDir,
1645-
QCString(),inBuf,MermaidManager::OutputFormat::Bitmap,srcFile,srcLine);
1646-
QCString shortName = stripPath(baseName);
1647-
MermaidManager::instance().generateMermaidOutput(baseName,outDir,MermaidManager::OutputFormat::Bitmap,false);
1649+
auto outputFormat = MermaidManager::OutputFormat::Docbook;
1650+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
1651+
auto imgExt = MermaidManager::imageExtension(imageFormat);
1652+
auto baseName = MermaidManager::instance().writeMermaidSource(outDir,QCString(),inBuf,imageFormat,srcFile,srcLine);
1653+
auto shortName = stripPath(baseName);
1654+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,imageFormat,false);
16481655
m_t << "<para>\n";
1649-
visitPreStart(m_t, children, hasCaption, relPath + shortName + ".png", width, height);
1656+
visitPreStart(m_t, children, hasCaption, relPath + shortName + "." + imgExt, width, height);
16501657
}
16511658

16521659
void DocbookDocVisitor::endMermaidFile(bool hasCaption)

src/htmldocvisitor.cpp

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -655,16 +655,12 @@ void HtmlDocVisitor::operator()(const DocVerbatim &s)
655655
forceEndParagraph(s);
656656
if (Config_getEnum(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLI) // CLI mode: pre-generate image via mmdc
657657
{
658-
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-
}
658+
auto htmlOutput = Config_getString(HTML_OUTPUT);
659+
auto outputFormat = MermaidManager::OutputFormat::HTML;
660+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
665661
QCString baseName = MermaidManager::instance().writeMermaidSource(
666662
htmlOutput,s.exampleFile(),
667-
s.text(),format,s.srcFile(),s.srcLine());
663+
s.text(),imageFormat,s.srcFile(),s.srcLine());
668664
m_t << "<div class=\"mermaidgraph\">\n";
669665
writeMermaidFile(baseName,s.relPath(),s.context(),s.srcFile(),s.srcLine());
670666
visitCaption(m_t, s);
@@ -1881,17 +1877,13 @@ void HtmlDocVisitor::operator()(const DocMermaidFile &df)
18811877
forceEndParagraph(df);
18821878
if (Config_getEnum(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLI)
18831879
{
1884-
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-
}
18911880
std::string inBuf;
18921881
readInputFile(df.file(),inBuf);
1882+
auto htmlOutput = Config_getString(HTML_OUTPUT);
1883+
auto outputFormat = MermaidManager::OutputFormat::HTML;
1884+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
18931885
QCString baseName = MermaidManager::instance().writeMermaidSource(htmlOutput,QCString(),
1894-
inBuf,format,df.srcFile(),df.srcLine());
1886+
inBuf,imageFormat,df.srcFile(),df.srcLine());
18951887
m_t << "<div class=\"mermaidgraph\">\n";
18961888
writeMermaidFile(baseName,df.relPath(),QCString(),df.srcFile(),df.srcLine());
18971889
if (df.hasCaption())
@@ -2334,18 +2326,19 @@ void HtmlDocVisitor::writePlantUMLFile(const QCString &fileName, const QCString
23342326
void HtmlDocVisitor::writeMermaidFile(const QCString &fileName, const QCString &relPath,
23352327
const QCString &,const QCString &/* srcFile */,int /* srcLine */)
23362328
{
2337-
QCString baseName=makeBaseName(fileName,".mmd");
2338-
QCString outDir = Config_getString(HTML_OUTPUT);
2339-
QCString imgExt = getDotImageExtension();
2340-
if (imgExt=="svg")
2329+
auto baseName = makeBaseName(fileName,".mmd");
2330+
auto outDir = Config_getString(HTML_OUTPUT);
2331+
auto outputFormat = MermaidManager::OutputFormat::HTML;
2332+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
2333+
auto imgExt = MermaidManager::imageExtension(imageFormat);
2334+
MermaidManager::instance().generateMermaidOutput(fileName,outDir,imageFormat,true);
2335+
if (imageFormat == MermaidManager::ImageFormat::SVG)
23412336
{
2342-
MermaidManager::instance().generateMermaidOutput(fileName,outDir,MermaidManager::OutputFormat::SVG,true);
2343-
m_t << "<object type=\"image/svg+xml\" data=\"" << relPath << baseName << ".svg\"></object>\n";
2337+
m_t << "<object type=\"image/svg+xml\" data=\"" << relPath << baseName << "." << imgExt << "\"></object>\n";
23442338
}
23452339
else
23462340
{
2347-
MermaidManager::instance().generateMermaidOutput(fileName,outDir,MermaidManager::OutputFormat::Bitmap,true);
2348-
m_t << "<img src=\"" << relPath << baseName << ".png" << "\" />\n";
2341+
m_t << "<img src=\"" << relPath << baseName << "." << imgExt << "\" />\n";
23492342
}
23502343
}
23512344

src/latexdocvisitor.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -501,11 +501,11 @@ void LatexDocVisitor::operator()(const DocVerbatim &s)
501501
case DocVerbatim::Mermaid:
502502
if (Config_getBool(MERMAID_RENDER_MODE)!=MERMAID_RENDER_MODE_t::CLIENT_SIDE)
503503
{
504-
QCString latexOutput = Config_getString(LATEX_OUTPUT);
505-
bool usePDFLatex = Config_getBool(USE_PDFLATEX);
504+
auto latexOutput = Config_getString(LATEX_OUTPUT);
505+
auto outputFormat = MermaidManager::OutputFormat::LaTeX;
506+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
506507
QCString baseName = MermaidManager::instance().writeMermaidSource(
507-
latexOutput,s.exampleFile(),s.text(),
508-
usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap,
508+
latexOutput,s.exampleFile(),s.text(),imageFormat,
509509
s.srcFile(),s.srcLine());
510510
writeMermaidFile(baseName, s);
511511
}
@@ -2067,11 +2067,13 @@ void LatexDocVisitor::endPlantUmlFile(bool hasCaption)
20672067
void LatexDocVisitor::writeMermaidFile(const QCString &baseName, const DocVerbatim &s)
20682068
{
20692069
if (Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE) return;
2070-
QCString shortName = stripPath(baseName);
2071-
bool usePDFLatex = Config_getBool(USE_PDFLATEX);
2072-
if (shortName.find('.')==-1) shortName += usePDFLatex ? ".pdf" : ".png";
2073-
QCString outDir = Config_getString(LATEX_OUTPUT);
2074-
MermaidManager::instance().generateMermaidOutput(baseName,outDir,usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap,false);
2070+
auto shortName = stripPath(baseName);
2071+
auto outDir = Config_getString(LATEX_OUTPUT);
2072+
auto outputFormat = MermaidManager::OutputFormat::LaTeX;
2073+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
2074+
auto imgExt = MermaidManager::imageExtension(imageFormat);
2075+
if (shortName.find('.')==-1) shortName += "." + imgExt;
2076+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,imageFormat,false);
20752077
visitPreStart(m_t, s.hasCaption(), shortName, s.width(), s.height());
20762078
visitCaption(s.children());
20772079
visitPostEnd(m_t, s.hasCaption());
@@ -2089,15 +2091,15 @@ void LatexDocVisitor::startMermaidFile(const QCString &fileName,
20892091
QCString outDir = Config_getString(LATEX_OUTPUT);
20902092
std::string inBuf;
20912093
readInputFile(fileName,inBuf);
2092-
2093-
bool usePDFLatex = Config_getBool(USE_PDFLATEX);
2094-
QCString baseName = MermaidManager::instance().writeMermaidSource(
2095-
outDir,QCString(),inBuf,
2096-
usePDFLatex ? MermaidManager::OutputFormat::PDF : MermaidManager::OutputFormat::Bitmap,
2094+
auto outputFormat = MermaidManager::OutputFormat::LaTeX;
2095+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
2096+
auto imgExt = MermaidManager::imageExtension(imageFormat);
2097+
auto baseName = MermaidManager::instance().writeMermaidSource(
2098+
outDir,QCString(),inBuf,imageFormat,
20972099
srcFile,srcLine);
2098-
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+
auto shortName = stripPath(baseName);
2101+
if (shortName.find('.')==-1) shortName += "." + imgExt;
2102+
MermaidManager::instance().generateMermaidOutput(baseName,outDir,imageFormat,false);
21012103
visitPreStart(m_t,hasCaption, shortName, width, height);
21022104
}
21032105

src/mermaid.cpp

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,35 @@ MermaidManager::MermaidManager()
4040
{
4141
}
4242

43-
QCString MermaidManager::imageExtension(OutputFormat format)
43+
QCString MermaidManager::imageExtension(ImageFormat 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 ImageFormat::PNG: return "png";
48+
case ImageFormat::SVG: return "svg";
49+
case ImageFormat::PDF: return "pdf";
5050
}
51-
return ".png";
51+
return "png";
52+
}
53+
54+
MermaidManager::ImageFormat MermaidManager::convertToImageFormat(OutputFormat outputFormat)
55+
{
56+
switch(outputFormat)
57+
{
58+
case OutputFormat::HTML:
59+
// fall through
60+
case OutputFormat::RTF:
61+
// fall through
62+
case OutputFormat::Docbook:
63+
return getDotImageExtension()=="svg" ? ImageFormat::SVG : ImageFormat::PNG;
64+
case OutputFormat::LaTeX:
65+
return Config_getBool(USE_PDFLATEX) ? ImageFormat::PDF : ImageFormat::PNG;
66+
}
67+
return ImageFormat::PNG;
5268
}
5369

5470
QCString MermaidManager::writeMermaidSource(const QCString &outDirArg, const QCString &fileName,
55-
const QCString &content, OutputFormat format,
71+
const QCString &content, ImageFormat imageFormat,
5672
const QCString &srcFile, int srcLine)
5773
{
5874
QCString outDir(outDirArg);
@@ -93,13 +109,13 @@ QCString MermaidManager::writeMermaidSource(const QCString &outDirArg, const QCS
93109
file.close();
94110

95111
// Store for batch processing in run()
96-
m_diagrams.emplace_back(format,MermaidDiagramInfo(baseName, content, outDir, srcFile, srcLine));
112+
m_diagrams.emplace_back(imageFormat,MermaidDiagramInfo(baseName, content, outDir, srcFile, srcLine));
97113

98114
return baseName;
99115
}
100116

101117
void MermaidManager::generateMermaidOutput(const QCString &baseName, const QCString &/*outDir*/,
102-
OutputFormat format, bool toIndex)
118+
ImageFormat imageFormat, bool toIndex)
103119
{
104120
if (!toIndex) return;
105121
QCString imgName = baseName;
@@ -108,7 +124,7 @@ void MermaidManager::generateMermaidOutput(const QCString &baseName, const QCStr
108124
{
109125
imgName = imgName.mid(i + 1);
110126
}
111-
imgName += imageExtension(format);
127+
imgName += "." + imageExtension(imageFormat);
112128
Doxygen::indexList->addImageFile(imgName);
113129
}
114130

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

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-
}
162+
QCString ext = MermaidManager::imageExtension(diagram.imageFormat);
153163

154164
QCString inputFile = diagram.info.baseName + ".mmd";
155165
QCString outputFile = diagram.info.baseName + "." + ext;

src/mermaid.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ class MermaidManager
4141
{
4242
public:
4343
/** Mermaid output image formats */
44-
enum class OutputFormat { Bitmap, SVG, PDF };
44+
enum class OutputFormat { HTML, LaTeX, RTF, Docbook };
45+
enum class ImageFormat { PNG, SVG, PDF };
4546

4647
static MermaidManager &instance();
4748

@@ -58,7 +59,7 @@ class MermaidManager
5859
* @returns The base name of the generated file (without extension).
5960
*/
6061
QCString writeMermaidSource(const QCString &outDirArg, const QCString &fileName,
61-
const QCString &content, OutputFormat format,
62+
const QCString &content, ImageFormat format,
6263
const QCString &srcFile, int srcLine);
6364

6465
/** Register a generated Mermaid image with the index.
@@ -67,21 +68,22 @@ class MermaidManager
6768
* @param[in] format the image format that was generated.
6869
* @param[in] toIndex add the file to the index lists for htmlhelp / qhc etc.
6970
*/
70-
void generateMermaidOutput(const QCString &baseName, const QCString &outDir, OutputFormat format, bool toIndex);
71+
void generateMermaidOutput(const QCString &baseName, const QCString &outDir, ImageFormat format, bool toIndex);
7172

7273
struct MermaidDiagram
7374
{
74-
MermaidDiagram(OutputFormat fmt, MermaidDiagramInfo &&inf) : format(fmt), info(std::move(inf)) {}
75-
OutputFormat format;
75+
MermaidDiagram(ImageFormat fmt, MermaidDiagramInfo &&inf) : imageFormat(fmt), info(std::move(inf)) {}
76+
ImageFormat imageFormat;
7677
MermaidDiagramInfo info;
7778
};
7879
using DiagramList = std::vector<MermaidDiagram>;
7980

81+
static QCString imageExtension(ImageFormat imageFormat);
82+
static ImageFormat convertToImageFormat(OutputFormat outputFormat);
83+
8084
private:
8185
MermaidManager();
8286

83-
static QCString imageExtension(OutputFormat format);
84-
8587
DiagramList m_diagrams;
8688
};
8789

src/rtfdocvisitor.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -404,10 +404,12 @@ void RTFDocVisitor::operator()(const DocVerbatim &s)
404404
case DocVerbatim::Mermaid:
405405
if (Config_getBool(MERMAID_RENDER_MODE)!=MERMAID_RENDER_MODE_t::CLIENT_SIDE)
406406
{
407-
QCString rtfOutput = Config_getString(RTF_OUTPUT);
408-
QCString baseName = MermaidManager::instance().writeMermaidSource(
409-
rtfOutput,s.exampleFile(),s.text(),MermaidManager::OutputFormat::Bitmap,
410-
s.srcFile(),s.srcLine());
407+
auto rtfOutput = Config_getString(RTF_OUTPUT);
408+
auto outputFormat = MermaidManager::OutputFormat::RTF;
409+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
410+
auto baseName = MermaidManager::instance().writeMermaidSource(
411+
rtfOutput,s.exampleFile(),s.text(),imageFormat,
412+
s.srcFile(),s.srcLine());
411413
writeMermaidFile(baseName, s.hasCaption());
412414
visitChildren(s);
413415
includePicturePostRTF(true, s.hasCaption());
@@ -1337,12 +1339,14 @@ void RTFDocVisitor::operator()(const DocMermaidFile &df)
13371339
DBG_RTF("{\\comment RTFDocVisitor::operator()(const DocMermaidFile &)}\n");
13381340
if (Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE) return;
13391341
if (!Config_getBool(DOT_CLEANUP)) copyFile(df.file(),Config_getString(RTF_OUTPUT)+"/"+stripPath(df.file()));
1340-
QCString rtfOutput = Config_getString(RTF_OUTPUT);
13411342
std::string inBuf;
13421343
readInputFile(df.file(),inBuf);
1343-
QCString baseName = MermaidManager::instance().writeMermaidSource(
1344-
rtfOutput,QCString(),inBuf,MermaidManager::OutputFormat::Bitmap,
1345-
df.srcFile(),df.srcLine());
1344+
auto rtfOutput = Config_getString(RTF_OUTPUT);
1345+
auto outputFormat = MermaidManager::OutputFormat::RTF;
1346+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
1347+
auto baseName = MermaidManager::instance().writeMermaidSource(
1348+
rtfOutput,QCString(),inBuf,imageFormat,
1349+
df.srcFile(),df.srcLine());
13461350
writeMermaidFile(baseName, df.hasCaption());
13471351
visitChildren(df);
13481352
includePicturePostRTF(true, df.hasCaption());
@@ -1799,8 +1803,11 @@ void RTFDocVisitor::writePlantUMLFile(const QCString &fileName, bool hasCaption)
17991803
void RTFDocVisitor::writeMermaidFile(const QCString &fileName, bool hasCaption)
18001804
{
18011805
if (Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE) return;
1802-
QCString baseName=makeBaseName(fileName,".mmd");
1803-
QCString outDir = Config_getString(RTF_OUTPUT);
1804-
MermaidManager::instance().generateMermaidOutput(fileName,outDir,MermaidManager::OutputFormat::Bitmap,false);
1805-
includePicturePreRTF(baseName + ".png", true, hasCaption);
1806+
auto baseName = makeBaseName(fileName,".mmd");
1807+
auto outDir = Config_getString(RTF_OUTPUT);
1808+
auto outputFormat = MermaidManager::OutputFormat::RTF;
1809+
auto imageFormat = MermaidManager::convertToImageFormat(outputFormat);
1810+
auto imgExt = MermaidManager::imageExtension(imageFormat);
1811+
MermaidManager::instance().generateMermaidOutput(fileName,outDir,imageFormat,false);
1812+
includePicturePreRTF(baseName + "." + imgExt, true, hasCaption);
18061813
}

0 commit comments

Comments
 (0)