#!/usr/bin/perl -w # # append_entries # # Appends entries from a source file to a destination file. Only regular # entries are copied; macro definitions, preambles, and comments are # dropped. User may supply a regex which the entry keys must match to be # appended. # # Note that a "real" entry appender/database merger would be a lot more # complicated than this! Some things that would have to be handled: # * enforcing the structure of input entries (eg. making sure they # conform to the rules of some database structure such as 'Bib') # * doing any other checks particular to your database, such as ensuring # that journal or conference names come from an approved list of # "known" journals and conferences (to enforce consistent naming # across a large database) # * detecting and resolving key collisions # * adding any preambles in the source file to the destination file # * checking for duplicate macro definitions # * ensuring that macros used in the source file are defined in # the destination file # # by Greg Ward, 1998/04/04 # # $Id: append_entries 3032 2006-09-21 20:05:55Z ambs $ # # Copyright (c) 1997-2000 by Gregory P. Ward. All rights reserved. This file # is part of the Text::BibTeX library. This library is free software; you # may redistribute it and/or modify it under the same terms as Perl itself. use strict; use Text::BibTeX; my $usage = <<USAGE; usage: $0 dest_file source_file [key_pattern] appends regular entries from <source_file> whose keys match <key_pattern> to <dest_file>; if <key_pattern> not supplied, all entries from <source_file> are taken USAGE die $usage unless @ARGV == 2 || @ARGV == 3; my ($dest_filename, $source_filename, $key_pattern) = @ARGV; # Open the two files: dest_file in append mode (ultimately just using # perl's builtin 'open'), and source_file in regular read-only mode. my $dest_file = new Text::BibTeX::File ">>$dest_filename" or die "couldn't open $dest_filename for appending: $!\n"; my $source_file = new Text::BibTeX::File $source_filename or die "couldn't open $source_filename: $!\n"; # Turn on 'value preservation' mode for the input file. This is mainly so # we don't lose the fact that macros are macros and numbers are numbers, # but it also frees us from having to worry about predefined macros # (such as the month names). $source_file->preserve_values (1); # And loop over all entries in the source file, optionally appending # each one to the destination file. while (my $entry = new Text::BibTeX::Entry $source_file) { # Skip this entry if it's not a regular entry -- that is, we just # drop '@string', '@comment', and '@preamble' entries, probably # unacceptable in the real world. next unless $entry->metatype == BTE_REGULAR; # Skip this entry if the user supplied a regex that keys must match # and this entry's key doesn't match. next if defined $key_pattern && $entry->key !~ /$key_pattern/o; # Otherwise, write this entry to the destination file. Since $dest_file # was opened in append mode, $entry will be appended to the end of # $dest_file. $entry->write ($dest_file); } # while $source_file