strc-blk.mkxl /size: 6036 b    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=strc-blk,
3%D        version=2008.10.20,
4%D          title=\CONTEXT\ Structure Macros,
5%D       subtitle=Blockmoves,
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 Structure Macros / Blockmoves}
15
16\registerctxluafile{strc-blk}{}
17
18\unprotect
19
20% we run on top of buffers and sections
21%
22% todo: prefix numbers (needs further integration elsewhere)
23%       check functionality
24%       alternative files (needs further integration elsewhere)
25%
26% order matters: \c!before (think of: \c!before=\startitemize)
27%
28% no \endgroups
29
30\installcorenamespace {block}
31\installcorenamespace {blocktemp}
32
33\installcommandhandler \??block {block} \??block
34
35\appendtoks
36    \clf_definestructureblock{\currentblock}%
37    \frozen\protected\edefcsname\e!begin\currentblock\endcsname{\strc_blocks_begin{\currentblock}}%
38    \frozen          \letcsname \e!end  \currentblock\endcsname\donothing
39\to \everydefineblock
40
41% We need to prevent too much lookahead which will gobble newlines that are needed
42% for buffers. See blocks-002.tex as example.
43
44% maybe: systemmode "block:<name>"
45
46\lettonothing\m_block
47\lettonothing\m_subblock
48
49\protected\def\strc_blocks_begin#1%
50  {\edef\m_block{#1}%
51   \lettonothing\m_subblock
52   \doifelsenextoptionalcs\strc_blocks_begin_yes\strc_blocks_begin_nop}
53
54\protected\def\strc_blocks_begin_yes[#S#1]%
55  {\doifelseassignmentcs{#1}%
56     \strc_blocks_begin_indeed
57     \strc_blocks_begin_tagged
58     {#1}}
59
60\protected\def\strc_blocks_begin_tagged#1%
61  {\edef\m_subblock{#1}%
62   \doifelsenextoptionalcs\strc_blocks_begin_yes_yes\strc_blocks_begin_nop}
63
64\protected\def\strc_blocks_begin_yes_yes[#S#1]%
65  {\strc_blocks_begin_indeed{#1}}
66
67\protected\def\strc_blocks_begin_nop
68  {\strc_blocks_begin_indeed{}}
69
70\protected\def\strc_blocks_begin_indeed#1%
71  {\normalexpanded{\buff_pickup{\??block}{\e!begin\m_block}{\e!end\m_block}}%
72     {}%
73     {\clf_savestructureblock{\m_block}{\m_subblock}{#1}{\??block}}%
74     \plusone}
75
76% \tolerant\protected\def\strc_blocks_begin#1#*[#2]#*[#3]% #:#/% get rid of spaces and pars
77%   {\edef\m_block{#1}%
78%    \lettonothing\m_subblock
79%    \ifhastok={#2}%
80%      \expandafter\strc_blocks_begin_a % [settings]
81%    \orelse\ifparameter#2\or
82%      \expandafter\strc_blocks_begin_b % [tag] [settings]
83%    \else
84%      \expandafter\strc_blocks_begin_c %
85%    \fi{#2}{#3}}% #4}
86%
87% \protected\def\strc_blocks_begin_a#1#2% settings dummy
88%   {\normalexpanded{\buff_pickup{\??block}{\e!begin\m_block}{\e!end\m_block}}%
89%      {}%
90%      {\clf_savestructureblock{\m_block}{\m_subblock}{#1}{\??block}}%
91%      \plusone}
92%
93% \protected\def\strc_blocks_begin_b#1#2% tag settings
94%   {\edef\m_subblock{#1}%
95%    \strc_blocks_begin_a{#2}{}}
96%
97% \protected\def\strc_blocks_begin_c#1#2%
98%   {\strc_blocks_begin_a{}{}}
99
100\let\strc_blocks_setup\relax
101
102\newconstant   \c_strc_blocks_index
103\newconditional\c_strc_blocks_display
104
105\permanent\protected\def\dostarthiddenblock % called at lua end
106  {\begingroup
107   \visiblefalse % blocks float
108   \startnointerference
109   \strc_start_block}
110
111\permanent\protected\def\dostophiddenblock % called at lua end
112  {\strc_stop_block
113   \stopnointerference
114   \endgroup}
115
116\permanent\protected\def\dostartnormalblock % called at lua end
117  {\begingroup
118   \visibletrue
119   \strc_start_block}
120
121\permanent\protected\def\dostopnormalblock % called at lua end
122  {\strc_stop_block
123   \endgroup}
124
125\def\strc_start_block#1#2%
126  {\cdef\currentblock{#2}%
127   \c_strc_blocks_index#1\relax
128   \strc_blocks_setup
129   \let\strc_blocks_setup\relax
130   \edef\p_alternative{\blockparameter\c!alternative}%
131   \ifx\p_alternative\v!text
132      \c_strc_blocks_display\conditionalfalse
133   \else
134      \c_strc_blocks_display\conditionaltrue
135   \fi
136   \ifconditional\c_strc_blocks_display
137      \blockparameter\c!before
138   \fi
139   \begingroup
140   \usesetupsparameter\blockparameter\relax
141   \dostarttagged\t!block\currentblock
142   \useblockstyleandcolor\c!style\c!color
143   \blockparameter\c!inner % old
144   \ifconditional\c_strc_blocks_display
145     \usealignparameter\blockparameter
146   \else
147     \blockparameter\c!left
148   \fi
149   \ignorespaces}
150
151\def\strc_stop_block
152  {\removeunwantedspaces
153   \ifconditional\c_strc_blocks_display
154     \par
155   \else
156     \blockparameter\c!right
157   \fi
158   \dostoptagged
159   \endgroup
160   \ifconditional\c_strc_blocks_display
161     \blockparameter\c!after
162   \fi}
163
164\tolerant\def\strc_blocks_set_state[#1]#*[#2]#*[#3]% state name tag % todo: we could use the lua one directly
165  {\clf_setstructureblockstate{#1}{#2}{#3}}
166
167\tolerant\def\strc_blocks_select[#1]#*[#2]#*[#S#3]#*[#S#4]% state name tag setups
168  {\begingroup
169   \ifhastok={#3}%
170     \getparameters[\??blocktemp][\c!criterium=\v!text,#3]%
171     \def\strc_blocks_setup{\setupcurrentblock[#3]}%
172     \clf_selectstructureblock{#1}{#2}{}{\begincsname\??blocktemp\c!criterium\endcsname}%
173   \else
174     \getparameters[\??blocktemp][\c!criterium=\v!text,#4]%
175     \def\strc_blocks_setup{\setupcurrentblock[#4]}%
176     \clf_selectstructureblock{#1}{#2}{#3}{\begincsname\??blocktemp\c!criterium\endcsname}%
177   \fi
178   \endgroup}
179
180\permanent\def\blockuservariable#1%
181  {\clf_structureblockuservariable\c_strc_blocks_index{#1}}
182
183% hide   : save, if [+] also hidden execute
184% keep   : save and normal execute
185% use    : normal execute unless [-]
186% process: hidden execute unless [-]
187% select : idem use
188
189\permanent\protected\def\hideblocks   {\strc_blocks_set_state[hide]}
190\permanent\protected\def\keepblocks   {\strc_blocks_set_state[keep]}
191\permanent\protected\def\useblocks    {\strc_blocks_select   [use]}
192\permanent\protected\def\processblocks{\strc_blocks_select   [process]}
193\permanent\protected\def\selectblocks {\strc_blocks_select   [use]}
194
195\permanent\protected\def\doifelseblocksempty{\clf_doifelsestructureblocksempty} % {name}{tag}{criterium}
196
197\protect \endinput
198