%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} \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 {\ctxcommand{setdirection(\number#1)}} \unexpanded\def\resetdirection %{\ctxcommand{setdirection(0)}} {\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] \def\typo_dir_get_mode {\def\currentbidimode{\ctxcommand{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