# $Id: Endnote.pm,v 1.2 2007-01-26 13:53:47 mike Exp $ package Keystone::Resolver::plugins::Citation::Endnote; use strict; use warnings; # I haven't read a specification for Endnote citation format, so this # code will probably need refining. I am working entirely from a # single example that I captured from a 1CATE services menu, which is # stored at "../../../samples/citations/1kofkfks" sub citation { my $class = shift(); my($openurl) = @_; # Maps Endnote citations fields to OpenURL 1.0 referent fields. Where # the RHS begins with an asterisk, it's a special-case recipe. # my @map = ( TY => "*format", AU => "*author", TI => "atitle", JO => "jtitle", PY => "date", VL => "volume", IS => "issue", SN => "issn", UR => "*url", ### spage? ### epage? # ER => ??? Not given in the example, not sure what it is ); my $text = ""; while (@map) { my $key = shift @map; my $field = shift @map; my $val; if ($field =~ s/^\*//) { $val = _special($openurl, $field); } else { $val = $openurl->rft($field); } $val = "" if !defined $val; $text .= "$key - $val\n"; } return ("$text", "application/x-research-info-systems"); } sub _special { my($openurl, $special) = @_; if ($special eq "format") { my $format = $openurl->descriptor("rft")->superdata1("val_fmt"); # It should be something like "info:ofi/fmt:kev:mtx:journal" $format =~ s/.*://; return $format; } elsif ($special eq "author") { my $last = $openurl->rft("aulast"); return undef if !defined $last; my $first = $openurl->rft("aufirst"); if (!defined $first) { $first = $openurl->rft("auinit"); return $last if !defined $first; $first .= "." if $first !~ /\.$/; } return "$last, $first"; } elsif ($special eq "url") { return $openurl->v10url("svc_dat"); } return "[UNKNOWN SPECIAL $special]"; } 1;