typo-dir.mkiv / last modification: 2020-01-30 14:16
%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}{optimize}
\registerctxluafile{typo-dha}{}
%registerctxluafile{typo-dua}{}
%registerctxluafile{typo-dub}{}
\registerctxluafile{typo-duc}{}

\definesystemattribute[directions][public,pickup]

\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\p_bidi{\directionsparameter\c!bidi}%
    \edef\currentbidistamp
      {\p_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
    \ifx\p_bidi\v!global
        \pickupdirectionsattribute
    \else
        \forgetdirectionsattribute
    \fi
\to \everysetupdirections

\appendtoks
    \edef\p_option{\directionsparameter\c!break}% name can change
    \breakafterdirmode\ifx\p_option\v!both\plusone\else\zerocount\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!break=\v!both, % experimental value, maybe \v!no will be default (bad name too)
   \c!fences=\v!yes]

\unexpanded\edef\bidilre{\normalUchar"202A}
\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\textdirection\directionlefttoright\fi}
\unexpanded\def\dirrle{\ifcase\directionsbidimode\or\bidirle\or\textdirection\directionrighttoleft\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
%
% \unexpanded\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}{\lefttoright\relax   \LATIN\ \ARAB}\par
% \biditest\Arabic{BARA LATIN}{\righttoleft\relax   \LATIN\ \ARAB}\par
% \biditest\Arabic{LATIN ARAB}{\lefttoright{\bidilro \LATIN\ \ARAB}}\par % right -> left
% \biditest\Arabic{LATIN ARAB}{\righttoleft{\bidilro \LATIN\ \ARAB}}\par % right -> left
% \biditest\Arabic{BARA NITAL}{\lefttoright{\bidirlo \LATIN\ \ARAB}}\par % left -> right
% \biditest\Arabic{BARA NITAL}{\righttoleft{\bidirlo \LATIN\ \ARAB}}\par % left -> right
% \stopbuffer
%
% \startbuffer[bidi-sample]
% \biditest\Arabic{LATIN BARA}{\lefttoright\relax   \LATIN\ \ARAB}\par
% \biditest\Arabic{BARA LATIN}{\righttoleft\relax   \LATIN\ \ARAB}\par
% \biditest\Arabic{LATIN ARAB}{\lefttoright\bidilro \LATIN\ \ARAB}\par % right -> left
% \biditest\Arabic{LATIN ARAB}{\righttoleft\bidilro \LATIN\ \ARAB}\par % right -> left
% \biditest\Arabic{BARA NITAL}{\lefttoright\bidirlo \LATIN\ \ARAB}\par % left -> right
% \biditest\Arabic{BARA NITAL}{\righttoleft\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