[latex3-commits] [git/LaTeX3-latex3-latex3] master: Implement peek collect_inline functions (b446623)
Bruno Le Floch
bruno at le-floch.fr
Sun Sep 23 17:07:59 CEST 2018
Repository : https://github.com/latex3/latex3
On branch : master
Link : https://github.com/latex3/latex3/commit/b446623bf1a28c3a39db006e7e2c17078ec0c850
>---------------------------------------------------------------
commit b446623bf1a28c3a39db006e7e2c17078ec0c850
Author: Bruno Le Floch <bruno at le-floch.fr>
Date: Sun Sep 23 16:38:05 2018 +0200
Implement peek collect_inline functions
This allows picking up some tokens to reinsert them differently later.
>---------------------------------------------------------------
b446623bf1a28c3a39db006e7e2c17078ec0c850
l3kernel/l3candidates.dtx | 113 +++++++++++++++++++++++++++++++
l3kernel/testfiles/m3expl001.luatex.tlg | 8 +++
l3kernel/testfiles/m3expl001.ptex.tlg | 8 +++
l3kernel/testfiles/m3expl001.tlg | 8 +++
l3kernel/testfiles/m3expl001.uptex.tlg | 8 +++
l3kernel/testfiles/m3expl001.xetex.tlg | 8 +++
l3kernel/testfiles/m3expl003.luatex.tlg | 8 +++
l3kernel/testfiles/m3expl003.ptex.tlg | 8 +++
l3kernel/testfiles/m3expl003.tlg | 8 +++
l3kernel/testfiles/m3expl003.uptex.tlg | 8 +++
l3kernel/testfiles/m3expl003.xetex.tlg | 8 +++
l3kernel/testfiles/m3peek001.lvt | 58 ++++++++++++++++
l3kernel/testfiles/m3peek001.tlg | 25 +++++++
13 files changed, 276 insertions(+)
diff --git a/l3kernel/l3candidates.dtx b/l3kernel/l3candidates.dtx
index 43c1918..9c45963 100644
--- a/l3kernel/l3candidates.dtx
+++ b/l3kernel/l3candidates.dtx
@@ -1467,6 +1467,39 @@
% (as appropriate to the result of the test).
% \end{function}
%
+% \begin{function}[added = 2018-09-23]
+% {
+% \peek_catcode_collect_inline:Nn,
+% \peek_charcode_collect_inline:Nn,
+% \peek_meaning_collect_inline:Nn
+% }
+% \begin{syntax}
+% \cs{peek_catcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
+% \cs{peek_charcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
+% \cs{peek_meaning_collect_inline:Nn} \meta{test token} \Arg{inline code}
+% \end{syntax}
+% Collects and removes tokens from the input stream until finding a
+% token that does not match the \meta{test token} (as defined by the
+% test \cs{token_if_eq_catcode:NNTF} or \cs{token_if_eq_charcode:NNTF}
+% or \cs{token_if_eq_meaning:NNTF}). The collected tokens are passed
+% to the \meta{inline code} as~|#1|. When begin-group or end-group
+% tokens (usually |{| or~|}|) are collected they are replaced by
+% implicit \cs{c_group_begin_token} and \cs{c_group_end_token}, and
+% when spaces (including \cs{c_space_token}) are collected they are
+% replaced by explicit spaces.
+%
+% For example the following code prints ``Hello'' to the terminal and
+% leave ``, world!'' in the input stream.
+% \begin{verbatim}
+% \peek_catcode_collect_inline:Nn A { \iow_term:n {#1} } Hello,~world!
+% \end{verbatim}
+% Another example is that the following code tests if the next token is |*|, ignoring intervening spaces, but putting them back using |#1| if there is no~|*|.
+% \begin{verbatim}
+% \peek_meaning_collect_inline:Nn \c_space_token
+% { \peek_charcode:NTF * { star } { no~star #1 } }
+% \end{verbatim}
+% \end{function}
+%
% \end{documentation}
%
% \begin{implementation}
@@ -5229,6 +5262,86 @@
% \end{macro}
% \end{macro}
%
+% \begin{variable}{\l_@@_collect_tl}
+% \begin{macrocode}
+\tl_new:N \l_@@_collect_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}
+% {
+% \peek_catcode_collect_inline:Nn,
+% \peek_charcode_collect_inline:Nn,
+% \peek_meaning_collect_inline:Nn
+% }
+% \begin{macro}
+% {
+% \@@_collect:NNn, \@@_collect_true:w,
+% \@@_collect_remove:nw, \@@_collect:N
+% }
+% Most of the work is done by \cs{@@_execute_branches_\ldots{}:},
+% which calls either \cs{@@_true:w} or \cs{@@_false:w} according to
+% whether the next token \cs{l_peek_token} matches the search token
+% (stored in \cs{l_@@_search_token} and \cs{l_@@_search_tl}).
+% Here, in the \texttt{true} case we run \cs{@@_collect_true:w},
+% which generally calls \cs{@@_collect:N} to store the peeked token
+% into \cs{l_@@_collect_tl}, except in special non-\texttt{N}-type
+% cases (begin-group, end-group, or space), where a frozen token is
+% stored. The \texttt{true} branch calls
+% \cs{@@_execute_branches_\ldots{}:} to fetch more matching tokens.
+% Once there are no more, \cs{@@_false_aux:n} closes the safe-align
+% group and runs the user's inline code.
+% \begin{macrocode}
+\cs_new_protected:Npn \peek_catcode_collect_inline:Nn
+ { \@@_collect:NNn \@@_execute_branches_catcode: }
+\cs_new_protected:Npn \peek_charcode_collect_inline:Nn
+ { \@@_collect:NNn \@@_execute_branches_charcode: }
+\cs_new_protected:Npn \peek_meaning_collect_inline:Nn
+ { \@@_collect:NNn \@@_execute_branches_meaning: }
+\cs_new_protected:Npn \@@_collect:NNn #1#2#3
+ {
+ \group_align_safe_begin:
+ \cs_set_eq:NN \l_@@_search_token #2
+ \tl_set:Nn \l_@@_search_tl {#2}
+ \tl_clear:N \l_@@_collect_tl
+ \cs_set:Npn \@@_false:w
+ { \exp_args:No \@@_false_aux:n \l_@@_collect_tl }
+ \cs_set:Npn \@@_false_aux:n ##1
+ {
+ \group_align_safe_end:
+ #3
+ }
+ \cs_set_eq:NN \@@_true:w \@@_collect_true:w
+ \cs_set:Npn \@@_true_aux:w { \peek_after:Nw #1 }
+ \@@_true_aux:w
+ }
+\cs_new_protected:Npn \@@_collect_true:w
+ {
+ \if_case:w
+ \if_catcode:w \exp_not:N \l_peek_token { 1 \exp_stop_f: \fi:
+ \if_catcode:w \exp_not:N \l_peek_token } 2 \exp_stop_f: \fi:
+ \if_meaning:w \l_peek_token \c_space_token 3 \exp_stop_f: \fi:
+ 0 \exp_stop_f:
+ \exp_after:wN \@@_collect:N
+ \or: \@@_collect_remove:nw { \c_group_begin_token }
+ \or: \@@_collect_remove:nw { \c_group_end_token }
+ \or: \@@_collect_remove:nw { ~ }
+ \fi:
+ }
+\cs_new_protected:Npn \@@_collect:N #1
+ {
+ \tl_put_right:Nn \l_@@_collect_tl {#1}
+ \@@_true_aux:w
+ }
+\cs_new_protected:Npn \@@_collect_remove:nw #1
+ {
+ \tl_put_right:Nn \l_@@_collect_tl {#1}
+ \exp_after:wN \@@_true_remove:w
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macrocode}
%</initex|package>
% \end{macrocode}
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index fe6ceff..2f4d0d9 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -6080,6 +6080,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 825d301..44ab8a4 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -6117,6 +6117,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index cd05d8f..a1cc935 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -6318,6 +6318,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index 97e668b..2d92f40 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -6315,6 +6315,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 6388f01..3f2461a 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -6084,6 +6084,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index fe6ceff..2f4d0d9 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -6080,6 +6080,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 825d301..44ab8a4 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -6117,6 +6117,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index cd05d8f..a1cc935 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -6318,6 +6318,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index 97e668b..2d92f40 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -6315,6 +6315,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index 6388f01..3f2461a 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -6084,6 +6084,14 @@ Defining \__peek_N_type_aux:nnw on line ...
Defining \peek_N_type:TF on line ...
Defining \peek_N_type:T on line ...
Defining \peek_N_type:F on line ...
+Defining \l__peek_collect_tl on line ...
+Defining \peek_catcode_collect_inline:Nn on line ...
+Defining \peek_charcode_collect_inline:Nn on line ...
+Defining \peek_meaning_collect_inline:Nn on line ...
+Defining \__peek_collect:NNn on line ...
+Defining \__peek_collect_true:w on line ...
+Defining \__peek_collect:N on line ...
+Defining \__peek_collect_remove:nw on line ...
Defining \__kernel_deprecation_error:Nnn on line ...
Defining \__deprecation_primitive:NN on line ...
Defining \__deprecation_primitive:w on line ...
diff --git a/l3kernel/testfiles/m3peek001.lvt b/l3kernel/testfiles/m3peek001.lvt
index 8477ad2..63fcbb9 100644
--- a/l3kernel/testfiles/m3peek001.lvt
+++ b/l3kernel/testfiles/m3peek001.lvt
@@ -145,6 +145,64 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\OMIT
+\cs_new_protected:Npn \test:nw #1#2 \q_stop
+ { \TYPE { \tl_to_str:n { | #1 | #2 | } } }
+\TIMO
+
+\TEST { peek~collect }
+ {
+ \peek_catcode_collect_inline:Nn A { \test:nw {#1} } AAAABC \q_stop
+ \peek_catcode_collect_inline:Nn A { \test:nw {#1} } ABC \q_stop
+ \use:x
+ {
+ \peek_catcode_collect_inline:Nn A { \test:nw {##1} }
+ \token_to_str:N A
+ }
+ \q_stop
+ \peek_catcode_collect_inline:Nn
+ \c_space_token { \test:nw {#1} } ~ \c_space_token . \q_stop
+ \peek_catcode_collect_inline:Nn \c_space_token { \test:nw {#1} } { a } b \q_stop
+ \peek_catcode_collect_inline:Nn \c_group_begin_token
+ { \test:nw {#1} } \c_group_begin_token { \c_group_begin_token \a \q_stop
+ \peek_catcode_collect_inline:Nn \c_group_end_token
+ { \test:nw {#1} } \c_group_end_token } \c_group_end_token \a \q_stop
+
+ \peek_charcode_collect_inline:Nn A { \test:nw {#1} } AAAABC \q_stop
+ \peek_charcode_collect_inline:Nn A { \test:nw {#1} } ABC \q_stop
+ \use:x
+ {
+ \peek_charcode_collect_inline:Nn A { \test:nw {##1} }
+ \token_to_str:N A
+ }
+ \q_stop
+ \peek_charcode_collect_inline:Nn
+ \c_space_token { \test:nw {#1} } ~ \c_space_token . \q_stop
+ \peek_charcode_collect_inline:Nn \c_space_token { \test:nw {#1} } { a } b \q_stop
+ \peek_charcode_collect_inline:Nn \c_group_begin_token
+ { \test:nw {#1} } \c_group_begin_token { \c_group_begin_token \a \q_stop
+ \peek_charcode_collect_inline:Nn \c_group_end_token
+ { \test:nw {#1} } \c_group_end_token } \c_group_end_token \a \q_stop
+
+ \peek_meaning_collect_inline:Nn A { \test:nw {#1} } AAAABC \q_stop
+ \peek_meaning_collect_inline:Nn A { \test:nw {#1} } ABC \q_stop
+ \use:x
+ {
+ \peek_meaning_collect_inline:Nn A { \test:nw {##1} }
+ \token_to_str:N A
+ }
+ \q_stop
+ \peek_meaning_collect_inline:Nn
+ \c_space_token { \test:nw {#1} } ~ \c_space_token . \q_stop
+ \peek_meaning_collect_inline:Nn \c_space_token { \test:nw {#1} } { a } b \q_stop
+ \peek_meaning_collect_inline:Nn \c_group_begin_token
+ { \test:nw {#1} } \c_group_begin_token { \c_group_begin_token \a \q_stop
+ \peek_meaning_collect_inline:Nn \c_group_end_token
+ { \test:nw {#1} } \c_group_end_token } \c_group_end_token \a \q_stop
+ }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
\END
diff --git a/l3kernel/testfiles/m3peek001.tlg b/l3kernel/testfiles/m3peek001.tlg
index 943a816..4964482 100644
--- a/l3kernel/testfiles/m3peek001.tlg
+++ b/l3kernel/testfiles/m3peek001.tlg
@@ -176,3 +176,28 @@ FALSE
FALSE
FALSE
============================================================
+============================================================
+TEST 10: peek collect
+============================================================
+|AAAABC||
+|ABC||
+||A|
+| |.|
+||{a}b|
+|\c_group_begin_token \c_group_begin_token \c_group_begin_token |\a |
+|\c_group_end_token \c_group_end_token \c_group_end_token |\a |
+|AAAA|BC|
+|A|BC|
+|A||
+| |.|
+||{a}b|
+|\c_group_begin_token \c_group_begin_token \c_group_begin_token |\a |
+|\c_group_end_token \c_group_end_token \c_group_end_token |\a |
+|AAAA|BC|
+|A|BC|
+||A|
+| |.|
+||{a}b|
+|\c_group_begin_token \c_group_begin_token \c_group_begin_token |\a |
+|\c_group_end_token \c_group_end_token \c_group_end_token |\a |
+============================================================
More information about the latex3-commits
mailing list