%D \module
%D   [       file=typo-dir,
%D        version=2009.03.27, % code moved from core-spa.mkiv
%D          title=\CONTEXT\ Typesetting Macros,
%D       subtitle=Directions,
%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.

\writestatus{loading}{ConTeXt Typesetting Macros / Directions}

%D At some point we might default to method 'two' but first I need to make it more
%D efficient (and provide some options). I also want to have some basic tracing.

\unprotect

\registerctxluafile{typo-dir}{1.001}
\registerctxluafile{typo-dha}{1.001}
\registerctxluafile{typo-dua}{1.001}
\registerctxluafile{typo-dub}{1.001}
\registerctxluafile{typo-duc}{1.001}

\definesystemattribute[directions][public]

\installcorenamespace{directions}
\installcorenamespace{directionsbidimode}

% plural as we can have a combination but maybe better singular

\installsimplecommandhandler \??directions {directions} \??directions % no \define... yet

\edef\lefttorightmark{\normalUchar"200E} \let\lrm\lefttorightmark
\edef\righttoleftmark{\normalUchar"200F} \let\rlm\righttoleftmark

\unexpanded\def\setdirection[#1]% todo: symbolic names
  {\clf_setdirection#1\relax}

% \unexpanded\def\resetdirection
%   {\clf_setdirection\zerocount}
%
% is in fact:

\unexpanded\def\resetdirection
  {\attribute\directionsattribute\attributeunsetvalue}

\newconstant\directionsbidimode % this one might become pivate

% \setupdirections[bidi=global,method=default]
% \setupdirections[bidi=global,method=one]
% \setupdirections[bidi=global,method=two]
% \setupdirections[bidi=global,method=two,fences=no]

% maybe use chardefs

\def\typo_dir_get_mode
  {\def\currentbidimode{\clf_getbidimode
        scope  {\directionsparameter\c!bidi}%
        method {\directionsparameter\c!method}%
        fences {\directionsparameter\c!fences}%
   }%
   \expandafter\glet\csname\??directionsbidimode\currentbidistamp\endcsname\currentbidimode}

\appendtoks
    \edef\currentbidistamp
      {\directionsparameter\c!bidi
      :\directionsparameter\c!method
      :\directionsparameter\c!fences}%
    \expandafter\let\expandafter\currentbidimode\csname\??directionsbidimode\currentbidistamp\endcsname
    \ifx\currentbidimode\relax
        \typo_dir_get_mode
    \fi
    \directionsbidimode\currentbidimode\relax
    \ifcase\directionsbidimode
        \resetdirection
    \else
        \setdirection[\number\directionsbidimode]%
    \fi
\to \everysetupdirections

% bidi: local=obey grouping, global=ignore grouping (unicode has no grouping)

\setupdirections % maybe start/stop
  [\c!bidi=\v!off,
   \c!method=\v!default,
   \c!fences=\v!yes]

\unexpanded\edef\bidilre{\normalUchar"202A} % maybe \edef's
\unexpanded\edef\bidirle{\normalUchar"202B}
\unexpanded\edef\bidipop{\normalUchar"202C}
\unexpanded\edef\bidilro{\normalUchar"202D}
\unexpanded\edef\bidirlo{\normalUchar"202E}

\unexpanded\def\dirlre{\ifcase\directionsbidimode\or\bidilre\or\textdir TLT\fi}
\unexpanded\def\dirrle{\ifcase\directionsbidimode\or\bidirle\or\textdir TRT\fi}
\unexpanded\def\dirlro{\ifcase\directionsbidimode\or\bidilro\or\setdirection[3]\fi}
\unexpanded\def\dirrlo{\ifcase\directionsbidimode\or\bidirlo\or\setdirection[4]\fi}

% for the moment: \setdirection[\plusone]

\definecolor[bidi:left:original] [r=.6]
\definecolor[bidi:left:reversed] [g=.6]
\definecolor[bidi:right:original][b=.6]
\definecolor[bidi:right:reversed][r=.6,g=.6]
\definecolor[bidi:mirrored]      [r=.6,b=.6]

\protect \endinput

% bidi test

\definefontfeature
  [arab]
  [mode=node,language=dflt,script=arab,
   init=yes,medi=yes,fina=yes,isol=yes,
   liga=yes,dlig=yes,rlig=yes,clig=yes,
   mark=yes,mkmk=yes,kern=yes,curs=yes]

\font\Arabic=arabtype*arab at 20pt

\def\LATIN{LATIN} {\setdirection[1]} % enable this
\def\ARAB {محمد}

\startluacode
    function documentdata.split_tokens(str)
        for s in str:bytes() do
            context.sprint(tex.ctxcatcodes,string.format("\\hbox{\\char %s}",s))
        end
    end
\stopluacode

\def\biditest#1#2#3% font text raw
  {\dontleavehmode\hbox
    {\framed[offset=overlay]{\tttf#2}\quad
     \enabletrackers[typesetters.directions]%
     \framed[offset=overlay]{#1#3}\quad
     \disabletrackers[typesetters.directions]%
     \tttf\ctxlua{documentdata.split_tokens([[\detokenize{#3}]])}}}

\startbuffer[bidi-sample]
\biditest\Arabic{LATIN BARA}{\textdir TLT\relax   \LATIN\ \ARAB}\par
\biditest\Arabic{BARA LATIN}{\textdir TRT\relax   \LATIN\ \ARAB}\par
\biditest\Arabic{LATIN ARAB}{\textdir TLT{\bidilro \LATIN\ \ARAB}}\par % right -> left
\biditest\Arabic{LATIN ARAB}{\textdir TRT{\bidilro \LATIN\ \ARAB}}\par % right -> left
\biditest\Arabic{BARA NITAL}{\textdir TLT{\bidirlo \LATIN\ \ARAB}}\par % left -> right
\biditest\Arabic{BARA NITAL}{\textdir TRT{\bidirlo \LATIN\ \ARAB}}\par % left -> right
\stopbuffer

\startbuffer[bidi-sample]
\biditest\Arabic{LATIN BARA}{\textdir TLT\relax   \LATIN\ \ARAB}\par
\biditest\Arabic{BARA LATIN}{\textdir TRT\relax   \LATIN\ \ARAB}\par
\biditest\Arabic{LATIN ARAB}{\textdir TLT\bidilro \LATIN\ \ARAB}\par % right -> left
\biditest\Arabic{LATIN ARAB}{\textdir TRT\bidilro \LATIN\ \ARAB}\par % right -> left
\biditest\Arabic{BARA NITAL}{\textdir TLT\bidirlo \LATIN\ \ARAB}\par % left -> right
\biditest\Arabic{BARA NITAL}{\textdir TRT\bidirlo \LATIN\ \ARAB}\par % left -> right
\stopbuffer

\startbuffer[bidi-setup]
\setupdirections[bidi=off]
\stopbuffer

{\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]}

\startbuffer[bidi-setup]
\setupdirections[bidi=global]
\stopbuffer

{\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]}

\startbuffer[bidi-setup]
\setupdirections[bidi=local]
\stopbuffer

{\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]}

\startbuffer[bidi-sample]
\setupdirections[bidi=global]

                  \hbox{\righttoleft\arabicfont (0001)}\par
   \dontleavehmode\hbox{\righttoleft\arabicfont (0002)}\par
                       {\righttoleft\arabicfont (0003)\par}
                       {\righttoleft\arabicfont (0004)}\par
        \dontleavehmode{\righttoleft\arabicfont (0005)\par}
        \dontleavehmode{\righttoleft\arabicfont (0006)}\par
               \rtlhbox{\arabicfont (0007)}\par
               \ltrhbox{\arabicfont (0008)}\par
\dontleavehmode\rtlhbox{\arabicfont (0009)}\par
\dontleavehmode\ltrhbox{\arabicfont (0010)}\par
\stopsetups

{\typebuffer[bidi-sample]  \getbuffer[bidi-sample]}

\stoptext
