biblist-dot (1008B)
1 #!/usr/bin/env perl 2 use strict; 3 use warnings; 4 use Text::BibTeX; 5 6 my ($src) = @ARGV; 7 my $bib = $ENV{BIB} or die "BIB is not set\n"; 8 -f $bib or die "No BIB=$bib\n"; 9 10 my $bibfile = Text::BibTeX::File->new($bib); 11 12 print "digraph G {\n"; 13 print "rankdir = RL\n"; 14 15 my %entry; 16 while (my $e = Text::BibTeX::Entry->new($bibfile)) { 17 next unless $e->parse_ok; 18 next unless $e->metatype eq BTE_REGULAR; 19 20 my $key = $e->key; 21 22 $entry{$key} = { 23 author => $e->get("author") // "", 24 title => $e->get("title") // "", 25 year => $e->get("year") // "", 26 localrefs => $e->get("localrefs") // "", 27 }; 28 } 29 30 die "key not found: $src\n" unless exists $entry{$src}; 31 32 my %seen; 33 my @stack = ($src); 34 35 while (@stack) { 36 my $u = pop @stack; 37 next if $seen{$u}++; 38 39 my %localrefs = $entry{$u}{localrefs} =~ /\s*([^=]+)=(\S+)\s*/g; 40 while (my ($k, $v) = each %localrefs) { 41 print " $u -> $v [label=\"$k\"]\n"; 42 push @stack, $v; 43 } 44 } 45 print "}\n";