%% Copyright (C) 2018-2025 Oliver Kopp and contributors
%%
%% SPDX-License-Identifier: LPPL-1.3c+
\NeedsTeXFormat{LaTeX2e}\relax
\ProvidesPackage{plantuml}
  [2025/05/13 v0.6.0
  Embed PlantUML diagrams in latex documents.]

% Required by PlantUML LaTeX output
\RequirePackage{tikz}

% Enable checking for active -shell-escape
% Source: https://tex.stackexchange.com/a/88620/9075
\RequirePackage{pdftexcmds}

% Prepare writing contents of a self-defined environment to a file
% Source: https://tex.stackexchange.com/a/130298/9075
\RequirePackage{fancyvrb}

\RequirePackage{l3keys2e}
\RequirePackage{xparse}

\RequirePackage{ifthen}

\RequirePackage{adjustbox}

\newcounter{PlantUmlFigureNumberSVG}
\def\UMLcountUp{\stepcounter{PlantUmlFigureNumberSVG} \def\PlantUMLJobname{PlantUML\thePlantUmlFigureNumberSVG}}

% Code snippet from Joseph Wright (https://ctan.org/home/josephwright)
% Source: https://tex.stackexchange.com/questions/418670/avoid-quotation-marks-when-using-jobname-or-currfilename
% according to https://tex.stackexchange.com/users/73/joseph-wright, his code on the site is placed in the public domain
\newcommand*{\myjobname}{}
\newcommand*{\setmyjobname}{\expanded{\noexpand\setmyjobnameaux
  \jobname"\jobname"\relax}}
\newcommand*{\setmyjobnameaux}{}
\def\setmyjobnameaux#1"#2"#3\relax{\def\myjobname{#2}}
\setmyjobname

\def\PlantUMLJobname{\myjobname\thePlantUmlFigureNumberSVG}

\ExplSyntaxOn
\keys_define:nn { plantuml } {
  output .choices:nn = {
    {latex, png, svg}
    { \tl_gset:NV \l_plantuml_mode \l_keys_choice_tl }
  },
  output .initial:n = latex
}
\ProcessKeysOptions { plantuml }
\ExplSyntaxOff

%hint from https://tex.stackexchange.com/a/86355/9075
\makeatletter
\def\maxwidth#1{\ifdim\Gin@nat@width>#1 #1\else\Gin@nat@width\fi}
\makeatother

\ExplSyntaxOn
\let\PlantUmlMode\l_plantuml_mode
\ExplSyntaxOff

\newcounter{PlantUmlFigureNumber}

\ifluatex
  \RequirePackage{luacode}
   \directlua{
      local lfs = require("lfs")
      local currentdir = lfs.currentdir():gsub("\\", "/")
      tex.sprint("\\newcommand\\CurrentDirectory{" .. currentdir .. "/}")
    }
\else
  \RequirePackage[usefamily=bash]{pythontex}
  \newcommand{\CurrentDirectory}{}
\fi

\makeatletter
\ifcase\pdf@shellescape
  \message{No shell escape. PlantUML cannot be called. Start pdflatex/lualatex with -shell-escape.}
  \newenvironment{plantuml}{%
    No shell escape. PlantUML cannot be called. Start pdflatex/lualatex with -shell-escape.
  }{}
\or
  \ifluatex
    \directlua{
      local plantUmlJar = os.getenv("PLANTUML_JAR")
      if not plantUmlJar then
        texio.write_nl("Environment variable PLANTUML_JAR not set.")
      end
    }
  \fi
  \NewDocumentEnvironment{plantuml}{}{%
    \VerbatimOut{"\CurrentDirectory\PlantUMLJobname-plantuml.txt"}}
  {%
    \endVerbatimOut
    \ifluatex
      \directlua{
        local jobname=\luastring{\PlantUMLJobname}
        local plantUmlMode=\luastring{\PlantUmlMode}
        require("plantuml.lua")
        convertPlantUmlToTikz(jobname, plantUmlMode)
      }
    \else
      \stepcounter{PlantUmlFigureNumber}
      %TODO: Execute python here
      \typeout{*** plantuml only works with lualatex ***}
    \fi
    \ifthenelse{\equal{\PlantUmlMode}{latex}}{
      \begin{adjustbox}{max width=\linewidth}
        \input{\PlantUMLJobname-plantuml.tex}
      \end{adjustbox}
    }{
      \includegraphics[width=\maxwidth{\textwidth}]{\PlantUMLJobname-plantuml.\PlantUmlMode}
      \UMLcountUp
    }
  }
\or
  \message{Restricted shell escape. PlantUML cannot be called. Start pdflatex/lualatex with -shell-escape.}
  \newenvironment{plantuml}{%
    Restricted shell escape. PlantUML cannot be called. Start pdflatex/lualatex with -shell-escape.
  }{}
\fi
\makeatother
