%D \module
%D   [       file=m-tikz,
%D        version=2021.07.12,
%D          title=\CONTEXT\ Extra Modules,
%D       subtitle=TIKZ support,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D A fixed variant of the t-tikz module distributed with tikz. For practical reasons
%D per 2021 we split the module for \MKIV\ and \LMTX. (Maybe some day I'll optimize
%D TIKZ a bit.)
%D
%D All these t-* modules in the tikz distribution make no sense as we can just load
%D them here which is way cleaner. There is also some mkii filename mapping going on
%D that is not needed on todays systems (windows has no 8.3 limitation and on unix
%D tds finally adopted a case insensitive approach.)

%D Just in case someone does a hard input ...

\ifdefined\pgfdefined    \endinput \fi
\ifdefined\pgfcoredefined\endinput \fi

%D ... but normally we end up here:

\startmodule[tikz]

\ifdefined\hoffset \else
    \newdimen\hoffset
    \newdimen\voffset
\fi

\ifdefined\pdflastxpos \else
    \unprotect
        \unexpanded\def\pdflastxpos{\numexpr\clf_lastxpos\relax}
        \unexpanded\def\pdflastypos{\numexpr\clf_lastypos\relax}
    \protect
\fi

\ifdefined\pdfstrcmp\else

    \startluacode
        interfaces.implement {
            name      = "pdfstrcmp",
            arguments = "2 strings",
            public    = true,
            actions   = function(a,b)
                context((a < b and -1) or (a > b and 1) or 0)
            end
        }
    \stopluacode

\fi

\permanent\protected\def\starttikzinput
  {\pushcatcodetable
   \setcatcodetable\texcatcodes
   \catcode`\@=11\relax
   \catcode`\|=12\relax
   \catcode`\!=12\relax
   \catcode`\~=13\relax
   \relax}

\permanent\protected\def\stoptikzinput
  {\relax
   \popcatcodetable}

\permanent\protected\def\tikzinputfile#1%
  {\starttikzinput
   \input{#1}\relax
   \stoptikzinput}

\permanent\protected\def\tikzerrormessage#1#2#3%
  {\writestatus{#1}{#2}}

% For now we need this but we need to educate the user to wrap settings in the
% wrappers. So some day the next line will go. I need to check what commands are
% possible outside a picture.

\protected\def\starttikzsettings
  {}

\protected\def\stoptikzsettings
  {}

\protected\def\starttikzpicture
  {\dontleavehmode
   \hbox\bgroup
   \ifdefined\PackageError\else \let\PackageError\tikzerrormessage \fi
   \tikzpicture}

\permanent\protected\def\stoptikzpicture
  {\endtikzpicture
   \egroup}

\let\pgfdefined    \relax
\let\pgfcoredefined\relax

\tikzinputfile{pgfutil-common.tex}
\tikzinputfile{pgfutil-context.def}
\tikzinputfile{pgfrcs.code.tex}
\tikzinputfile{pgfsys.code.tex}
\tikzinputfile{pgfkeys.code.tex}
\tikzinputfile{pgfsyssoftpath.code.tex}
\tikzinputfile{pgfsysprotocol.code.tex}
\tikzinputfile{pgfcore.code.tex}
\tikzinputfile{pgffor.code.tex}
\tikzinputfile{pgfmoduleplot.code.tex}
\tikzinputfile{tikz.code.tex}

\let\startpgfpicture             \pgfpicture              \let\stoppgfpicture            \endpgfpicture
\let\startpgfscope               \pgfscope                \let\stoppgfscope              \endpgfscope
\let\startpgflowlevelscope       \pgflowlevelscope        \let\stoppgflowlevelscope      \endpgflowlevelscope
\let\startpgfinterruptpath       \pgfinterruptpath        \let\stoppgfinterruptpath      \endpgfinterruptpath
\let\startpgfinterruptpicture    \pgfinterruptpicture     \let\stoppgfinterruptpicture   \endpgfinterruptpicture
\let\startpgfinterruptboundingbox\pgfinterruptboundinbox  \let\stoppgfinterruptboudingbox\endpgfinterruptboundingbox

\let\normalusepgfmodule \usepgfmodule
\let\normalusepgflibrary\usepgflibrary

\unexpanded\def\usepgfmodule {\doifelsenextoptional\dousepgfmoduleyes \dousepgfmodulenop }
\unexpanded\def\usepgflibrary{\doifelsenextoptional\dousepgflibraryyes\dousepgflibrarynop}

\def\dousepgfmodulenop #1{\dousepgfmoduleyes [#1]}
\def\dousepgflibrarynop#1{\dousepgflibraryyes[#1]}

\def\dousepgfmoduleyes[#1]%
  {\starttikzinput
   \normalusepgfmodule[#1]%
   \stoptikzinput}

\def\dousepgflibraryyes[#1]%
  {\starttikzinput
   \normalusepgflibrary[#1]%
   \stoptikzinput}

\usepgfmodule[shapes]
\usepgfmodule[plot]
\usepgfmodule[matrix]
\usepgfmodule[decorations]

\stopmodule
