Blame src/plantuml.cpp

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