%% Copyright (C) 2018-2025 Oliver Kopp, https://github.com/koppor
%%
%% SPDX-License-Identifier: LPPL-1.3c+
\NeedsTeXFormat{LaTeX2e}\relax
\ProvidesPackage{plantuml}
  [2024/05/17 v0.5.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}}
% \jobname has an encoding issue if the .tex filename includes a multibyte string.
% One needs to redefine PlantUMLJobname to fix it
\def\PlantUMLJobname{\jobname\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 pyhton 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
