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 )