[latex3-commits] [git/LaTeX3-latex3-latex3] main: Fix interaction of cs and catcodes in regex replacements (fixes #909) (b067a0512)
Bruno Le Floch
blflatex at gmail.com
Tue May 11 02:26:28 CEST 2021
Repository : https://github.com/latex3/latex3
On branch : main
Link : https://github.com/latex3/latex3/commit/b067a0512726d580bc80734d5a300fd68709358d
>---------------------------------------------------------------
commit b067a0512726d580bc80734d5a300fd68709358d
Author: Bruno Le Floch <blflatex at gmail.com>
Date: Tue May 11 02:26:28 2021 +0200
Fix interaction of cs and catcodes in regex replacements (fixes #909)
>---------------------------------------------------------------
b067a0512726d580bc80734d5a300fd68709358d
l3kernel/CHANGELOG.md | 1 +
l3kernel/l3regex.dtx | 26 +++++++++++++++-----------
l3kernel/testfiles/m3regex001.lvt | 13 +++++++++++++
l3kernel/testfiles/m3regex001.tlg | 13 +++++++++++++
4 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index 341961b0c..7dabcdb5a 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -14,6 +14,7 @@ this project uses date-based 'snapshot' version identifiers.
### Fixed
- Loading of backend in generic DVI mode (issue #905)
- Make `\keyval_parse:nnn` alignment-safe (issue #896)
+- Control sequences and category codes in regex replacements (issue #909)
### Changed
- Speed up \group_align_safe_begin: (pull #906)
diff --git a/l3kernel/l3regex.dtx b/l3kernel/l3regex.dtx
index b6ea1f31e..aca9d3989 100644
--- a/l3kernel/l3regex.dtx
+++ b/l3kernel/l3regex.dtx
@@ -5656,17 +5656,21 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_normal:n #1
{
- \tl_if_empty:NTF \l_@@_replacement_category_tl
- { \@@_replacement_normal_aux:N #1 }
- { % (
- \token_if_eq_charcode:NNTF #1 )
- {
- \seq_pop:NN \l_@@_replacement_category_seq
- \l_@@_replacement_category_tl
- }
- {
- \use:c { @@_replacement_c_ \l_@@_replacement_category_tl :w }
- ? #1
+ \int_compare:nNnTF { \l_@@_replacement_csnames_int } > 0
+ { \exp_args:No \@@_replacement_put:n { \token_to_str:N #1 } }
+ {
+ \tl_if_empty:NTF \l_@@_replacement_category_tl
+ { \@@_replacement_normal_aux:N #1 }
+ { % (
+ \token_if_eq_charcode:NNTF #1 )
+ {
+ \seq_pop:NN \l_@@_replacement_category_seq
+ \l_@@_replacement_category_tl
+ }
+ {
+ \use:c { @@_replacement_c_ \l_@@_replacement_category_tl :w }
+ ? #1
+ }
}
}
}
diff --git a/l3kernel/testfiles/m3regex001.lvt b/l3kernel/testfiles/m3regex001.lvt
index c98dab9ec..c49e37d98 100644
--- a/l3kernel/testfiles/m3regex001.lvt
+++ b/l3kernel/testfiles/m3regex001.lvt
@@ -237,5 +237,18 @@
\test:nn { (?:) } { abc }
}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\TEST { catcodes~and~cs~in~replacement }
+ {
+ \cs_set_nopar:cpn { x ? y } { y ? z }
+ \cs_set_nopar:cpn { y ? z ^ } { z . a }
+ \char_set_catcode_active:n { `? }
+ \char_set_catcode_parameter:n { `^ }
+ \regex_replace_all:nnN { .* }
+ { \c{x\?y} \u{x\?y} \c{\u{x\?y}\^} \? }
+ \l_tmpa_tl
+ \tl_analysis_show:N \l_tmpa_tl
+ }
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\END
diff --git a/l3kernel/testfiles/m3regex001.tlg b/l3kernel/testfiles/m3regex001.tlg
index f1003919e..fb1ba2410 100644
--- a/l3kernel/testfiles/m3regex001.tlg
+++ b/l3kernel/testfiles/m3regex001.tlg
@@ -161,3 +161,16 @@ TRUE
TRUE
{} {} {} {}
============================================================
+============================================================
+TEST 12: catcodes and cs in replacement
+============================================================
+The token list \l_tmpa_tl contains the tokens:
+> \x?y (control sequence=macro:->y?z)
+> y (the letter y)
+> ? (the character ?)
+> z (the letter z)
+> \y?z^ (control sequence=macro:->z.a)
+> ? (active character=undefined).
+<recently read> }
+l. ... }
+============================================================
More information about the latex3-commits
mailing list.