%%%
% PatternJeton
%%%
\def\filedatePatternJeton{2025/05/28}%
\def\fileversionPatternJeton{0.1a}%
\message{-- \filedatePatternJeton\space v\fileversionPatternJeton}%
%
\newtoks\tokassonom%
\newtoks\tokassocol%
\newtoks\tokassodes%
\newtoks\tokassocomp%
\def\UpdatetoksAsso#1/#2\nil{\addtotok\tokassonom{#1,}\addtotok\tokassocomp{"#1",}\addtotok\tokassocol{#2,}}%
\def\UpdatetoksAssoFinal#1/#2\nil{\addtotok\tokassonom{#1}\addtotok\tokassocomp{"#1",}\addtotok\tokassocol{#2}}%
\def\UpdatetoksAssoDes#1\nil{\addtotok\tokassodes{"#1",}}%

\setKVdefault[PatternJeton]{Association={B/Blanc},Unite=1cm,Label,Pointilles=false,Codes=false,Traces={}}
\defKV[PatternJeton]{Traces=\ifempty{#1}{}{\setKV[PatternJeton]{Codes}}}%

\NewDocumentCommand\PatternJeton{om}{%
  \tokassonom{}%
  \tokassocol{}%
  \tokassodes{}%
  \tokassocomp{}%
  \useKVdefault[PatternJeton]%
  \setKV[PatternJeton]{#1}%
  \xdef\PfMListeAssoAv{\useKV[PatternJeton]{Association}}%
  \setsepchar[*]{,*/}\ignoreemptyitems%
  \readlist*\ListeAsso{\PfMListeAssoAv}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\ListePatternJeton{#2}%
  \reademptyitems%
  \foreachitem\PfMAsso\in\ListeAsso{%
    \ifnum\PfMAssocnt=\ListeAssolen\relax
      \expandafter\UpdatetoksAssoFinal\PfMAsso\nil
    \else%
      \expandafter\UpdatetoksAsso\PfMAsso\nil
    \fi%
  }%
  \foreachitem\PfMAsso\in\ListePatternJeton{%
    \expandafter\UpdatetoksAssoDes\PfMAsso\nil
  }%
  \BuildPatternCarre{\the\tokassonom}{\the\tokassocol}{\the\tokassodes}{\the\tokassocomp}%
}%

\NewDocumentCommand\BuildPatternCarre{mmmm}{%
    \mplibforcehmode
    \begin{mplibcode}
      u:=\useKV[PatternJeton]{Unite};
      path Base,Basea,Baseb;
      Base=unitsquare scaled 0.9u;
      Basea=(0,0)--(u*(0.9,0))--(u*(0.45,0.9))--cycle;
      Baseb=(fullcircle scaled 0.9u) shifted(u*(0.45,0.45));
      
      color ListeCouleurs[];
      boolean LABEL,PTLES,Codes;
      
      LABEL=\useKV[PatternJeton]{Label};
      PTLES=\useKV[PatternJeton]{Pointilles};
      Codes=\useKV[PatternJeton]{Codes};

      if Codes:
      \useKV[PatternJeton]{Traces};
      fi;
      
      vardef NombreLignes(text t)=
        nblignes:=0;
        for p_=t:
          nblignes:=nblignes+1;
        endfor;
      enddef;

      vardef AssocieLesCouleurs(text t)=
        color t;
        retiens:=0;
        for p_=t:
          retiens:=retiens+1;
          p_=ListeCouleurs[retiens];
        endfor;
      enddef;

      vardef RecupereLesCouleurs(text t)=
        nbcol=0;
        for p_=t:
          if color p_:
            nbcol:=nbcol+1;
            ListeCouleurs[nbcol]=p_;
          fi;
        endfor;
      enddef;

      NombreLignes(#3);
      RecupereLesCouleurs(#2);
      AssocieLesCouleurs(#1);

      Lignes:=nblignes;

      path Pattern;
      
      vardef Affichage(text t)=
        nbl:=0;
        for p_=t:
          for k=0 upto (length p_)-1:
            if substring(k,k+1)of p_<>"X":
              if substring(k,k+1) of p_="Y":
                Pattern:=Basea;
              elseif substring(k,k+1) of p_="Z":
                Pattern:=Baseb;
              else:
                Pattern:=Base;
              fi;
              Test(substring(k,k+1) of p_);
              fill Pattern shifted (u*(k+0.05,nbl-0.05)) withcolor 0.8white;
              fill Pattern shifted (u*(k,nbl)) withcolor Coul;
              trace Pattern shifted (u*(k,nbl));
              if LABEL:
                if Coul=(0,0,0):
                  drawoptions(withcolor white);
                fi;
                label(substring(k,k+1) of p_,(center Pattern) shifted (u*(k,nbl)));
                if Coul=(0,0,0):
                  drawoptions();
                fi;
              fi;
            else:
              if PTLES:
                trace Base shifted (u*(k,nbl)) dashed evenly;
              fi;
            fi;
          endfor;
          nbl:=nbl-1;
        endfor;
      enddef;

      color Coul;
      boolean STOP;
   
      vardef Test(expr tt)=
        nbretiens:=0;
        STOP:=false;
        forever: exitif STOP;
          for pp_=#4:
            if pp_=tt:
              Coul:=scantokens pp_;
              STOP:=true;
            fi;
          endfor;
        endfor;
      enddef;

      Affichage(#3);
    \end{mplibcode}%
}%