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 )