diff options
Diffstat (limited to 'Master/texmf-dist')
18 files changed, 540 insertions, 199 deletions
diff --git a/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser.pm b/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser.pm index 8f0ab3a4c49..c7d7a75fc35 100644 --- a/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser.pm +++ b/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser.pm @@ -1,6 +1,6 @@ package BibTeX::Parser; { - $BibTeX::Parser::VERSION = '0.65'; + $BibTeX::Parser::VERSION = '0.66'; } # ABSTRACT: A pure perl BibTeX parser use warnings; @@ -208,6 +208,53 @@ sub _extract_bracketed } } +# Split the $string using $pattern as a delimiter with +# each part having balanced braces (so "{$pattern}" +# does NOT split). +# Return empty list if unmatched braces + +sub _split_braced_string { + my $string = shift; + my $pattern = shift; + my @tokens; + return () if $string eq ''; + my $buffer; + while (!defined pos $string || pos $string < length $string) { + if ( $string =~ /\G(.*?)(\{|$pattern)/cgi ) { + my $match = $1; + if ( $2 =~ /$pattern/i ) { + $buffer .= $match; + push @tokens, $buffer; + $buffer = ""; + } elsif ( $2 =~ /\{/ ) { + $buffer .= $match . "{"; + my $numbraces=1; + while ($numbraces !=0 && pos $string < length $string) { + my $symbol = substr($string, pos $string, 1); + $buffer .= $symbol; + if ($symbol eq '{') { + $numbraces ++; + } elsif ($symbol eq '}') { + $numbraces --; + } + pos($string) ++; + } + if ($numbraces != 0) { + return (); + } + } else { + $buffer .= $match; + } + } else { + $buffer .= substr $string, (pos $string || 0); + last; + } + } + push @tokens, $buffer if $buffer; + return @tokens; +} + + 1; # End of BibTeX::Parser @@ -220,7 +267,7 @@ BibTeX::Parser - A pure perl BibTeX parser =head1 VERSION -version 0.65 +version 0.66 =head1 SYNOPSIS @@ -279,7 +326,13 @@ Parameters: Returns the next parsed entry or undef. -=head2 SEE ALSO +=head1 NOTES + +The fields C<author> and C<editor> are canonized, see +L<BibTeX::Parser::Author> + + +=head1 SEE ALSO =over 4 @@ -295,11 +348,12 @@ L<BibTeX::Parser::Author> =head1 AUTHOR -Gerhard Gossen <gerhard.gossen@googlemail.com> +Gerhard Gossen <gerhard.gossen@googlemail.com> and +Boris Veytsman <boris@varphi.com> =head1 COPYRIGHT AND LICENSE -This software is copyright (c) 2013 by Gerhard Gossen. +This software is copyright (c) 2013-2015 by Gerhard Gossen and Boris Veytsman This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. diff --git a/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Author.pm b/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Author.pm index c358d245116..d7e84577e60 100644 --- a/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Author.pm +++ b/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Author.pm @@ -1,11 +1,14 @@ package BibTeX::Parser::Author; { - $BibTeX::Parser::Author::VERSION = '0.65'; + $BibTeX::Parser::Author::VERSION = '0.66'; } use warnings; use strict; +use BibTeX::Parser; + + use overload '""' => \&to_string; @@ -52,42 +55,124 @@ sub jr { } +# Take a string and create an array [first, von, last, jr] sub split { - my ($self_or_class, $name) = @_; + my ($self_or_class, $name) = @_; + + # remove whitespace at start and end of string + $name =~ s/^\s*(.*)\s*$/$1/s; + - # remove whitespace at start and end of string - $name =~ s/^\s*(.*)\s*$/$1/s; - if ( $name =~ /^\{\s*(.*)\s*\}$/ ) { - return (undef, undef, $1, undef); + if (!length($name)) { + return (undef, undef, undef, undef); + } + + my @comma_separated = + BibTeX::Parser::_split_braced_string($name, + '\s*,\s*'); + if (scalar(@comma_separated) == 0) { + # Error? + return (undef, undef, undef, undef); + } + + my $first=undef; + my $von=undef; + my $last=undef; + my $jr=undef; + + if (scalar(@comma_separated) == 1) { + # First von Last form + my @tokens = + BibTeX::Parser::_split_braced_string($name, '\s+'); + if (!scalar (@tokens)) { + return (undef, undef, undef, undef); + } + my ($start_von, $start_last) = _getStartVonLast (@tokens); + if ($start_von >0) { + $first = join(' ', splice(@tokens,0,$start_von)); } + if (($start_last-$start_von) >0) { + $von = join(' ', splice(@tokens,0,$start_last-$start_von)); + } + $last = join(' ',@tokens); + return ($first, $von, $last, $jr); + } + # Now we work with von Last, [Jr,] First form + if (scalar @comma_separated == 2) { # no jr + my @tokens= + BibTeX::Parser::_split_braced_string($comma_separated[1], '\s+'); + $first = join(' ', @tokens); + } else { # jr is present + my @tokens= + BibTeX::Parser::_split_braced_string($comma_separated[1], '\s+'); + $jr = join(' ', @tokens); + @tokens= + BibTeX::Parser::_split_braced_string($comma_separated[2], '\s+'); + $first = join(' ', @tokens); + } + my @tokens = + BibTeX::Parser::_split_braced_string($comma_separated[0], '\s+'); + my $start_last = _getStartLast(@tokens); + if ($start_last > 0) { + $von=join(' ', splice(@tokens,0,$start_last)); + } + $last = join(' ',@tokens); + return ($first, $von, $last, $jr); - if ( $name =~ /\{/ ) { - my @tokens; - my $cur_token = ''; - while ( scalar( $name =~ /\G \s* ( [^,\{]*? ) ( \s* , \s* | \{ | \s* $ ) /xgc ) ) { - $cur_token .= $1 if $1; - if ( $2 =~ /\{/ ) { - if ( scalar( $name =~ /\G([^\}]*)\}/gc ) ) { - $cur_token .= "{$1}"; - } else { - die "Unmatched brace in name '$name'"; - } - } else { - $cur_token =~ s/\s*$//; - push @tokens, $cur_token if $cur_token; - $cur_token = ''; - } - } - push @tokens, $cur_token if $cur_token; - return _get_single_author_from_tokens( @tokens ); - } else { - my @tokens = split /\s*,\s*/, $name; +} - return _get_single_author_from_tokens( @tokens ); - } +# Return the index of the first von element and the first lastname +# element. If no von element, von=last + +sub _getStartVonLast { + my $length=scalar(@_); + if ($length==1) { + return (0,0); + } + my $start_von=-1; + my $start_last=$length-1; + for (my $i=0; $i<$length; $i++) { + if (_is_von_token($_[$i])) { + $start_von=$i; + last; + } + } + if ($start_von== -1) { # no von part + return($length-1, $length-1); + } + if ($start_von== $length-1) { # all parts but last are upper case? + return($length-1, $length-1); + } + for (my $i=$start_von+1; $i<$length; $i++) { + if (!_is_von_token($_[$i])) { + $start_last=$i; + last; + } + } + return($start_von, $start_last); +} + + +# Return the index of the first lastname +# element provided no first name elements are present + +sub _getStartLast { + my $length=scalar(@_); + if ($length==1) { + return 0; + } + my $start_last=$length-1; + for (my $i=0; $i<$length; $i++) { + if (!_is_von_token($_[$i])) { + $start_last=$i; + last; + } + } + return $start_last; } + sub _split_name_parts { my $name = shift; @@ -172,6 +257,8 @@ sub _get_single_author_from_tokens { } + + sub to_string { my $self = shift; @@ -182,6 +269,39 @@ sub to_string { } } + +# Return 1 if the first letter on brace level 0 is lowercase +sub _is_von_token { + my $string = shift; + while ($string =~ + s/^(\\[[:alpha:]]+\{|\{|\\[[:^alpha:]]?|[[:^alpha:]])//) { + if ($1 eq '{' ) { + my $numbraces=1; + while ($numbraces !=0 && length($string)) { + my $symbol = substr($string, 0, 1); + if ($symbol eq '{') { + $numbraces ++; + } elsif ($symbol eq '}') { + $numbraces --; + } + $string = substr($string,1); + } + } + } + + if (length $string ) { + my $symbol = substr($string, 0, 1); + if (lc($symbol) eq $symbol) { + return 1; + } else { + return 0; + } + } else { + return 1; + } + +} + 1; # End of BibTeX::Entry __END__ @@ -219,7 +339,7 @@ BibTeX::Author - Contains a single author for a BibTeX document. =head1 VERSION -version 0.65 +version 0.66 =head1 FUNCTIONS @@ -252,13 +372,43 @@ with four strings, some of them possibly empty. Return string representation of the name. +=head1 NOTES + +BibTeX allows three representations of a person's name: + +=over 4 + +=item 1. + +First von Last + +=item 2. + +von Last, First + +=item 3. + +von Last, Jr, First + +=back + +The module always converts the first form to the second of third one +to allow simple string comparisons. + +The algorithm to determine the von part is the following: von part +consists of tokens where the first letter at brace level 0 is in lower case. +Anything in a "special characters" is on brace level 0. Thus the following +tokens are considered von parts: C<von>, C<\NOOP{von}Von>, and +the following token is not: C<{von}> + =head1 AUTHOR -Gerhard Gossen <gerhard.gossen@googlemail.com> +Gerhard Gossen <gerhard.gossen@googlemail.com> and +Boris Veytsman <boris@varphi.com> =head1 COPYRIGHT AND LICENSE -This software is copyright (c) 2013 by Gerhard Gossen. +This software is copyright (c) 2013--2015 by Gerhard Gossen and Boris Veytsman. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. diff --git a/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Entry.pm b/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Entry.pm index 6fb54a3972a..b10317c42b4 100644 --- a/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Entry.pm +++ b/Master/texmf-dist/scripts/bibtexperllibs/BibTeX/Parser/Entry.pm @@ -1,11 +1,12 @@ package BibTeX::Parser::Entry; { - $BibTeX::Parser::Entry::VERSION = '0.65'; + $BibTeX::Parser::Entry::VERSION = '0.66'; } use warnings; use strict; +use BibTeX::Parser; use BibTeX::Parser::Author; @@ -122,76 +123,44 @@ sub _handle_cleaned_author_editor { no LaTeX::ToUnicode; sub _handle_author_editor { - my $type = shift; - my $self = shift; - if (@_) { - if (@_ == 1) { #single string - # my @names = split /\s+and\s+/i, $_[0]; - my @names = _split_author_field( $_[0] ); - $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names]; - $self->field($type, join " and ", @{$self->{"_$type"}}); - } else { - $self->{"_$type"} = []; - foreach my $param (@_) { - if (ref $param eq "BibTeX::Author") { - push @{$self->{"_$type"}}, $param; - } else { - push @{$self->{"_$type"}}, new BibTeX::Parser::Author $param; - } - - $self->field($type, join " and ", @{$self->{"_$type"}}); - } - } + my $type = shift; + my $self = shift; + if (@_) { + if (@_ == 1) { #single string + # my @names = split /\s+and\s+/i, $_[0]; + $_[0] =~ s/^\s*//; + $_[0] =~ s/\s*$//; + my @names = BibTeX::Parser::_split_braced_string($_[0], + '\s+and\s+'); + if (!scalar @names) { + $self->error('Bad names in author/editor field'); + return; + } + $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names]; + $self->field($type, join " and ", @{$self->{"_$type"}}); } else { - unless ( defined $self->{"_$type"} ) { - #my @names = split /\s+and\s+/i, $self->{$type} || ""; - my @names = _split_author_field( $self->{$type} || "" ); - $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names]; - } - return @{$self->{"_$type"}}; - } -} - -# _split_author_field($field) -# -# Split an author field into different author names. -# Handles quoted names ({name}). -sub _split_author_field { - my $field = shift; - - return () if !defined $field || $field eq ''; - - my @names; - - my $buffer; - while (!defined pos $field || pos $field < length $field) { - if ( $field =~ /\G ( .*? ) ( \{ | \s+ and \s+ )/xcgi ) { - my $match = $1; - if ( $2 =~ /and/i ) { - $buffer .= $match; - push @names, $buffer; - $buffer = ""; - } elsif ( $2 =~ /\{/ ) { - $buffer .= $match . "{"; - if ( $field =~ /\G (.* \})/cgx ) { - $buffer .= $1; + $self->{"_$type"} = []; + foreach my $param (@_) { + if (ref $param eq "BibTeX::Author") { + push @{$self->{"_$type"}}, $param; } else { - die "Missing closing brace at " . substr( $field, pos $field, 10 ); + push @{$self->{"_$type"}}, new BibTeX::Parser::Author $param; } - } else { - $buffer .= $match; + + $self->field($type, join " and ", @{$self->{"_$type"}}); } - } else { - #print "# $field " . (pos ($field) || 0) . "\n"; - $buffer .= substr $field, (pos $field || 0); - last; } + } else { + unless ( defined $self->{"_$type"}) { + my @names = BibTeX::Parser::_split_braced_string($self->{$type} || "", '\s+and\s+' ); + $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names]; + } + return @{$self->{"_$type"}}; } - push @names, $buffer if $buffer; - return @names; } + sub author { _handle_author_editor('author', @_); } @@ -235,6 +204,26 @@ sub raw_bibtex { return $self->{_raw}; } +sub to_string { + my $self = shift; + my @fields = grep {!/^_/} keys %$self; + my $result = '@'.$self->type."{".$self->key.",\n"; + foreach my $field (@fields) { + my $value = $self->field($field); + if ($field eq 'author') { + my @names = ($self->author); + $value = join(' and ', @names); + } + if ($field eq 'editor') { + my @names = ($self->editors); + $value = join(' and ', @names); + } + $result .= " $field = {"."$value"."},\n"; + } + $result .= "}"; + return $result; +} + 1; # End of BibTeX::Entry __END__ @@ -246,7 +235,7 @@ BibTeX::Parser::Entry =head1 VERSION -version 0.65 +version 0.66 =head1 SYNOPSIS @@ -265,15 +254,19 @@ by a BibTeX::Parser. my @editors = $entry->editor; ... + + print $entry->to_string; } + + =head1 NAME -BibTeX::Entry - Contains a single entry of a BibTeX document. +BibTeX::Parser::Entry - Contains a single entry of a BibTeX document. =head1 VERSION -version 0.65 +version 0.66 =head1 FUNCTIONS @@ -333,7 +326,7 @@ or strings. Note: You can also change the authors with $entry->field('editor', $editors_string) -=head2 fieldlist() +=head2 fieldlist () Returns a list of all the fields used in this entry. @@ -341,17 +334,22 @@ Returns a list of all the fields used in this entry. Returns a true value if this entry has a value for $fieldname. -=head2 raw_bibtex +=head2 raw_bibtex () Return raw BibTeX entry (if available). +=head2 to_string () + +Returns a text of the BibTeX entry in BibTeX format + =head1 AUTHOR -Gerhard Gossen <gerhard.gossen@googlemail.com> +Gerhard Gossen <gerhard.gossen@googlemail.com> and +Boris Veytsman <boris@varphi.com> =head1 COPYRIGHT AND LICENSE -This software is copyright (c) 2013 by Gerhard Gossen. +This software is copyright (c) 2013-2015 by Gerhard Gossen and Boris Veytsman This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Changes b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Changes index 6aed797f987..57ba094ac68 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Changes +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Changes @@ -1,5 +1,10 @@ Revision history for BibTeX-Parser +0.66 2015-12-23 19:52:55-05:00 + Corrected bug 67419. + Added $entry->to_string function + No Do not remove braces from the authors' names + 0.65 2013-09-03 21:04:43 Add links in documentation. diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/MANIFEST b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/MANIFEST index b9b800a52e7..a08640964d6 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/MANIFEST +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/MANIFEST @@ -20,17 +20,23 @@ t/07-parse_englishbib.t t/08-parse_large.t t/09-complex.t t/10-funnyname.t +t/11-split_braced.t +t/12-von_token.t +t/13_output.t t/bibs/01.bib t/bibs/06.bib t/bibs/09-complex.bib t/bibs/10-funnyname.bib +t/bibs/braces.bib t/bibs/endnote.txt t/bibs/engineering_village.txt t/bibs/english.bib t/bibs/mathscinet.txt t/bug66325.t +t/bug67419.t t/cleaned_field.t t/pod-coverage.t t/pod.t t/release-pod-coverage.t t/release-pod-syntax.t +META.json Module JSON meta-data (added by MakeMaker) diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/META.yml b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/META.yml index c8bb09663ed..8cee4bb38eb 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/META.yml +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/META.yml @@ -1,22 +1,27 @@ --- abstract: 'A pure perl BibTeX parser' author: - - 'Gerhard Gossen <gerhard.gossen@googlemail.com>' + - 'Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com>' build_requires: - Test::More: 0.88 + Test::More: '0.88' configure_requires: - ExtUtils::MakeMaker: 6.30 -dynamic_config: 0 -generated_by: 'Dist::Zilla version 4.300037, CPAN::Meta::Converter version 2.120921' + ExtUtils::MakeMaker: '6.30' +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 7.1, CPAN::Meta::Converter version 2.150005' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html - version: 1.4 + version: '1.4' name: BibTeX-Parser +no_index: + directory: + - t + - inc requires: - File::Spec: 0 - IO::File: 0 - IO::String: 0 - LaTeX::ToUnicode: 0.02 - Test::More: 0 -version: 0.65 + File::Spec: '0' + IO::File: '0' + IO::String: '0' + LaTeX::ToUnicode: '0.02' + Test::More: '0' +version: '0.66' +x_serialization_backend: 'CPAN::Meta::YAML version 0.016' diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Makefile.PL b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Makefile.PL index bd0f7c0d16b..b800aa6f863 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Makefile.PL +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/Makefile.PL @@ -10,7 +10,7 @@ use ExtUtils::MakeMaker 6.30; my %WriteMakefileArgs = ( "ABSTRACT" => "A pure perl BibTeX parser", - "AUTHOR" => "Gerhard Gossen <gerhard.gossen\@googlemail.com>", + "AUTHOR" => "Gerhard Gossen <gerhard.gossen\@googlemail.com> and Boris Veytsman <boris\@varphi.com>", "BUILD_REQUIRES" => {}, "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => "6.30" @@ -29,7 +29,7 @@ my %WriteMakefileArgs = ( "TEST_REQUIRES" => { "Test::More" => "0.88" }, - "VERSION" => "0.65", + "VERSION" => "0.66", "test" => { "TESTS" => "t/*.t" } diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/README b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/README index 016740c5516..0960f8935e5 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/README +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/README @@ -1,13 +1,16 @@ This archive contains the distribution BibTeX-Parser, -version 0.65: +version 0.66: A pure perl BibTeX parser -This software is copyright (c) 2013 by Gerhard Gossen. +This software is copyright (c) 2013--2015 by Gerhard Gossen and Boris Veytsman This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. +Version 0.66 is the first version released by Boris Veytsman. +It has an important change: now braces in names are kept to +allow the proper output of the entries
\ No newline at end of file diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/dist.ini b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/dist.ini index 60d9924ad7a..5e435b528c2 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/dist.ini +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/dist.ini @@ -1,8 +1,8 @@ name = BibTeX-Parser -version = 0.65 -author = Gerhard Gossen <gerhard.gossen@googlemail.com> +version = 0.66 +author = Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> license = Perl_5 -copyright_holder = Gerhard Gossen +copyright_holder = Gerhard Gossen and Boris Veytsman [@Classic] diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t index 92597173a94..e4d0e1b18cc 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t @@ -1,61 +1,61 @@ -#!/usr/bin/perl -w - -use Test::More tests => 2; - -use IO::String; -use BibTeX::Parser; - -{ - my $string = q|@article{lin1973, - author = "Shen Lin and Brian W. Kernighan", - title = "An Effective Heuristic Algorithm for the Travelling-Salesman Problem", - journal = "Operations Research", - volume = 21, - year = 1973, - pages = "498--516" - }|; - my $fh = IO::String->new($string); - - my $parser = BibTeX::Parser->new( $fh ); - -#my @result = BibTeX::Parser->_parse($fh); - - my $entry = $parser->next; - - is_deeply($entry, {_type => 'ARTICLE', _key => 'lin1973', author => "Shen Lin and Brian W. Kernighan", - title => "An Effective Heuristic Algorithm for the Travelling-Salesman Problem", - journal => "Operations Research", - volume => 21, - year => 1973, - pages => "498--516", _parse_ok => 1, - _raw => $string}, "parse \@ARTICLE"); - -} -{ - my $string = q|@InProceedings{Herper:2001:MVS, - author = {Henry Herper}, - title = {{M}odellierung von {S}ystemen: ein - {A}pplikationsgebiet im {I}nformatikunterricht}, - booktitle = {Informatikunterricht und Medienbildung, INFOS 2001 - (9. Fachtagung Informatik und Schule, Paderborn - 17.-20- September 2001) -- Tagungsband}, - editor = {Reinhard Keil-Slavik and Johannes Magenheim}, - year = {2001}, -}|; - my $fh = IO::String->new($string); - - my $parser = BibTeX::Parser->new( $fh ); - - my $entry = $parser->next; - - is_deeply($entry, { - _type => 'INPROCEEDINGS', - _key => 'Herper:2001:MVS', - author => "Henry Herper", - title => "{M}odellierung von {S}ystemen: ein {A}pplikationsgebiet im {I}nformatikunterricht", - booktitle => "Informatikunterricht und Medienbildung, INFOS 2001 (9. Fachtagung Informatik und Schule, Paderborn 17.-20- September 2001) -- Tagungsband", - editor => "Reinhard Keil-Slavik and Johannes Magenheim", - year => 2001, - _parse_ok => 1, - _raw => $string}, "parse \@ARTICLE"); -} +#!/usr/bin/perl -w
+
+use Test::More tests => 2;
+
+use IO::String;
+use BibTeX::Parser;
+
+{
+ my $string = q|@article{lin1973,
+ author = "Shen Lin and Brian W. Kernighan",
+ title = "An Effective Heuristic Algorithm for the Travelling-Salesman Problem",
+ journal = "Operations Research",
+ volume = 21,
+ year = 1973,
+ pages = "498--516"
+ }|;
+ my $fh = IO::String->new($string);
+
+ my $parser = BibTeX::Parser->new( $fh );
+
+#my @result = BibTeX::Parser->_parse($fh);
+
+ my $entry = $parser->next;
+
+ is_deeply($entry, {_type => 'ARTICLE', _key => 'lin1973', author => "Shen Lin and Brian W. Kernighan",
+ title => "An Effective Heuristic Algorithm for the Travelling-Salesman Problem",
+ journal => "Operations Research",
+ volume => 21,
+ year => 1973,
+ pages => "498--516", _parse_ok => 1,
+ _raw => $string}, "parse \@ARTICLE");
+
+}
+{
+ my $string = q|@InProceedings{Herper:2001:MVS,
+ author = {Henry Herper},
+ title = {{M}odellierung von {S}ystemen: ein
+ {A}pplikationsgebiet im {I}nformatikunterricht},
+ booktitle = {Informatikunterricht und Medienbildung, INFOS 2001
+ (9. Fachtagung Informatik und Schule, Paderborn
+ 17.-20- September 2001) -- Tagungsband},
+ editor = {Reinhard Keil-Slavik and Johannes Magenheim},
+ year = {2001},
+}|;
+ my $fh = IO::String->new($string);
+
+ my $parser = BibTeX::Parser->new( $fh );
+
+ my $entry = $parser->next;
+
+ is_deeply($entry, {
+ _type => 'INPROCEEDINGS',
+ _key => 'Herper:2001:MVS',
+ author => "Henry Herper",
+ title => "{M}odellierung von {S}ystemen: ein {A}pplikationsgebiet im {I}nformatikunterricht",
+ booktitle => "Informatikunterricht und Medienbildung, INFOS 2001 (9. Fachtagung Informatik und Schule, Paderborn 17.-20- September 2001) -- Tagungsband",
+ editor => "Reinhard Keil-Slavik and Johannes Magenheim",
+ year => 2001,
+ _parse_ok => 1,
+ _raw => $string}, "parse \@ARTICLE");
+}
diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/05-author.t b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/05-author.t index cae7824099e..45bc5413df1 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/05-author.t +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/05-author.t @@ -26,7 +26,7 @@ my %names = ( " " => [undef, undef, undef, undef], "\n" => [undef, undef, undef, undef], "al." => [undef, undef, "al.", undef], - "et. al." => [undef, undef, "et. al.", undef], + "et.~al." => [undef, undef, "et.~al.", undef], "O'Malley, A." => ["A.", undef, "O'Malley", undef], "A. O'Malley" => ["A.", undef, "O'Malley", undef], "Arthur O'Malley" => ["Arthur", undef, "O'Malley", undef], @@ -36,9 +36,9 @@ my %names = ( 'L.M. M"uller' => ["L.M.", undef, 'M"uller', undef], 'M"uller, L.M.' => ["L.M.", undef, 'M"uller', undef], 'van Beethoven, Ludwig' => ["Ludwig", "van", "Beethoven", undef ], - '{Barnes and Noble, Inc.}' => [undef, undef, 'Barnes and Noble, Inc.', undef], - "Ludwigg {van Beethoven}" => ["Ludwigg", undef, "van Beethoven", undef], - '{van Beethoven}, Ludwig' => ["Ludwig", undef, "van Beethoven", undef ], + '{Barnes and Noble, Inc.}' => [undef, undef, '{Barnes and Noble, Inc.}', undef], + "Ludwigg {van Beethoven}" => ["Ludwigg", undef, "{van Beethoven}", undef], + '{van Beethoven}, Ludwig' => ["Ludwig", undef, "{van Beethoven}", undef ], ); plan tests => (keys(%names) * 6 + 5); diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t new file mode 100644 index 00000000000..85a29be86fd --- /dev/null +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t @@ -0,0 +1,28 @@ +#!/usr/bin/perl -w + +use Test::More tests => 12; + +use BibTeX::Parser; +use IO::File; + +my @tokens = BibTeX::Parser::_split_braced_string("a and b", '\s+and\s+'); +is(scalar @tokens,2); +is($tokens[0],'a'); +is($tokens[1],'b'); + +@tokens = BibTeX::Parser::_split_braced_string("a {and} b", '\s+and\s+'); +is(scalar @tokens,1); +is($tokens[0],'a {and} b'); + +@tokens = BibTeX::Parser::_split_braced_string("a {and b", '\s+and\s+'); +is(scalar @tokens,0); + +@tokens = BibTeX::Parser::_split_braced_string("} a {", '\s+'); +is(scalar @tokens,0); + +@tokens = BibTeX::Parser::_split_braced_string("{a b} c {d}e u", '\s+'); +is(scalar @tokens,4); +is($tokens[0],'{a b}'); +is($tokens[1],'c'); +is($tokens[2],'{d}e'); +is($tokens[3],'u'); diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t new file mode 100644 index 00000000000..6daceafa960 --- /dev/null +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t @@ -0,0 +1,12 @@ +#!/usr/bin/perl -w + +use Test::More tests => 5; + +use BibTeX::Parser::Author; +use IO::File; + +is(BibTeX::Parser::Author::_is_von_token('von'),1); +is(BibTeX::Parser::Author::_is_von_token('Von'),0); +is(BibTeX::Parser::Author::_is_von_token('\noop{von}Von'),1); +is(BibTeX::Parser::Author::_is_von_token('\noop{Von}von'),0); +is(BibTeX::Parser::Author::_is_von_token('\noop{AE}{\AE}schylus'),0); diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/13_output.t b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/13_output.t new file mode 100644 index 00000000000..2d2e1ebfd36 --- /dev/null +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/13_output.t @@ -0,0 +1,27 @@ +#!/usr/bin/perl -w + +use Test::More; + +use BibTeX::Parser; +use IO::File; + + +my $fh = new IO::File "t/bibs/01.bib", "r" ; + +my $parser = new BibTeX::Parser $fh; + + +while (my $entry = $parser->next) { + if($entry->key eq 'key01') { + my $result='@ARTICLE{key01, + month = {January~1}, + title = {Title text}, + author = {Duck, Donald and Else, Someone}, + year = {1950}, +}'; + is($entry->to_string,$result); + } + +} + +done_testing(); diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib new file mode 100644 index 00000000000..3791fb57604 --- /dev/null +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib @@ -0,0 +1,21 @@ +@Article{scholkopf98kpca, + author = {Bernhard {Sch\"olkopf} and Alex Smola and K.R. Muller}, + title = {Nonlinear component analysis as a kernel eigenvalue +problem}, + journal = {Neural Computation}, + year = {1998}, + volume = {10}, + pages = {1299--1319} +} + +@article{brownetal93, + author = {Peter F. Brown and Stephen A. {Della Pietra} and + Vincent J. {Della Pietra} and Robert~L. Mercer}, + title = {The Mathematics of Statistical Machine Translation: + Parameter Estimation}, + journal = {Computational Linguistics}, + year = 1993, + volume = 19, + number = 2, + pages = {263-311} +} diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib index 6893e1e4111..eda85e24d05 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib @@ -1,4 +1,4 @@ -$Id: english.bib,v 1.1.1.1 2015/10/25 01:25:20 boris Exp $ +$Id: english.bib,v 1.2 2015/12/24 18:46:53 boris Exp $ Please notify Adrian F Clark <alien@uk.ac.essex.ese> of any additions or corrections to this list. diff --git a/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t new file mode 100644 index 00000000000..0f944f373a9 --- /dev/null +++ b/Master/texmf-dist/source/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t @@ -0,0 +1,29 @@ +#!/usr/bin/perl -w + +use Test::More; + +use BibTeX::Parser; +use IO::File; + +my $fh = new IO::File "t/bibs/braces.bib", "r" ; +my $parser = new BibTeX::Parser $fh; +while (my $entry=$parser->next) { + is($entry->parse_ok,1); + if ($entry->key eq 'scholkopf98kpca') { + @authors=$entry->author; + is(scalar @authors,3); + is("$authors[0]", '{Sch\"olkopf}, Bernhard'); + is("$authors[1]", 'Smola, Alex'); + is("$authors[2]", 'Muller, K.R.'); + } + if ($entry->key eq 'brownetal93') { + @authors=$entry->author; + is(scalar @authors,4); + is("$authors[0]", 'Brown, Peter F.'); + is("$authors[1]", '{Della Pietra}, Stephen A.'); + is("$authors[2]", '{Della Pietra}, Vincent J.'); + is("$authors[3]", 'Mercer, Robert~L.'); + } +} + +done_testing(); diff --git a/Master/texmf-dist/source/support/bibtexperllibs/README b/Master/texmf-dist/source/support/bibtexperllibs/README index 9915b70105a..6266323fb8f 100644 --- a/Master/texmf-dist/source/support/bibtexperllibs/README +++ b/Master/texmf-dist/source/support/bibtexperllibs/README @@ -1,13 +1,16 @@ BibTeX Perl Libs - Version 0.1 - Gerhard Gossen + Version 0.2 + Gerhard Gossen and Boris Veytsman This package provides BibTeX related Perl libraries by Gerhard Gossen, -repacked by Boris Veytsman, boris@varphi.com, for TeXLive and other -TDS-compliant distributions. The libraries are written in pure -Perl, so shoud work out of the box on any architecture. They are packaged -mostly for Boris Veytsman's BibTeX suite, but can be used in any -other Perl script. +maintained and repacked by Boris Veytsman, boris@varphi.com, for +TeXLive and other TDS-compliant distributions. The libraries are +written in pure Perl, so shoud work out of the box on any +architecture. To use them in your scripts, add to the @INC variable the directory -scripts/bibtexperllibs in your TeX distribution. +scripts/bibtexperllibs inside your TeX distribution. + +Changes: + + version 0.2 New upstream version for BibTeX::Parser (0.66) |