typo-dir.mkxl /size: 7330 b    last modification: 2024-01-16 09:03
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  {\clf_setdirection#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{\clf_getbidimode % 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