|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "plantuml.h"
|
|
Packit |
1c1d7e |
#include "portable.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "index.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qdir.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static const int maxCmdLine = 40960;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString writePlantUMLSource(const QCString &outDir,const QCString &fileName,const QCString &content)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString baseName(4096);
|
|
Packit |
1c1d7e |
static int umlindex=1;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (fileName.isEmpty()) // generate name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName = outDir+"/inline_umlgraph_"+QCString().setNum(umlindex++);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // user specified name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName = fileName;
|
|
Packit |
1c1d7e |
int i=baseName.findRev('.');
|
|
Packit |
1c1d7e |
if (i!=-1) baseName = baseName.left(i);
|
|
Packit |
1c1d7e |
baseName.prepend(outDir+"/");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QFile file(baseName+".pu");
|
|
Packit |
1c1d7e |
if (!file.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Could not open file %s for writing\n",baseName.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString text = "@startuml\n";
|
|
Packit |
1c1d7e |
text+=content;
|
|
Packit |
1c1d7e |
text+="@enduml\n";
|
|
Packit |
1c1d7e |
file.writeBlock( text, text.length() );
|
|
Packit |
1c1d7e |
file.close();
|
|
Packit |
1c1d7e |
return baseName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void generatePlantUMLOutput(const char *baseName,const char *outDir,PlantUMLOutputFormat format)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static QCString plantumlJarPath = Config_getString(PLANTUML_JAR_PATH);
|
|
Packit |
1c1d7e |
static QCString plantumlConfigFile = Config_getString(PLANTUML_CFG_FILE);
|
|
Packit |
1c1d7e |
static QCString dotPath = Config_getString(DOT_PATH);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString pumlExe = "java";
|
|
Packit |
1c1d7e |
QCString pumlArgs = "";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QStrList &pumlIncludePathList = Config_getList(PLANTUML_INCLUDE_PATH);
|
|
Packit |
1c1d7e |
char *s=pumlIncludePathList.first();
|
|
Packit |
1c1d7e |
if (s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pumlArgs += "-Dplantuml.include.path=\"";
|
|
Packit |
1c1d7e |
pumlArgs += s;
|
|
Packit |
1c1d7e |
s = pumlIncludePathList.next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
while (s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pumlArgs += portable_pathListSeparator();
|
|
Packit |
1c1d7e |
pumlArgs += s;
|
|
Packit |
1c1d7e |
s = pumlIncludePathList.next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (pumlIncludePathList.first()) pumlArgs += "\" ";
|
|
Packit |
1c1d7e |
pumlArgs += "-Djava.awt.headless=true -jar \""+plantumlJarPath+"plantuml.jar\" ";
|
|
Packit |
1c1d7e |
if (!plantumlConfigFile.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pumlArgs += "-config \"";
|
|
Packit |
1c1d7e |
pumlArgs += plantumlConfigFile;
|
|
Packit |
1c1d7e |
pumlArgs += "\" ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (Config_getBool(HAVE_DOT) && !dotPath.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pumlArgs += "-graphvizdot \"";
|
|
Packit |
1c1d7e |
pumlArgs += dotPath;
|
|
Packit |
1c1d7e |
pumlArgs += "dot\" ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
pumlArgs+="-o \"";
|
|
Packit |
1c1d7e |
pumlArgs+=outDir;
|
|
Packit |
1c1d7e |
pumlArgs+="\" ";
|
|
Packit |
1c1d7e |
QCString imgName = baseName;
|
|
Packit |
1c1d7e |
// The basename contains path, we need to strip the path from the filename in order
|
|
Packit |
1c1d7e |
// to create the image file name which should be included in the index.qhp (Qt help index file).
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if ((i=imgName.findRev('/'))!=-1) // strip path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
imgName=imgName.right(imgName.length()-i-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (format)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case PUML_BITMAP:
|
|
Packit |
1c1d7e |
pumlArgs+="-tpng";
|
|
Packit |
1c1d7e |
imgName+=".png";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PUML_EPS:
|
|
Packit |
1c1d7e |
pumlArgs+="-teps";
|
|
Packit |
1c1d7e |
imgName+=".eps";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PUML_SVG:
|
|
Packit |
1c1d7e |
pumlArgs+="-tsvg";
|
|
Packit |
1c1d7e |
imgName+=".svg";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
pumlArgs+=" \"";
|
|
Packit |
1c1d7e |
pumlArgs+=baseName;
|
|
Packit |
1c1d7e |
pumlArgs+=".pu\" ";
|
|
Packit |
1c1d7e |
pumlArgs+="-charset UTF-8 ";
|
|
Packit |
1c1d7e |
int exitCode;
|
|
Packit |
1c1d7e |
//printf("*** running: %s %s outDir:%s %s\n",pumlExe.data(),pumlArgs.data(),outDir,baseName);
|
|
Packit |
1c1d7e |
msg("Running PlantUML on generated file %s.pu\n",baseName);
|
|
Packit |
1c1d7e |
portable_sysTimerStart();
|
|
Packit |
1c1d7e |
if ((exitCode=portable_system(pumlExe,pumlArgs,TRUE))!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Problems running PlantUML. Verify that the command 'java -jar \"%splantuml.jar\" -h' works from the command line. Exit code: %d\n",
|
|
Packit |
1c1d7e |
plantumlJarPath.data(),exitCode);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (Config_getBool(DOT_CLEANUP))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QFile(QCString(baseName)+".pu").remove();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
if ( (format==PUML_EPS) && (Config_getBool(USE_PDFLATEX)) )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString epstopdfArgs(maxCmdLine);
|
|
Packit |
1c1d7e |
epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",baseName,baseName);
|
|
Packit |
1c1d7e |
portable_sysTimerStart();
|
|
Packit |
1c1d7e |
if ((exitCode=portable_system("epstopdf",epstopdfArgs))!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Problems running epstopdf. Check your TeX installation! Exit code: %d\n",exitCode);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
portable_sysTimerStop();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
Doxygen::indexList->addImageFile(imgName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|