]> git.donarmstrong.com Git - bin.git/commitdiff
add start of bibtex to paper
authorDon Armstrong <don@donarmstrong.com>
Fri, 24 Jan 2014 02:51:26 +0000 (18:51 -0800)
committerDon Armstrong <don@donarmstrong.com>
Fri, 24 Jan 2014 02:51:26 +0000 (18:51 -0800)
bibtex_to_paper

index 7474ccbe6e252dc3e2a55caa7012395e456d1a48..f6ac661f841be1e76b9660732da9ae7763d4b9ef 100755 (executable)
@@ -13,7 +13,11 @@ use Getopt::Long;
 use Pod::Usage;
 
 use File::Find;
-use Text::Bibtex;
+use Text::BibTex;
+
+use DB_File;
+use MLDBM qw(DB_FILE Storable);
+use Fcntl qw/O_RDWR O_CREAT O_TRUNC/;
 
 =head1 NAME
 
@@ -101,12 +105,70 @@ if (not exists $options{bibtex} and
 pod2usage(join("\n",@USAGE_ERRORS)) if @USAGE_ERRORS;
 
 sub parse_bibtex_file {
-    
+    my ($file,$entries) = @_;
+
+    my $bibfile = Text::BibTex::File->new($file)
+        or die "Unable to open $bibfile for reading: $!";
+    my @entry_comments;
+    my $entry;
+    while ($entry = Text::BibTex::Entry->new($bibfile)) {
+        if ($entry->metatype() eq 'BTE_COMMENT') {
+            push @entry_comments,$entry->value();
+        } elsif ($entry->metatype() eq 'BTE_REGULAR') {
+            my $entry_key = $entry->key();
+            my $link_name;
+            if (defined $entry_key) {
+                # if there is a file comment, use it as the file name
+                for my $comment (@entry_comments) {
+                    next unless $comment =~ /^\s*file(?:name)?:?\s*(.+?)\s*$/i;
+                    $link_name = $1;
+                    last;
+                }
+                # if there is a file key, use that as the file name
+                # if there is a doi, then use that
+                # if there is a html, then use that
+                if (not defined $link_name) {
+                    my @possible_fields = $entry->get(qw(file doi html));
+                    for my $possible_field (@possible_fields) {
+                        if (defined $possible_field and length $possible_field) {
+                            $link_name = $possible_field;
+                            last;
+                        }
+                    }
+                }
+            }
+            if (not exists $entries->{$entry_key} or
+                defined $link_name;
+               ) {
+                $entries->{$entry_key} = $link_name
+            }
+            # reset the entry comments
+            @entry_comments = ();
+        } else {
+            # do nothing
+        }
+    }
 }
 
 
 sub initialize_database {
-    my 
+    my ($cache) = @_;
+    return open_cache($cache,1);
+}
+
+sub open_cache {
+    my ($cache,$initialize) @_;
+    my $open_flags = O_RDWR|O_CREAT;
+    if ($initialize) {
+        $open_flags = $open_flags | O_TRUNC;
+    }
+
+    my %entries;
+    tie %entries, MLDBM => $cache
+        $open_flags, 0666
+        or die "Unable to create create/truncate $cache: $!";
+    return \%entries;
 }
 
+
 __END__