#!/usr/local/bin/perl -w use strict; use Text::BibTeX; use Getopt::Tabular; # ---------------------------------------------------------------------- # Command-line options and option table my @select; # list of citation keys my $markup = 'latex'; my $open_bib = 0; # Default markups -- should be customizable my %markup = (pre_entry => { latex => '\bibitem{%KEY%}' . "\n", latex2e => '\bibitem{%KEY%}' . "\n", html => '"[%LABEL%]"' }, inter_block => { latex => "\n\\newblock ", latex2e => "\n\\newblock ", html => $open_bib ? "
\n" : " " }, atitle => { latex => ['{\em ', '}'], latex2e => ['\emph{', '}'], html => ['', ''] }, btitle => { latex => ['{\em ', '}'], latex2e => ['\emph{', '}'], html => ['', ''] }, journal => { latex => ['{\em ', '}'], latex2e => ['\emph{', '}'], html => ['', ''] }, ); my @opt_table = (['-select', 'call', undef, sub { &get_list_arg (@_, \@select) }, 'list of entries to format (selected by citation key)', 'key1 ...'], ['-latex', 'const', 'latex', \$markup, 'add LaTeX 2.09 markup to the bibliography entries'], ['-latex2e', 'const', 'latex2e', \$markup, 'add LaTeX 2e markup to the bibliography entries'], ['-html', 'const', 'html', \$markup, 'add HTML markup to the bibliography entries'], ['-openbib|-closedbib', 'boolean', 0, \$open_bib, 'use "open" bibliography format'], ); # ---------------------------------------------------------------------- # Main program # First, parse the command line and make sure there's exactly one # argument (the .bib file to format) left. my $usage = "usage: btformat [options] bibfile\n"; Getopt::Tabular::SetHelp ($usage, undef); GetOptions (\@opt_table, \@ARGV) || exit 1; die "$usage\nIncorrect number of arguments\n" unless (@ARGV == 1); # OK, we're happy with the command-line -- let's start working for real my ($filename, $bibfile, $entry, %select); $filename = shift; $bibfile = new Text::BibTeX::File $filename or die "$filename: $!\n"; $bibfile->set_structure ('Bib', namestyle => 'nopunct', nameorder => 'first'); %select = map { ($_ => 1) } @select if @select; my $entry_num = 0; while ($entry = new Text::BibTeX::Entry $bibfile) { next unless $entry->parse_ok && $entry->metatype == BTE_REGULAR; next if (@select && ! $select{$entry->key}); $entry_num++; # printf "formatting entry >%s<\n", $entry->key; my (@blocks, $block, $sentence); @blocks = $entry->format; @blocks = grep ($_, @blocks); # strip empty blocks BLOCK: for $block (@blocks) { SENTENCE: for $sentence (@$block) { # If sentence has multiple clauses, process them: first, strip # out empties, and jump to the next sentence if it turns out # this one is empty (ie. just a bunch of empty clauses). Then # join the left-over clauses with commas. if (ref $sentence eq 'ARRAY') { @$sentence = grep ($_, @$sentence); ($sentence = '', next SENTENCE) unless @$sentence; $sentence = join (', ', @$sentence); } # finish sentence with a period if it's not already punctuated $sentence .= '.' unless $sentence eq '' || $sentence =~ /[.!?]$/; } # Now join together all the sentences in the block, first stripping # any empties. @$block = grep ($_, @$block); next BLOCK unless @$block; $block = join (' ', @$block); # put the sentences together } if (@blocks) { my ($key, $label, $header, $f_entry, $footer); $key = $entry->key; $label = $entry_num; # for now! $header = $markup{pre_entry}{$markup}; $header =~ s/%KEY%/$key/g; $header =~ s/%LABEL%/$label/g; $f_entry = join ($markup{inter_block}{$markup}, @blocks); print $header; print $f_entry; print "\n\n"; } }