###################################################################### # # Paracitation Module # ###################################################################### # # This file is part of GNU EPrints 2. # # Copyright (c) 2000-2004 University of Southampton, UK. SO17 1BJ. # # EPrints 2 is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # EPrints 2 is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with EPrints 2; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### use EPrints; use ParaTools::CiteParser::Standard; use URI; use strict; my $session = new EPrints::Session; exit( 0 ) unless( defined $session ); my $ds = $session->get_repository->get_dataset( "archive" ); &process( $session ); $session->terminate; exit; sub process { my( $session ) = @_; my $title = $session->html_phrase( "cgi/paracite:title" ); unless( EPrints::Utils::is_set( $session->param("ref") ) ) { $session->build_page( $title, $session->html_phrase( "cgi/paracite:no_reference" ), "paracite" ); $session->send_page(); return; } my $ref = $session->param("ref"); my $parser = new ParaTools::CiteParser::Standard(); my $metadata = $parser->parse($ref); my ($year, $author) = ($metadata->{year}, $metadata->{aulast}); if (!defined $year || $year eq "") { $_ = $ref; /\b(\d{4})\b/; $year = $1; if ($year !~ /^\d{4}/) { $year = ""; } } if (!defined $author || $author eq "") { $ref =~ m/^([a-zA-Z]+)/; $author = $1; } my $url = $ref; my $uri = URI->new( $url ); $url = $uri->as_string; $url =~ s/&/%26/g; my $paraurl = 'http://paracite.eprints.org/cgi-bin/paracite.cgi?ref='.$url; unless( EPrints::Utils::is_set( $author ) ) { $session->redirect( $paraurl ); return; } my $searchexp = new EPrints::Search( filters => [ { meta_fields=>[ 'metadata_visibility' ], value=>'show', match=>'EQ', merge=>"ANY", describe=>0 }, ], session => $session, dataset => $ds ); if( EPrints::Utils::is_set( $author ) ) { if( $ds->has_field( "authors" ) ) { $searchexp->add_field( $ds->get_field( "authors" ), $author ); } elsif( $ds->has_field( "creators" ) ) { $searchexp->add_field( $ds->get_field( "creators" ), $author ); } # otherwise dunno what to do. } if( EPrints::Utils::is_set( $year ) ) { if( $ds->has_field( "year" ) ) { $searchexp->add_field( $ds->get_field( "year" ), $year ); } elsif( $ds->has_field( "date" ) ) { $searchexp->add_field( $ds->get_field( "date" ), $year ); } # otherwise dunno what to do } $searchexp->perform_search(); my $count = $searchexp->count(); if( $count == 0 ) { $session->redirect( $paraurl ); $searchexp->dispose; return; } my $page = $session->make_doc_fragment(); my $p = $session->make_element( "p" ); $p->appendChild( $session->make_text( $ref ) ); $page->appendChild( $p ); my @matches = $searchexp->get_records( 0, 10 ); $page->appendChild( $session->html_phrase( "cgi/paracite:possible_matches" ) ); foreach my $m ( @matches ) { my $p = $session->make_element( "p" ); $p->appendChild( $m->render_citation_link ); $page->appendChild( $p ); } $page->appendChild( $session->render_ruler ); my $a = $session->make_element( "a", href=>$paraurl ); $page->appendChild( $session->html_phrase( "cgi/paracite:paracite_link", link=>$a )); $session->build_page( $title, $page, "paracite" ); $session->send_page(); return; }