summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/strc-blk.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/strc-blk.mkiv')
-rw-r--r--tex/context/base/mkiv/strc-blk.mkiv128
1 files changed, 104 insertions, 24 deletions
diff --git a/tex/context/base/mkiv/strc-blk.mkiv b/tex/context/base/mkiv/strc-blk.mkiv
index c42bb25ec..e52198721 100644
--- a/tex/context/base/mkiv/strc-blk.mkiv
+++ b/tex/context/base/mkiv/strc-blk.mkiv
@@ -34,48 +34,125 @@
\appendtoks
\clf_definestructureblock{\currentblock}%
- \setuevalue{\e!begin\currentblock}{\dodoubleempty\strc_blocks_begin[\currentblock]}%
- \setuevalue{\e!end \currentblock}{}%
+ \setuevalue{\e!begin\currentblock}{\strc_blocks_begin{\currentblock}}%
+ \letvalue {\e!end \currentblock}\donothing
\to \everydefineblock
-\unexpanded\def\strc_blocks_begin[#1][#2]%
- {\normalexpanded{\buff_pickup{@block@}{\e!begin#1}{\e!end#1}}
- {}% before
- {\clf_savestructureblock{#1}{#2}{@block@}}%
- \plusone}% after
+% The naive way:
+%
+% \unexpanded\def\strc_blocks_begin#1%
+% {\dotripleempty\strc_blocks_begin_indeed[#1]}
+%
+% \unexpanded\def\strc_blocks_begin_indeed[#1][#2][#3]%
+% {\normalexpanded{\buff_pickup{\??block}{\e!begin#1}{\e!end#1}}
+% {}%
+% {\clf_savestructureblock{#1}{#2}{#3}{\??block}}%
+% \plusone}%
+%
+% We need to prevent too much lookahead which will gobble newlines
+% that are needed for buffers. See blocks-002.tex as example.
+
+% maybe: systemmode "block:<name>"
+
+\let\m_block \empty
+\let\m_subblock\empty
+
+\unexpanded\def\strc_blocks_begin#1%
+ {\edef\m_block {#1}%
+ \let \m_subblock\empty
+ \doifelsenextoptionalcs\strc_blocks_begin_yes\strc_blocks_begin_nop}
+
+\unexpanded\def\strc_blocks_begin_yes[#1]%
+ {\doifelseassignmentcs{#1}%
+ \strc_blocks_begin_indeed
+ \strc_blocks_begin_tagged
+ {#1}}
+
+\unexpanded\def\strc_blocks_begin_tagged#1%
+ {\edef\m_subblock{#1}%
+ \doifelsenextoptionalcs\strc_blocks_begin_yes_yes\strc_blocks_begin_nop}
+
+\unexpanded\def\strc_blocks_begin_yes_yes[#1]%
+ {\strc_blocks_begin_indeed{#1}}
+
+\unexpanded\def\strc_blocks_begin_nop
+ {\strc_blocks_begin_indeed{}}
+
+\unexpanded\def\strc_blocks_begin_indeed#1%
+ {\normalexpanded{\buff_pickup{\??block}{\e!begin\m_block}{\e!end\m_block}}%
+ {}%
+ {\clf_savestructureblock{\m_block}{\m_subblock}{#1}{\??block}}%
+ \plusone}
\let\strc_blocks_setup\relax
+\newconstant \c_strc_blocks_index
+\newconditional\c_strc_blocks_display
+
\unexpanded\def\dostarthiddenblock % called at lua end
- {\startnointerference
- \dostartnormalblock}
+ {\begingroup
+ \visiblefalse % blocks float
+ \startnointerference
+ \strc_start_block}
\unexpanded\def\dostophiddenblock % called at lua end
- {\dostopnormalblock
- \stopnointerference}
+ {\strc_stop_block
+ \stopnointerference
+ \endgroup}
+
+\unexpanded\def\dostartnormalblock % called at lua end
+ {\begingroup
+ \visibletrue
+ \strc_start_block}
-\unexpanded\def\dostartnormalblock#1% called at lua end
- {\bgroup
- \visibletrue % will change
- \edef\currentblock{#1}%
+\unexpanded\def\dostopnormalblock % called at lua end
+ {\strc_stop_block
+ \endgroup}
+
+\def\strc_start_block#1#2%
+ {\edef\currentblock{#2}%
+ \c_strc_blocks_index#1\relax
\strc_blocks_setup
\let\strc_blocks_setup\relax
- \blockparameter\c!before
- \useblockstyleandcolor\c!style\c!color % maybe moev one line up (font spacing)
- \blockparameter\c!inner % better \c!setups
+ \edef\p_alternative{\blockparameter\c!alternative}%
+ \ifx\p_alternative\v!text
+ \setfalse\c_strc_blocks_display
+ \else
+ \settrue\c_strc_blocks_display
+ \fi
+ \ifconditional\c_strc_blocks_display
+ \blockparameter\c!before
+ \fi
+ \begingroup
+ \usesetupsparameter\blockparameter\relax
+ \dostarttagged\t!block\currentblock
+ \useblockstyleandcolor\c!style\c!color
+ \blockparameter\c!inner % old
+ \ifconditional\c_strc_blocks_display
+ \usealignparameter\blockparameter
+ \else
+ \blockparameter\c!left
+ \fi
\ignorespaces}
-\unexpanded\def\dostopnormalblock % called at lua end
+\def\strc_stop_block
{\removeunwantedspaces
- \blockparameter\c!after
- \par % todo: alternative = text, paragraph
- \egroup}
+ \ifconditional\c_strc_blocks_display
+ \par
+ \else
+ \blockparameter\c!right
+ \fi
+ \dostoptagged
+ \endgroup
+ \ifconditional\c_strc_blocks_display
+ \blockparameter\c!after
+ \fi}
\def\strc_blocks_set_state[#1][#2][#3]% state name tag
{\clf_setstructureblockstate{#1}{#2}{#3}}
\def\strc_blocks_select[#1][#2][#3][#4]% state name tag setups
- {\bgroup
+ {\begingroup
\doifelseassignment{#3}
{\getparameters[\??blocktemp][\c!criterium=\v!text,#3]%
\def\strc_blocks_setup{\setupcurrentblock[#3]}%
@@ -83,7 +160,10 @@
{\getparameters[\??blocktemp][\c!criterium=\v!text,#4]%
\def\strc_blocks_setup{\setupcurrentblock[#4]}%
\clf_selectstructureblock{#1}{#2}{#3}{\csname\??blocktemp\c!criterium\endcsname}}%
- \egroup}
+ \endgroup}
+
+\def\blockuservariable#1%
+ {\clf_structureblockuservariable\c_strc_blocks_index{#1}}
% hide : save, if [+] also hidden execute
% keep : save and normal execute