Browse Source

Bug 23873: Enable capture groups in MarcModificationTemplates

This patch adds support for regular expression capture groups in
MarcModificationTemplates.

We escape double quotes in the replacement string, then quote the whole
string before applying the `ee` modifier to the final regex application.

See
https://blog.james.rcpt.to/2010/10/25/perl-search-and-replace-using-variables/
for further details.

Test plan
1) Attempt to use capture groups in your regular expression based
   MarcModificationTemplate and note it does not work.
2) Apply the patch and try again, this time the capture group should
   yield the expected results.
3) Run t/SimpleMARC.t and confirm the tests still pass.

Signed-off-by: Andrew Fuerste-Henry <andrew@bywatersolutions.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
22.05.x
Martin Renvoize 2 years ago
committed by Fridolin Somers
parent
commit
0c155dd7b7
  1. 11
      Koha/SimpleMARC.pm

11
Koha/SimpleMARC.pm

@ -636,6 +636,9 @@ sub _modify_values {
my $regex = $params->{regex};
if ( $regex and $regex->{search} ) {
my $replace = $regex->{replace};
$replace =~ s/"/\\"/g; # Protection from embedded code
$replace = '"' . $replace . '"'; # Put in a string for /ee
$regex->{modifiers} //= q||;
my @available_modifiers = qw( i g );
my $modifiers = q||;
@ -645,16 +648,16 @@ sub _modify_values {
}
foreach my $value ( @$values ) {
if ( $modifiers =~ m/^(ig|gi)$/ ) {
$value =~ s/$regex->{search}/$regex->{replace}/ig;
$value =~ s/$regex->{search}/$replace/igee;
}
elsif ( $modifiers eq 'i' ) {
$value =~ s/$regex->{search}/$regex->{replace}/i;
$value =~ s/$regex->{search}/$replace/iee;
}
elsif ( $modifiers eq 'g' ) {
$value =~ s/$regex->{search}/$regex->{replace}/g;
$value =~ s/$regex->{search}/$replace/gee;
}
else {
$value =~ s/$regex->{search}/$regex->{replace}/;
$value =~ s/$regex->{search}/$replace/ee;
}
}
}

Loading…
Cancel
Save