Bug 10996: Allow numeric subfields to be stripped on export

Regex assumed all numeric characters were part of the tag number
This is obviously false as $9 would be a likely candidate
to be removed on export.

The code can be any printing ascii character other than space
according to LoC's website.

Also changed regexp to no longer allow a zero length tag number
which is nonsensical.

The old regex would accept shorter than 3 digit tags but these were
not stripped so I've removed that option, considering it a bug
not a feature

NB assumption that the code makes that a tag is always numeric is
incorrect but works in practice. Handling non-numeric tags is
a 'To be done'

Made code dependent on the regex succeeding. Picking up results
from a previous regex on failure can lead to weird hard to
identify bugs

In the course of testing Paola Rossi <paola.rossi@cineca.it>
spotted that the delete operation was flawed, only removing
the first occurence of the specified tag/tag subfield. Reworked
the delete loop to operate on all occurences

Signed-off-by: Paola Rossi <paola.rossi@cineca.it>
Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
This commit is contained in:
Colin Campbell 2013-10-04 11:01:27 +01:00 committed by Galen Charlton
parent 2a4fa0a803
commit 248283fc29

View file

@ -358,19 +358,22 @@ if ( $op eq "export" ) {
}
if ($export_remove_fields) {
my @fields = split " ", $export_remove_fields;
foreach (@fields) {
/^(\d*)(\w)?$/;
my $field = $1;
my $subfield = $2;
for my $f ( split / /, $export_remove_fields ) {
if ( $f =~ m/^(\d{3})(.)?$/ ) {
my ( $field, $subfield ) = ( $1, $2 );
# skip if this record doesn't have this field
next if not defined $record->field($field);
if ($subfield) {
$record->field($field)->delete_subfields($subfield);
}
else {
$record->delete_field( $record->field($field) );
# skip if this record doesn't have this field
if ( defined $record->field($field) ) {
if ( defined $subfield ) {
my @tags = $record->field($field);
foreach my $t (@tags) {
$t->delete_subfields($subfield);
}
}
else {
$record->delete_fields($field);
}
}
}
}
}