%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\def\bidilre{\utfchar{"0x202A}} % maybe \edef's \unexpanded\def\bidirle{\utfchar{"0x202B}} \unexpanded\def\bidipop{\utfchar{"0x202C}} \unexpanded\def\bidilro{\utfchar{"0x202D}} \unexpanded\def\bidirlo{\utfchar{"0x202E}} \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