1%D \module 2%D [ file=typo-dir, 3%D version=2009.03.27, % code moved from core-spa.mkiv 4%D title=\CONTEXT\ Typesetting Macros, 5%D subtitle=Directions, 6%D author=Hans Hagen, 7%D date=\currentdate, 8%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] 9%C 10%C This module is part of the \CONTEXT\ macro||package and is 11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 12%C details. 13 14\writestatus{loading}{ConTeXt Typesetting Macros / Directions} 15 16%D At some point we might default to method 'two' but first I need to make it more 17%D efficient (and provide some options). I also want to have some basic tracing. 18 19\unprotect 20 21\registerctxluafile{typo-dir}{autosuffix} 22\registerctxluafile{typo-dha}{autosuffix} 23\registerctxluafile{typo-duc}{autosuffix} 24 25\definesystemattribute[directions][public,pickup] 26 27\installcorenamespace{directions} 28\installcorenamespace{directionsbidimode} 29 30% plural as we can have a combination but maybe better singular 31 32\installsimplecommandhandler \??directions {directions} \??directions % no \define... yet 33 34\immutable\edef\lefttorightmark{\tocharacter"200E} \aliased\let\lrm\lefttorightmark % expandable 35\immutable\edef\righttoleftmark{\tocharacter"200F} \aliased\let\rlm\righttoleftmark % expandable 36 37\permanent\protected\def\setdirection[#1]% todo: symbolic names 38 {#1\relax} 39 40\permanent\protected\def\resetdirection 41 {\c_attr_directions\attributeunsetvalue} 42 43\newconstant\directionsbidimode % this one might become pivate 44 45% \setupdirections[bidi=global,method=default] 46% \setupdirections[bidi=global,method=one] 47% \setupdirections[bidi=global,method=two] 48% \setupdirections[bidi=global,method=two,fences=no] 49 50% maybe use chardefs 51 52\mutable\lettonothing\currentbidimode 53\mutable\lettonothing\currentbidistamp 54 55\def\typo_dir_get_mode 56 {\def\currentbidimode{ % test edef 57 scope {\directionsparameter\c!bidi}% 58 method {\directionsparameter\c!method}% 59 fences {\directionsparameter\c!fences}% 60 }% 61 \gletcsname\??directionsbidimode\currentbidistamp\endcsname\currentbidimode} 62 63\appendtoks 64 \edef\p_bidi{\directionsparameter\c!bidi}% 65 \edef\currentbidistamp 66 {\p_bidi 67 :\directionsparameter\c!method 68 :\directionsparameter\c!fences}% 69 \expandafter\let\expandafter\currentbidimode\csname\??directionsbidimode\currentbidistamp\endcsname 70 \ifrelax\currentbidimode 71 \typo_dir_get_mode 72 \fi 73 \directionsbidimode\currentbidimode\relax 74 \ifcase\directionsbidimode 75 \resetdirection 76 \else 77 \setdirection[\number\directionsbidimode]% 78 \fi 79 \ifx\p_bidi\v!global 80 \pickupdirectionsattribute % pagebuilder 81 \else 82 \forgetdirectionsattribute 83 \fi 84\to \everysetupdirections 85 86\appendtoks 87 \edef\p_option{\directionsparameter\c!break}% name can change 88 \bitwiseflip\normalizelinemode\ifx\p_option\v!both\else-\fi\breakafterdirnormalizecode 89\to \everysetupdirections 90 91% bidi: local=obey grouping, global=ignore grouping (unicode has no grouping) 92 93\setupdirections % maybe start/stop 94 [\c!bidi=\v!off, 95 \c!method=\v!default, 96 \c!break=\v!both, % experimental value, maybe \v!no will be default (bad name too) 97 \c!fences=\v!yes] 98 99\permanent\protected\edef\bidilre{\tocharacter"202A} 100\permanent\protected\edef\bidirle{\tocharacter"202B} 101\permanent\protected\edef\bidipop{\tocharacter"202C} 102\permanent\protected\edef\bidilro{\tocharacter"202D} 103\permanent\protected\edef\bidirlo{\tocharacter"202E} 104 105\permanent\protected\def\dirlre{\ifcase\directionsbidimode\or\bidilre\or\textdirection\directionlefttoright\fi} 106\permanent\protected\def\dirrle{\ifcase\directionsbidimode\or\bidirle\or\textdirection\directionrighttoleft\fi} 107\permanent\protected\def\dirlro{\ifcase\directionsbidimode\or\bidilro\or\setdirection[3]\fi} 108\permanent\protected\def\dirrlo{\ifcase\directionsbidimode\or\bidirlo\or\setdirection[4]\fi} 109 110% for the moment: \setdirection[\plusone] 111 112\definecolor[bidi:left:original] [r=.6] 113\definecolor[bidi:left:reversed] [g=.6] 114\definecolor[bidi:right:original][b=.6] 115\definecolor[bidi:right:reversed][r=.6,g=.6] 116\definecolor[bidi:mirrored] [r=.6,b=.6] 117 118\protect \endinput 119 120% bidi test 121 122% \definefontfeature 123% [arab] 124% [mode=node,language=dflt,script=arab, 125% init=yes,medi=yes,fina=yes,isol=yes, 126% liga=yes,dlig=yes,rlig=yes,clig=yes, 127% mark=yes,mkmk=yes,kern=yes,curs=yes] 128% 129% \font\Arabic=arabtype*arab at 20pt 130% 131% \def\LATIN{LATIN} {\setdirection[1]} % enable this 132% \def\ARAB {عربي} 133% 134% \startluacode 135% function documentdata.split_tokens(str) 136% for s in str:bytes() do 137% context.sprint(tex.ctxcatcodes,string.format("\\hbox{\\char %s}",s)) 138% end 139% end 140% \stopluacode 141% 142% \protected\def\biditest#1#2#3% font text raw 143% {\dontleavehmode\hbox 144% {\framed[offset=overlay]{\tttf#2}\quad 145% \enabletrackers[typesetters.directions]% 146% \framed[offset=overlay]{#1#3}\quad 147% \disabletrackers[typesetters.directions]% 148% \tttf\ctxlua{documentdata.split_tokens([[\detokenize{#3}]])}}} 149% 150% \startbuffer[bidi-sample] 151% \biditest\Arabic{LATIN BARA}{\lefttoright\relax \LATIN\ \ARAB}\par 152% \biditest\Arabic{BARA LATIN}{\righttoleft\relax \LATIN\ \ARAB}\par 153% \biditest\Arabic{LATIN ARAB}{\lefttoright{\bidilro \LATIN\ \ARAB}}\par % right -> left 154% \biditest\Arabic{LATIN ARAB}{\righttoleft{\bidilro \LATIN\ \ARAB}}\par % right -> left 155% \biditest\Arabic{BARA NITAL}{\lefttoright{\bidirlo \LATIN\ \ARAB}}\par % left -> right 156% \biditest\Arabic{BARA NITAL}{\righttoleft{\bidirlo \LATIN\ \ARAB}}\par % left -> right 157% \stopbuffer 158% 159% \startbuffer[bidi-sample] 160% \biditest\Arabic{LATIN BARA}{\lefttoright\relax \LATIN\ \ARAB}\par 161% \biditest\Arabic{BARA LATIN}{\righttoleft\relax \LATIN\ \ARAB}\par 162% \biditest\Arabic{LATIN ARAB}{\lefttoright\bidilro \LATIN\ \ARAB}\par % right -> left 163% \biditest\Arabic{LATIN ARAB}{\righttoleft\bidilro \LATIN\ \ARAB}\par % right -> left 164% \biditest\Arabic{BARA NITAL}{\lefttoright\bidirlo \LATIN\ \ARAB}\par % left -> right 165% \biditest\Arabic{BARA NITAL}{\righttoleft\bidirlo \LATIN\ \ARAB}\par % left -> right 166% \stopbuffer 167% 168% \startbuffer[bidi-setup] 169% \setupdirections[bidi=off] 170% \stopbuffer 171% 172% {\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]} 173% 174% \startbuffer[bidi-setup] 175% \setupdirections[bidi=global] 176% \stopbuffer 177% 178% {\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]} 179% 180% \startbuffer[bidi-setup] 181% \setupdirections[bidi=local] 182% \stopbuffer 183% 184% {\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]} 185% 186% \startbuffer[bidi-sample] 187% \setupdirections[bidi=global] 188% 189% \hbox{\righttoleft\arabicfont (0001)}\par 190% \dontleavehmode\hbox{\righttoleft\arabicfont (0002)}\par 191% {\righttoleft\arabicfont (0003)\par} 192% {\righttoleft\arabicfont (0004)}\par 193% \dontleavehmode{\righttoleft\arabicfont (0005)\par} 194% \dontleavehmode{\righttoleft\arabicfont (0006)}\par 195% \rtlhbox{\arabicfont (0007)}\par 196% \ltrhbox{\arabicfont (0008)}\par 197% \dontleavehmode\rtlhbox{\arabicfont (0009)}\par 198% \dontleavehmode\ltrhbox{\arabicfont (0010)}\par 199% \stopsetups 200% 201% {\typebuffer[bidi-sample] \getbuffer[bidi-sample]} 202% 203% \stoptext 204 |