Doxygen
Loading...
Searching...
No Matches
mermaid.cpp File Reference
#include <mutex>
#include <fstream>
#include "mermaid.h"
#include "util.h"
#include "portable.h"
#include "config.h"
#include "doxygen.h"
#include "message.h"
#include "debug.h"
#include "dir.h"
#include "indexlist.h"
#include "threadpool.h"
Include dependency graph for mermaid.cpp:

Go to the source code of this file.

Functions

static void runMermaid (const MermaidManager::DiagramList &diagrams)

Variables

static std::mutex g_mermaidMutex
static int g_mermaidIndex = 1

Function Documentation

◆ runMermaid()

void runMermaid ( const MermaidManager::DiagramList & diagrams)
static

Definition at line 131 of file mermaid.cpp.

132{
133 //printf("runMermaidContent for %zu images\n",contentList.size());
134 if (diagrams.empty()) return;
135
136 QCString mmdc = Config_getString(MERMAID_PATH);
137 if (!mmdc.isEmpty() && mmdc.at(mmdc.length()-1) != '/' && mmdc.at(mmdc.length()-1) != '\\')
138 {
139 mmdc += "/";
140 }
141 mmdc += "mmdc";
142
143 QCString mermaidConfigFile = Config_getString(MERMAID_CONFIG_FILE);
144
145 struct MermaidCmd
146 {
147 MermaidCmd(const QCString &mmdc_,const QCString &args_,const QCString &ext_,const QCString &srcFile_,int srcLine_) :
148 mmdc(mmdc_), args(args_), ext(ext_), srcFile(srcFile_), srcLine(srcLine_) {}
149 QCString mmdc;
150 QCString args;
151 QCString ext;
152 QCString srcFile;
153 int srcLine;
154 };
155 std::vector<MermaidCmd> mermaidCmds;
156
157 for (const auto &diagram : diagrams)
158 {
159 //printf("content=%s\n",qPrint(mc.content));
160 if (diagram.info.content.isEmpty()) continue;
161
162 QCString ext = MermaidManager::imageExtension(diagram.imageFormat);
163
164 QCString inputFile = diagram.info.baseName + ".mmd";
165 QCString outputFile = diagram.info.baseName + "." + ext;
166
167 // Check if content has changed since last run (caching)
168 FileInfo fi(outputFile.str());
169 if (fi.exists())
170 {
171 QCString cachedContent = fileToString(inputFile);
172 if (cachedContent == diagram.info.content)
173 {
174 continue;
175 }
176 }
177
178 // Build the mmdc command arguments
179 QCString args;
180 args += "-q -i \"" + inputFile + "\" ";
181 args += "-o \"" + outputFile + "\" ";
182
183 if (!mermaidConfigFile.isEmpty())
184 {
185 args += "-c \"" + mermaidConfigFile + "\" ";
186 }
187
188 mermaidCmds.emplace_back(mmdc, args,ext, diagram.info.srcFile, diagram.info.srcLine);
189 }
190
191 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(DOT_NUM_THREADS));
192 size_t offset=0;
193 size_t total=mermaidCmds.size();
194 msg("Generating {} Mermaid files using {} threads\n", total, numThreads);
195 if (numThreads>1) // multi threaded version
196 {
197 ThreadPool threadPool(numThreads);
198 std::vector< std::future<int> > results;
199
200 // queue the work
201 for (const auto &cmd : mermaidCmds)
202 {
203 auto processFile = [&cmd]()
204 {
205 Debug::print(Debug::Mermaid, 0, "*** MermaidManager::run Running: {} {}\n", cmd.mmdc, cmd.args);
206 int exitCode = Portable::system(cmd.mmdc.data(), cmd.args.data(), TRUE);
207 if (exitCode != 0)
208 {
209 err_full(cmd.srcFile, cmd.srcLine,
210 "Problems running Mermaid (mmdc). Verify that the command '{} {}' works from the command line. Exit code: {}.",
211 cmd.mmdc, cmd.args, exitCode);
212 }
213 return exitCode;
214 };
215 results.emplace_back(threadPool.queue(processFile));
216 }
217
218 // wait for the results
219 for (auto &f : results)
220 {
221 offset++;
222 msg("Generating Mermaid file {}/{}\n", offset, total);
223 f.get();
224 }
225 }
226 else // single threaded version
227 {
228 for (const auto &cmd : mermaidCmds)
229 {
230 offset++;
231 msg("Generating Mermaid file {}/{}\n", offset, total);
232 Debug::print(Debug::Mermaid, 0, "*** MermaidManager::run Running: {} {}\n", cmd.mmdc, cmd.args);
233
234 int exitCode = Portable::system(cmd.mmdc.data(), cmd.args.data(), TRUE);
235 if (exitCode != 0)
236 {
237 err_full(cmd.srcFile, cmd.srcLine,
238 "Problems running Mermaid (mmdc). Verify that the command '{} {}' works from the command line. Exit code: {}.",
239 cmd.mmdc, cmd.args, exitCode);
240 }
241 }
242 }
243}
@ Mermaid
Definition debug.h:51
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:77
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
static QCString imageExtension(ImageFormat imageFormat)
Definition mermaid.cpp:43
This is an alternative implementation of QCString.
Definition qcstring.h:101
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
const std::string & str() const
Definition qcstring.h:552
Class managing a pool of worker threads.
Definition threadpool.h:48
#define Config_getInt(name)
Definition config.h:34
#define Config_getString(name)
Definition config.h:32
#define msg(fmt,...)
Definition message.h:94
#define err_full(file, line, fmt,...)
Definition message.h:132
int system(const QCString &command, const QCString &args, bool commandHasConsole=true)
Definition portable.cpp:105
#define TRUE
Definition qcstring.h:37
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1494

References QCString::at(), Config_getInt, Config_getString, err_full, FileInfo::exists(), fileToString(), MermaidManager::imageExtension(), QCString::isEmpty(), QCString::length(), Debug::Mermaid, msg, Debug::print(), ThreadPool::queue(), QCString::str(), Portable::system(), and TRUE.

Referenced by MermaidManager::run().

Variable Documentation

◆ g_mermaidIndex

int g_mermaidIndex = 1
static

Definition at line 31 of file mermaid.cpp.

Referenced by MermaidManager::writeMermaidSource().

◆ g_mermaidMutex

std::mutex g_mermaidMutex
static

Definition at line 30 of file mermaid.cpp.

Referenced by MermaidManager::writeMermaidSource().