=pod =head1 FILE FORMAT From L<Text::Refer>: The bibliographic database is a text file consisting of records separated by one or more blank lines. Within each record fields start with a % at the beginning of a line. Each field has a one character name that immediately follows the %. The name of the field should be followed by exactly one space, and then by the contents of the field. =head2 Supported Fields EPrints mappings shown in B<bold>, =over 8 =item 0 (the digit zero) Citation Type. Supported types: =over 8 =item Book B<book> =item Book Section B<book_section> =item Conference Paper B<conference_item> =item Conference Proceedings B<book> =item Edited Book B<book> =item Electronic Article B<article> =item Electronic Book B<book> =item Journal Article B<article> =item Magazine Article B<article> =item Newspaper Article B<article> =item Patent B<patent> =item Report B<monograph> =item Thesis B<thesis> =back B<NOTE:> For the Conference Paper type, the C<pres_type> field is set to C<paper>. =item D Year B<date> =item J Journal (Journal Article only) B<publication> =item K Keywords B<keywords> =item T Title B<title> =item U URL B<official_url> =item X Abstract B<abstract> =item Z Notes B<note> B<NOTE:> Use of Z field for Image data not supported =item 9 =over 8 =item Type of Article (Journal Article, Newspaper Article, Magazine Article) =item Thesis Type (Thesis) B<thesis_type> =item Report Type (Report) B<monograph_type> =item Patent Type (Patent) =item Type of Medium (Electronic Book) =back B<NOTE:> You may need to define your own regexps to munge this free text field into the values accepted by B<thesis_type> and B<monograph_type>. =item A =over 8 =item Inventor (Patent) B<creators_name> =item Editor (Edited Book) B<editors_name> =item Reporter (Newspaper Article) B<creators_name> =item Author (Other Types) B<creators_name> =back B<FORMAT:> Lastname, Firstname, Lineage =item B =over 8 =item Series Title (Edited Book, Book, Report) B<series> =item Academic Department (Thesis) B<department> =item Newspaper (Newspaper Article) B<publication> =item Magazine (Magazine Article) B<publication> =item Book Title (Book Section) B<book_title> =item Conference Name (Conference Paper, Conference Proceedings) B<event_title> =item Periodical Title (Electronic Article) B<publication> =item Secondary Title (Electronic Book) =back =item C =over 8 =item Country (Patent) =item Conference Location (Conference Paper, Conference Proceedings) B<event_location> =item City (Other Types) B<place_of_pub> =back =item E =over 8 =item Series Editor (Report, Book, Edited Book) =item Issuing Organisation (Patent) B<institution> =item Editor (Other Types) B<editors_name> =back B<FORMAT:> Lastname, Firstname, Lineage =item I =over 8 =item University (Thesis) B<institution> =item Institution (Report) B<institution> =item Assignee (Patent) =item Publisher (Other Types) B<publisher> =back =item N =over 8 =item Application Number (Patent) =item Issue (Other Types) B<number> =back =item P =over 8 =item Number of Pages (Book, Thesis, Edited Book) B<pages> =item Pages (Other Types) B<pagerange> =back =item S =over 8 =item Series Title (Book Section, Conference Proceedings) B<series> =item International Author (Patent) =back =item V =over 8 =item Degree (Thesis) =item Patent Version Number (Patent) =item Volume (Other Types) B<volume> =back =item @ =over 8 =item ISSN (Journal Article, Newspaper Article, Magazine Article, Electronic Article) B<issn> =item ISBN (Book, Book Section, Edited Book, Conference Proceedings, Electronic Book) B<isbn> =item Report Number (Report) B<id_number> =item Patent Number (Patent) B<id_number> =back =back =head2 Unsupported Fields =over 8 =item 2 Issue Date (Patent) =item 3 Designated States (Patent) =item 4 Attorney/Agent (Patent) =item 6 Number of Volumes =item 7 International Patent Classification (Patent), Edition (Other Types) =item 8 Date Accessed (Electronic Article, Electronic Book), Date (Other Types) =item F Label =item G Language =item H Translated Author =item L Call Number =item M Accession Number =item O Alternate Journal (Journal Article), Alternate Magazine (Magazine Article), Alternate Title (Other Types) =item Q Translated Title =item R Electronic Resource Number =item W Database Provider =item Y Advisor (Thesis), Series Editor (Book Section, Conference Proceedings), International Title (Patent) =item [ Access Date =item + Inventor Address (Patent), Author Address =item ^ Caption =item = Last Modified Date =item $ Legal Status (Patent) =item > Link to PDF =item ~ Name of Database =item ( Priority Number (Patent), Original Publication (Other Types) =item ) Reprint Edition =item < Research Notes =item * Reviewed Item =item & Section (Newspaper Article), International Patent Number (Patent) =item ! Short Title =item # References (Patent) =item ? Sponsor (Conference Proceedings), Translator (Other Types) =back =head1 ENDNOTE 8 SUPPORT Endnote 8 appears to add Byte Order Marks to the beginning of its exported files. To import these files you need to install the L<File::BOM> module from CPAN. If this module is detected EPrints will automatically handle BOM (you will need to restart your web server if importing via CGI). =head1 CRLF (WINDOWS) SUPPORT EPrints will correctly handle CRLF formatted text files, if you are using Perl 5.8 or later. Otherwise use the dos2unix tool to convert your files. =head1 SEE ALSO L<Text::Refer>, L<XML::Writer>, L<EPrints::Plugin::Export::EndNote> =cut package EPrints::Plugin::Import::EndNote; use EPrints::Plugin::Import::TextFile; use strict; our @ISA = qw/ EPrints::Plugin::Import::TextFile /; sub new { my( $class, %params ) = @_; my $self = $class->SUPER::new( %params ); $self->{name} = "EndNote"; $self->{visible} = "all"; $self->{produce} = [ 'list/eprint', 'dataobj/eprint' ]; my $rc = EPrints::Utils::require_if_exists("Text::Refer"); unless( $rc ) { $self->{visible} = ""; $self->{error} = "Failed to load required module Text::Refer"; } return $self; } sub input_fh { my( $plugin, %opts ) = @_; my $parser = Text::Refer::Parser->new( LeadWhite => 'KEEP', NewLine => "TOSPACE", ForgiveEOF => 1); my @ids; my $fh = $opts{fh}; while (my $input_data = $parser->input( $fh ) ) { my $epdata = $plugin->convert_input( $input_data ); next unless( defined $epdata ); my $dataobj = $plugin->epdata_to_dataobj( $opts{dataset}, $epdata ); if( defined $dataobj ) { push @ids, $dataobj->get_id; } } return EPrints::List->new( dataset => $opts{dataset}, session => $plugin->{session}, ids=>\@ids ); } sub convert_input { my ( $plugin, $input_data ) = @_; my $epdata = {}; # 0 Citation type my $input_data_type = $input_data->get( "0" ) || ""; $epdata->{type} = "article" if $input_data_type =~ /Article/; $epdata->{type} = "book" if $input_data_type =~ /Book/ || $input_data_type eq "Conference Proceedings"; $epdata->{type} = "book_section" if $input_data_type eq "Book Section"; if( $input_data_type eq "Conference Paper" ) { $epdata->{type} = "conference_item"; $epdata->{pres_type} = "paper"; } $epdata->{type} = "monograph" if $input_data_type eq "Report"; $epdata->{type} = "patent" if $input_data_type eq "Patent"; $epdata->{type} = "thesis" if $input_data_type eq "Thesis"; if( !defined $epdata->{type} ) { $plugin->warning( $plugin->phrase( "unsupported_cite_type", type => $input_data_type ) ); return undef; } # D Year $epdata->{date} = $input_data->date if defined $input_data->date; # J Journal $epdata->{publication} = $input_data->journal if defined $input_data->journal && $input_data_type eq "Journal Article"; # K Keywords $epdata->{keywords} = $input_data->keywords if defined $input_data->keywords; # T Title $epdata->{title} = $input_data->title if defined $input_data->title; # U URL $epdata->{official_url} = $input_data->get( "U" ) if defined $input_data->get( "U" ); # X Abstract $epdata->{abstract} = $input_data->abstract if defined $input_data->abstract; # Z Notes $epdata->{note} = $input_data->get( "Z" ) if defined $input_data->get( "Z" ); # 9 Thesis Type, Report Type if( defined $input_data->get( "9" ) ) { my $type = $input_data->get( "9" ); if( $input_data_type eq "Thesis" ) { $epdata->{thesis_type} = "phd" if $type =~ /ph\.?d/i; $epdata->{thesis_type} = "masters" if $type =~ /master/i; } elsif( $input_data_type eq "Report" ) { $epdata->{monograph_type} = "technical_report" if $type =~ /tech/i; $epdata->{monograph_type} = "project_report" if $type =~ /proj/i; $epdata->{monograph_type} = "documentation" if $type =~ /doc/i; $epdata->{monograph_type} = "manual" if $type =~ /manual/i; } } # A Editor (Edited Book), Author (Other Types) for ( $input_data->author ) { # Author's names should be in Lastname, Firstname format if( /^(.*?),(.*?)(,(.*?))?$/ ) { if( $input_data_type eq "Edited Book" ) { push @{$epdata->{editors_name}}, { family => $1, given => $2, lineage => $4 }; } else { push @{$epdata->{creators_name}}, { family => $1, given => $2, lineage => $4 }; } } else { $plugin->warning( $plugin->phrase( "bad_author", author => $_ ) ); } } # B Conference Name, Department (Thesis), Newspaper, Magazine, Series (Book, Edited Book, Report), Book Title (Book Section) if( defined $input_data->book ) { if( $input_data_type eq "Conference Paper" || $input_data_type eq "Conference Proceedings" ) { $epdata->{event_title} = $input_data->book; } elsif( $input_data_type eq "Thesis" ) { $epdata->{department} = $input_data->book; } elsif( $input_data_type eq "Newspaper Article" || $input_data_type eq "Magazine Article" || $input_data_type eq "Electronic Article" ) { $epdata->{publication} = $input_data->book; } elsif( $input_data_type eq "Book" || $input_data_type eq "Edited Book" || $input_data_type eq "Report" ) { $epdata->{series} = $input_data->book; } elsif( $input_data_type eq "Book Section" ) { $epdata->{book_title} = $input_data->book; } } # C Conference Location, Country (Patent), City (Other Types) if( defined $input_data->city ) { if( $input_data_type eq "Conference Paper" || $input_data_type eq "Conference Proceedings" ) { $epdata->{event_location} = $input_data->city; } elsif( $input_data_type eq "Patent" ) { # Unsupported } else { $epdata->{place_of_pub} = $input_data->city; } } # E Issuing Organisation (Patent), Series Editor (Book, Edited Book, Report), Editor (Other Types) for ( $input_data->editor ) { if( $input_data_type eq "Patent" ) { $epdata->{institution} = $_; } # Editor's names should be in Lastname, Firstname format elsif( /^(.*?),(.*?)(,(.*?))?$/ ) { if( $input_data_type eq "Book" || $input_data_type eq "Edited Book" || $input_data_type eq "Report" ) { # Unsupported } else { push @{$epdata->{editors_name}}, { family => $1, given => $2, lineage => $4 }; } } else { $plugin->warning( $plugin->phrase( "bad_editor", editor => $_ ) ); } } # I Institution (Report), University (Thesis), Assignee (Patent), Publisher (Other Types) if( defined $input_data->publisher ) { if( $input_data_type eq "Report" || $input_data_type eq "Thesis" ) { $epdata->{institution} = $input_data->publisher; } elsif( $input_data_type eq "Patent" ) { # Unsupported } else { $epdata->{publisher} = $input_data->publisher; } } # N Application Number (Patent), Issue (Other Types) if( defined $input_data->number ) { if( $input_data_type eq "Patent" ) { # Unsupported } else { $epdata->{number} = $input_data->number; } } # P Number of Pages (Book, Edited Book, Thesis), Pages (Other Types) if( defined $input_data->page ) { if( $input_data_type eq "Book" || $input_data_type eq "Edited Book" || $input_data_type eq "Thesis" ) { $epdata->{pages} = $input_data->page; } else { $epdata->{pagerange} = $input_data->page; } } # S Series (Book Section, Conference Proceedings) if( defined $input_data->series ) { if( $input_data_type eq "Book Section" || $input_data_type eq "Conference Proceedings" ) { $epdata->{series} = $input_data->series; } } # V Patent Version Number, Degree (Thesis), Volume (Other Types) if( defined $input_data->volume ) { if( $input_data_type eq "Patent" ) { # Unsupported } elsif( $input_data_type eq "Thesis" ) { # Unsupported } else { $epdata->{volume} = $input_data->volume; } } # @ ISSN (Journal Article, Newspaper Article, Magazine Article), # Patent Number, Report Number, # ISBN (Book, Edited Book, Book Section, Conference Proceedings) if( defined $input_data->get( "@" ) ) { if( $input_data_type =~ /Article/ ) { $epdata->{issn} = $input_data->get( "@" ); } elsif( $input_data_type eq "Patent" || $input_data_type eq "Report" ) { $epdata->{id_number} = $input_data->get( "@" ); } elsif( $input_data_type =~ /Book/ || $input_data_type eq "Conference Proceedings" ) { $epdata->{isbn} = $input_data->get( "@" ); } } return $epdata; } 1;