Bundle-PBib

 view release on metacpan or  search on metacpan

lib/Biblio/Bibtex.pm  view on Meta::CPAN


sub queryPapers ($, $, $, $) {
# query papers, look in $queryFields for $pattern
  my $self = shift;
  my ($pattern, $queryFields, $resultFields, $ignoreCase) = @_;
  $ignoreCase = 1 if not defined($ignoreCase);
  $pattern = lc($pattern) if($ignoreCase);
  $resultFields = $self->allPaperFields() unless defined($resultFields);
  $queryFields = $resultFields if not defined($queryFields);
  my $sql = 'SELECT ' . join(', ', map(quoteField($_), @{$resultFields})) .
	' FROM "biblio" WHERE ' .
	join(' OR ',
	  map('(' . quoteField($_, $ignoreCase) . " LIKE '$pattern')", @{$queryFields}));
  print "$sql\n";
  my $papers = $self->query($sql) or
    die "$DBI::errstr\nSelect failed for $sql\n";
  return $self->papersArrayToHash($resultFields, $papers);
}

sub queryPaperWithId ($, $) {
  my ($self, $id) = @_;
  my $resultFields = $self->allPaperFields();
  my $sql = 'SELECT ' . join(', ', map(quoteField($_, 0), @{$resultFields})) .
	' FROM "biblio" WHERE ' . quoteField("PaperID") . " = '$id'";
  print "$sql\n";
  my $papers = $self->query($sql) or
    die "$DBI::errstr\nSelect failed for $sql\n";
  return $self->papersArrayToHash($resultFields, $papers)->[0];
}




#
#
# shortcut access methods
#
#

sub shortcuts { my $self = shift; return $self->{'shortcuts'}; }

sub replaceShortcuts {
# look in $text and replace all shortcuts
  my ($self, $text) = @_;
  my $shortcuts = $self->shortcuts();
  my $pattern = join("|", map( /:$/ ? "$_.*" : $_, (keys(%{$shortcuts}))));
#print $pattern;
  $text =~ s/\{($pattern)\}/ expandShortcut($shortcuts, $1) /ge;
  return $text;
}
sub expandShortcut {
  my ($shortcuts, $text) = @_;
  my @pars = split(/:/, $text);
  my $k = shift @pars; if( @pars ) { $k = "$k:"; }
  my $v = $shortcuts->{$k};
  $v =~ s/%(\d)/ @pars[$1-1] /ge;
  return $v;
#  return $shortcuts->{$text};
}

#sub updateShortcuts {
#  my ($self) = @_;
#  delete $self->{'shortcuts'};
#}


#
#
# save methods
#
#

sub write {
  my ($self, $filename) = @_;
  $filename = $self->filename() unless defined($filename);
  return unless defined($filename);
  my $fh = new FileHandle("> $filename");
  if( not defined($fh) ) {
    print STDERR "Can't open $filename for writing.\n";
    return;
  }
  print STDERR "write bibtex db to $filename\n";
  $self->writeHeader($fh);
  $self->writePapers($fh);
  $fh->close();
}

sub writeHeader { my ($self, $fh) = @_;
  print $fh "%% bibtex database, written by pbib\n\n";
}

sub writePapers { my ($self, $fh) = @_;
  my @ids = $self->getPaperIDs();
  my $type; my $paper;
  my $p; foreach $p (sort(@ids)) {
    $paper = $self->paper($p);
    $type = typename($paper->{'Type'});
    print $fh "\@$type \{$p,\n";
    my $e; foreach $e (sort(keys(%{$paper}))) {
      if( defined($paper->{$e}) ) {
        print $fh "  ", $self->quoteEntry($e), " = ",
		$self->quoteValue($paper->{$e}), ",\n";
      }
    }
    print $fh "\}\n\n";
  }
}

sub quoteEntry { my ($self, $entry) = @_;
# I guess, I'm using bibtex names!?
  if( exists($entry_names{$entry}) ) {
    $entry = $entry_names{$entry};
  }
  return lc($entry);
}

sub quoteValue { my ($self, $text) = @_;
# not quite advanced yet ...
  return "\"$text\"";
}



( run in 0.841 second using v1.01-cache-2.11-cpan-f889d44b568 )