[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