% Copyright 2018 by Mark Wibrow
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.

\usepgflibrary{lindenmayersystems}%

\def\tikz@@lsystem-system{%
    \pgfutil@ifnextchar[{\tikz@lsystem@options}{\tikz@lsystem@options[]}}%

\def\tikz@lsystem indenmayer system{%
    \pgfutil@ifnextchar[{\tikz@lsystem@options}{\tikz@lsystem@options[]}}%

\def\tikz@lsystem@options[#1]{%
    \tikzset{#1}%
    \ifx\tikz@lsystem@rules\pgfutil@empty%
    \else%
        \tikz@lsystem@declare%
        \def\tikz@lsystem@name{tikz@temp}%
    \fi%
    \ifx\tikz@lsystem@anchor\pgfutil@empty%
        \pgfpathmoveto{\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}%
        \pgflindenmayersystem{\tikz@lsystem@name}{\tikz@lsystem@axiom}{\tikz@lsystem@order}%
    \else%
        \pgfextract@process\tikz@lsystem@pos{\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}%
        \setbox\pgfnodeparttextbox=\hbox{%
            \pgfinterruptpicture%
            \pgfpicture%
                \pgfpathmoveto{\pgfpointorigin}%
                \pgflindenmayersystem{\tikz@lsystem@name}{\tikz@lsystem@axiom}{\tikz@lsystem@order}%
                \begingroup%
                    \tikz@finish%
            \endpgfpicture%
            \endpgfinterruptpicture%
        }%
        {%
            \pgftransformshift{\tikz@lsystem@pos}%
            \tikzset{inner sep=0pt, outer sep=0pt, minimum size=0pt}%
            \pgfmultipartnode{rectangle}{\tikz@lsystem@anchor}{lindenmayer system}{\pgfusepath{discard}}%
        }%
    \fi%
    \tikz@scan@next@command}%

\tikzset{%
    lindenmayer system/.style={/pgf/lindenmayer system/.cd, #1,/tikz/.cd},
    l-system/.style={lindenmayer system={#1}},
}%
\pgfkeys{/pgf/lindenmayer system/.cd,
    name/.code=\edef\tikz@lsystem@name{#1}\let\tikz@lsystem@rules=\pgfutil@empty,%
    axiom/.store in=\tikz@lsystem@axiom,%
    order/.store in=\tikz@lsystem@order,
    .unknown/.code={%
        \pgfutil@ifundefined{pgf@lsystem@\pgfkeyscurrentname}{%
            \pgfkeys{/errors/unknown key={/pgf/lindenmayer system/\pgfkeyscurrentname}{#1}}%
            \let\tikz@lsystem@name=\pgfutil@empty%
        }%
        {\edef\tikz@lsystem@name{\pgfkeyscurrentname}}
    },%
    anchor/.store in=\tikz@lsystem@anchor,%
    rule set/.store in=\tikz@lsystem@rules
}%
\let\tikz@lsystem@anchor=\pgfutil@empty%
\let\tikz@lsystem@rules=\pgfutil@empty%

\def\tikz@lsystem@declare{%
    \expandafter\let\csname pgf@lsystem@tikz@temp\endcsname=\relax%
    \pgfdeclarelindenmayersystem{tikz@temp}{%
        \expandafter\tikz@lsystem@parse@rules\tikz@lsystem@rules,\tikz@stop,%
    }%
}%
\def\tikz@lsystem@parse@rules#1,{%
    \ifx#1\tikz@stop%
    \else%
        \rule{#1}%
        \expandafter\tikz@lsystem@parse@rules%
    \fi%
}%
