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:
parent
2a4fa0a803
commit
248283fc29
1 changed files with 15 additions and 12 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue