%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}

\unprotect

\registerctxluafile{typo-dir}{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

\unexpanded\def\setdirection[#1]% todo: symbolic names
   {\ctxcommand{setdirection(\number#1)}}

\unexpanded\def\resetdirection
 %{\ctxcommand{setdirection(0)}}
  {\attribute\directionsattribute\attributeunsetvalue}

\newconstant\directionsbidimode % this one might become pivate

\letvalue{\??directionsbidimode\v!off   }\zerocount
\letvalue{\??directionsbidimode\v!global}\plusone
\letvalue{\??directionsbidimode\v!local }\plustwo
\letvalue{\??directionsbidimode\v!on    }\plustwo

\appendtoks
    \directionsbidimode
      \ifcsname\??directionsbidimode\directionsparameter\c!bidi\endcsname
        \csname\??directionsbidimode\directionsparameter\c!bidi\endcsname
      \else
        \zerocount
      \fi
    \relax
    \ifcase\directionsbidimode
      \resetdirection
    \or % 1
      \setdirection[1]% global, chars
    \or % 2
      \setdirection[2]% local, attributes
    \or % else
      \setdirection[1]% default
    \fi
\to \everysetupdirections

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

\setupdirections % maybe start/stop
  [\c!bidi=\v!off]

\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]

\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]}

\stoptext
