Bundle-PBib
view release on metacpan or search on metacpan
lib/PBib/ReferenceConverter.pm view on Meta::CPAN
sub toDoItems { my $self = shift;
$self->{'todo'} = [] unless defined($self->{'todo'});
return $self->{'todo'};
}
sub addToDoItem { my ($self, $text, %keys) = @_;
$self->logMessage("todo: $text\n");
my $todo = $self->toDoItems();
push @$todo, {'text' => $text, 'par' => $self->currentParagraph(), %keys};
}
sub processToDoItem { my ($self, $text) = @_;
# remove todo delimiters of the form:
$text =~ s/(?:^[#<]+\s*)|(?:\s*[#>]+$)//g;
$self->addToDoItem($text);
return $self->outDoc()->highlight(
$self->outDoc()->quote("<<$text>>"));
}
sub unquote {
my ($self, $text) = @_;
$text = $self->inDoc()->unquote($text);
$text =~ s/\c//g;
return $text;
}
sub quote {
my ($self, $text) = @_;
$text = $self->outDoc()->quote($text);
return $text;
}
#
#
# reference entry access methods
#
#
sub entries {
#
# return the entries for a given reference ID
#
my ($self, $refID) = @_;
my $ref = $self->refs()->{$refID};
if( $ref ) {
#print Dumper $ref if $refID eq "Phidgets-PhysicalWidgets";
#print Dumper $ref if $refID eq 'iRoom-PointRight';
if( exists $ref->{'CrossRef'} ) {
$self->expandCrossRef($ref);
}
} else {
$self->warn("Can't find CiteKey $refID");
}
return $ref;
}
sub entry { my ($self, $refID, $entry, $check) = @_;
my $e = $self->entries($refID)->{$entry};
#
# I could include a return-once-only check, i.e.
# if called a second time, it will return ().
# this could make the writing of some style a lot
# easier, I guess ...
#
if( !$e ) {
if( $check ) {
$self->warn("entry '$entry' not defined in $refID");
return "{\\b \\i <<$entry missing>>}" if
$self->refOptions()->{'debug-undef-entries'};
}
return ();
}
if( $e eq '{}' ) {
return ();
}
return defined($e) && $e ne '' ? $e : ();
}
sub entryExists { my ($self, $refID, $entry) = @_;
return exists($self->entries($refID)->{$entry});
}
sub entryNotEmpty { my ($self, $refID, $entry) = @_;
my $e = $self->entries($refID)->{$entry};
return defined($e) && $e ne '';
}
# when expanding crossref, move data among fields, e.g.
# the Title of a book will be the SuperTitle of a incollection
my %crossRefFields = qw(
Title SuperTitle
);
# when expanding crossref, adapt the CiteType of the reference
# e.g. a part of a proceedings will be inproceedings
# or an "article" is a part of a "journal".
my %crossRefTypes = qw(
book incollection
proceedings inproceedings
journal article
);
sub expandCrossRef {
#
# support for CrossRef entry: get all referenced field values
#
my ($self, $ref) = @_;
if( exists $ref->{'CrossRef__expanded__'} ) { return $ref; }
$self->traceMessage("expand crossref $ref->{'CiteKey'} --> $ref->{'CrossRef'}");
foreach my $xrefID (split(/,/, $ref->{'CrossRef'})) {
my $xref = $self->entries($xrefID);
# adapt CiteType
if( ! defined($ref->{'CiteType'}) && defined($xref->{'CiteType'}) ) {
# print STDERR Dumper({'ref', $ref, 'xref', $xref});
$ref->{'CiteType'} = $crossRefTypes{$xref->{'CiteType'}}
|| $xref->{'CiteType'};
}
foreach my $xentry (keys %{$xref}) {
my $entry = $crossRefFields{$xentry} || $xentry;
if( !exists $ref->{$entry} ) {
# print STDERR "$xentry->$entry; ";
$ref->{$entry} = $xref->{$xentry};
}
}
}
( run in 1.399 second using v1.01-cache-2.11-cpan-39bf76dae61 )