From: Thomas Berezansky Date: Tue, 12 Jun 2012 17:42:10 +0000 (-0400) Subject: Expose sortable title in mvr X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=219e65f9ec14980922f4d154341a0d13b6808946;p=working%2FEvergreen.git Expose sortable title in mvr Signed-off-by: Thomas Berezansky --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 2f9fc7f51d..99168f3aa2 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -116,6 +116,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm index 4dd3c013ef..323ca2b082 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm @@ -1910,6 +1910,7 @@ sub flesh_circ { $mods = new Fieldmapper::metabib::virtual_record; $mods->doc_id(OILS_PRECAT_RECORD); $mods->title($copy->dummy_title); + $mods->titlesort($copy->dummy_title); $mods->author($copy->dummy_author); } else { diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Utils/ModsParser.pm b/Open-ILS/src/perlmods/lib/OpenILS/Utils/ModsParser.pm index d2e92aa4fe..c221e12c2a 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Utils/ModsParser.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Utils/ModsParser.pm @@ -10,31 +10,31 @@ use OpenSRF::Utils::SettingsClient; use OpenSRF::Utils::Logger qw/$logger/; use Data::Dumper; -my $parser = XML::LibXML->new(); +my $parser = XML::LibXML->new(); my $xslt = XML::LibXSLT->new(); my $mods_sheet; # ---------------------------------------------------------------------------------------- # XPATH for extracting info from a MODS doc -my $isbn_xpath = "//mods:mods/mods:identifier[\@type='isbn' and not(\@invalid)]"; -my $resource_xpath = "//mods:mods/mods:typeOfResource"; -my $pub_xpath = "//mods:mods/mods:originInfo//mods:dateIssued[\@encoding='marc']|" . +my $isbn_xpath = "//mods:mods/mods:identifier[\@type='isbn' and not(\@invalid)]"; +my $resource_xpath = "//mods:mods/mods:typeOfResource"; +my $pub_xpath = "//mods:mods/mods:originInfo//mods:dateIssued[\@encoding='marc']|" . "//mods:mods/mods:originInfo//mods:dateIssued[1]"; -my $tcn_xpath = "//mods:mods/mods:recordInfo/mods:recordIdentifier"; -my $publisher_xpath = "//mods:mods/mods:originInfo//mods:publisher[1]"; -my $edition_xpath = "//mods:mods/mods:originInfo//mods:edition[1]"; -my $abstract_xpath = "//mods:mods/mods:abstract"; -my $related_xpath = ""; +my $tcn_xpath = "//mods:mods/mods:recordInfo/mods:recordIdentifier"; +my $publisher_xpath = "//mods:mods/mods:originInfo//mods:publisher[1]"; +my $edition_xpath = "//mods:mods/mods:originInfo//mods:edition[1]"; +my $abstract_xpath = "//mods:mods/mods:abstract"; +my $related_xpath = ""; my $online_loc_xpath = "//mods:location/mods:url"; -my $physical_desc = "(//mods:mods/mods:physicalDescription/mods:form|//mods:mods/mods:physicalDescription/mods:extent|". +my $physical_desc = "(//mods:mods/mods:physicalDescription/mods:form|//mods:mods/mods:physicalDescription/mods:extent|". "//mods:mods/mods:physicalDescription/mods:reformattingQuality|//mods:mods/mods:physicalDescription/mods:internetMediaType|". "//mods:mods/mods:physicalDescription/mods:digitalOrigin)"; -my $toc_xpath = "//mods:tableOfContents"; +my $toc_xpath = "//mods:tableOfContents"; my $xpathset = { title => { - abbreviated => + abbreviated => "//mods:mods/mods:titleInfo[mods:title and (\@type='abbreviated')]", translated => "//mods:mods/mods:titleInfo[mods:title and (\@type='translated')]", @@ -42,12 +42,14 @@ my $xpathset = { "//mods:mods/mods:titleInfo[mods:title and (\@type='uniform')]", proper => "//mods:mods/mods:titleInfo[mods:title and not (\@type)]", + sortkey => + "//mods:mods/mods:titleInfo[mods:title and not (\@type)]", any => "//mods:mods/mods:titleInfo", }, author => { - corporate => + corporate => "//mods:mods/mods:name[\@type='corporate']/*[local-name()='namePart']". "[../mods:role/mods:text[text()='creator']". " or ../mods:role/mods:roleTerm[". @@ -55,7 +57,7 @@ my $xpathset = { " and \@authority='marcrelator'". " and text()='creator']". "][1]", - personal => + personal => "//mods:mods/mods:name[\@type='personal']/*[local-name()='namePart']". "[../mods:role/mods:text[text()='creator']". " or ../mods:role/mods:roleTerm[". @@ -63,7 +65,7 @@ my $xpathset = { " and \@authority='marcrelator'". " and text()='creator']". "][1]", - conference => + conference => "//mods:mods/mods:name[\@type='conference']/*[local-name()='namePart']". "[../mods:role/mods:text[text()='creator']". " or ../mods:role/mods:roleTerm[". @@ -71,15 +73,15 @@ my $xpathset = { " and \@authority='marcrelator'". " and text()='creator']". "][1]", - other => + other => "//mods:mods/mods:name[\@type='personal']/*[local-name()='namePart']", - any => + any => "//mods:mods/mods:name/*[local-name()='namePart'][1]", }, subject => { - topic => + topic => "//mods:mods/mods:subject/*[". " local-name()='geographic'". " or local-name()='name'". @@ -87,14 +89,14 @@ my $xpathset = { " or local-name()='topic'". "]/parent::mods:subject", -# geographic => -# "//mods:mods/*[local-name()='subject']/*[local-name()='geographic']", -# name => -# "//mods:mods/*[local-name()='subject']/*[local-name()='name']", -# temporal => -# "//mods:mods/*[local-name()='subject']/*[local-name()='temporal']", -# topic => -# "//mods:mods/*[local-name()='subject']/*[local-name()='topic']", +# geographic => +# "//mods:mods/*[local-name()='subject']/*[local-name()='geographic']", +# name => +# "//mods:mods/*[local-name()='subject']/*[local-name()='name']", +# temporal => +# "//mods:mods/*[local-name()='subject']/*[local-name()='temporal']", +# topic => +# "//mods:mods/*[local-name()='subject']/*[local-name()='topic']", }, #keyword => { keyword => "//mods:mods/*[not(local-name()='originInfo')]", }, @@ -110,7 +112,7 @@ sub new { return bless( {}, shift() ); } sub get_field_value { - my( $self, $mods, $xpath, $type) = @_; + my( $self, $mods, $xpath, $class, $type) = @_; my @string; @@ -126,11 +128,14 @@ sub get_field_value { my @children = $value->childNodes(); my @child_text; for my $child (@children) { + # Magic for title-sorting special value, skip the nonSort node + next if ($class && $class eq 'title' && $type && $type eq 'sortkey' && $child->nodeName =~ m/nonSort/); + # MODS strips the punctuation from 245abc, which often # results in "title subtitle" rather than "title : subtitle"; # this hack gets it back for us - if ($type && $type eq 'title' && $child->nodeName =~ m/subTitle/) { - push(@child_text, " : "); + if ($class && $class eq 'title' && $child->nodeName =~ m/subTitle/) { + push(@child_text, " : "); } next unless( $child->nodeType != 3 ); @@ -142,7 +147,7 @@ sub get_field_value { push(@child_text, join(' ', @a)); } else { - push(@child_text, $child->textContent); + push(@child_text, $child->textContent); } } @@ -202,7 +207,7 @@ sub modsdoc_to_values { my $class = "title"; $data->{$class} = {}; for my $type(keys %{$xpathset->{$class}}) { - my @value = $self->get_field_value( $mods, $xpathset->{$class}->{$type}, "title" ); + my @value = $self->get_field_value( $mods, $xpathset->{$class}->{$type}, "title", $type ); for my $arr (@value) { if( ref($arr) ) { $data->{$class}->{$type} = shift @$arr; @@ -263,9 +268,10 @@ sub mods_values_to_mods_slim { my( $self, $modsperl ) = @_; my $title = ""; + my $titlesort = ""; my $author = ""; my $subject = []; - my $series = []; + my $series = []; my $tmp = $modsperl->{title}; @@ -279,6 +285,13 @@ sub mods_values_to_mods_slim { ($title = $tmp->{any}); } + # Just another title value check, so we can re-use the previous tmp lookup + if(!$tmp) { $titlesort = ""; } + else { + ($titlesort = $tmp->{sortkey}) || + ($titlesort = $title); + } + $tmp = $modsperl->{author}; if(!$tmp) { $author = ""; } else { @@ -286,11 +299,11 @@ sub mods_values_to_mods_slim { ($author = $tmp->{corporate}) || ($author = $tmp->{conference}) || ($author = $tmp->{other}) || - ($author = $tmp->{any}); + ($author = $tmp->{any}); } $tmp = $modsperl->{subject}; - if(!$tmp) { $subject = {}; } + if(!$tmp) { $subject = {}; } else { for my $key( keys %{$tmp}) { push(@$subject, @{$tmp->{$key}}) if ($tmp->{$key}); @@ -307,7 +320,7 @@ sub mods_values_to_mods_slim { else { $series = $tmp->{'series'}; } - return { series => $series, title => $title, + return { series => $series, title => $title, titlesort => $titlesort, author => $author, subject => $subject }; } @@ -339,19 +352,19 @@ sub start_mods_batch { $self->{master_doc} = $self->modsdoc_to_values( $mods ); $self->{master_doc} = $self->mods_values_to_mods_slim( $self->{master_doc} ); - ($self->{master_doc}->{isbn}) = + ($self->{master_doc}->{isbn}) = $self->get_field_value( $mods, $isbn_xpath ); - $self->{master_doc}->{type_of_resource} = + $self->{master_doc}->{type_of_resource} = [ $self->get_field_value( $mods, $resource_xpath ) ]; - ($self->{master_doc}->{tcn}) = + ($self->{master_doc}->{tcn}) = $self->get_field_value( $mods, $tcn_xpath ); - ($self->{master_doc}->{pubdate}) = + ($self->{master_doc}->{pubdate}) = $self->get_field_value( $mods, $pub_xpath ); - ($self->{master_doc}->{publisher}) = + ($self->{master_doc}->{publisher}) = $self->get_field_value( $mods, $publisher_xpath ); ($self->{master_doc}->{edition}) = @@ -368,13 +381,13 @@ sub start_mods_batch { push(@{$self->{master_doc}->{online_loc}}, $url->getAttribute('note') || ''); } - ($self->{master_doc}->{synopsis}) = + ($self->{master_doc}->{synopsis}) = $self->get_field_value( $mods, $abstract_xpath ); $self->{master_doc}->{physical_description} = []; push(@{$self->{master_doc}->{physical_description}}, $self->get_field_value( $mods, $physical_desc ) ); - $self->{master_doc}->{physical_description} = + $self->{master_doc}->{physical_description} = join( ' ', @{$self->{master_doc}->{physical_description}}); ($self->{master_doc}->{toc}) = $self->get_field_value($mods, $toc_xpath); @@ -407,11 +420,11 @@ sub push_mods_batch { } } - push( @{$self->{master_doc}->{type_of_resource}}, + push( @{$self->{master_doc}->{type_of_resource}}, $self->get_field_value( $mods, $resource_xpath )); if(!($self->{master_doc}->{isbn}) ) { - ($self->{master_doc}->{isbn}) = + ($self->{master_doc}->{isbn}) = $self->get_field_value( $mods, $isbn_xpath ); } } @@ -440,6 +453,7 @@ sub finish_mods_batch { #(my $title = $perl->{title}) =~ s/\[.*?\]//og; #(my $author = $perl->{author}) =~ s/\(.*?\)//og; my $title = $perl->{title}; + my $titlesort = $perl->{titlesort}; my $author = $perl->{author}; my @series; @@ -453,6 +467,7 @@ sub finish_mods_batch { $rtypes = [ keys %hash ]; $record->title($title); + $record->titlesort($titlesort); $record->author($author); $record->doc_id($perl->{doc_id});