summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/bibtex/biber/lib/Biber/Output/BBL.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/bibtex/biber/lib/Biber/Output/BBL.pm')
-rw-r--r--Master/texmf-dist/source/bibtex/biber/lib/Biber/Output/BBL.pm501
1 files changed, 0 insertions, 501 deletions
diff --git a/Master/texmf-dist/source/bibtex/biber/lib/Biber/Output/BBL.pm b/Master/texmf-dist/source/bibtex/biber/lib/Biber/Output/BBL.pm
deleted file mode 100644
index c6f33f7ae0e..00000000000
--- a/Master/texmf-dist/source/bibtex/biber/lib/Biber/Output/BBL.pm
+++ /dev/null
@@ -1,501 +0,0 @@
-package Biber::Output::BBL;
-#use feature 'unicode_strings';
-use base 'Biber::Output::Base';
-
-use Biber::Config;
-use Biber::Constants;
-use Biber::Entry;
-use Biber::Utils;
-use IO::File;
-use Log::Log4perl qw( :no_extra_logdie_message );
-my $logger = Log::Log4perl::get_logger('main');
-
-=encoding utf-8
-
-=head1 NAME
-
-Biber::Output::BBL - class for Biber output of .bbl
-
-=cut
-
-=head2 new
-
- Initialize a Biber::Output::BBL object
-
-=cut
-
-sub new {
- my $class = shift;
- my $self = $class->SUPER::new($obj);
- my $ctrlver = Biber::Config->getblxoption('controlversion');
- my $beta = $Biber::BETA_VERSION ? ' (beta)' : '';
-
- my $BBLHEAD = <<EOF;
-% \$ biblatex auxiliary file \$
-% \$ biblatex version $ctrlver \$
-% \$ biber version $Biber::VERSION$beta \$
-% Do not modify the above lines!
-%
-% This is an auxiliary file used by the 'biblatex' package.
-% This file may safely be deleted. It will be recreated by
-% biber or bibtex as required.
-%
-\\begingroup
-\\makeatletter
-\\\@ifundefined{ver\@biblatex.sty}
- {\\\@latex\@error
- {Missing 'biblatex' package}
- {The bibliography requires the 'biblatex' package.}
- \\aftergroup\\endinput}
- {}
-\\endgroup
-
-EOF
-
- $self->set_output_head($BBLHEAD);
- return $self;
-}
-
-=head2 set_output_target_file
-
- Set the output target file of a Biber::Output::BBL object
- A convenience around set_output_target so we can keep track of the
- filename
-
-=cut
-
-sub set_output_target_file {
- my $self = shift;
- my $bblfile = shift;
- $self->{output_target_file} = $bblfile;
- my $enc_out;
- if (Biber::Config->getoption('bblencoding')) {
- $enc_out = ':encoding(' . Biber::Config->getoption('bblencoding') . ')';
- }
- my $BBLFILE = IO::File->new($bblfile, ">$enc_out") or $logger->logdie("Failed to open $bblfile : $!");
- $self->set_output_target($BBLFILE);
-}
-
-=head2 _printfield
-
- Add the .bbl for a text field to the output accumulator.
-
-=cut
-
-sub _printfield {
- my ($self, $field, $str) = @_;
- my $field_type = 'field';
- # crossref and xref are of type 'strng' in the .bbl
- if (lc($field) eq 'crossref' or
- lc($field) eq 'xref') {
- $field_type = 'strng';
- }
- if (Biber::Config->getoption('wraplines')) {
- ## 12 is the length of ' \field{}{}' or ' \strng{}{}'
- if ( 12 + length($field) + length($str) > 2*$Text::Wrap::columns ) {
- return " \\${field_type}{$field}{%\n" . wrap(' ', ' ', $str) . "%\n }\n";
- }
- elsif ( 12 + length($field) + length($str) > $Text::Wrap::columns ) {
- return wrap(' ', ' ', "\\${field_type}{$field}{$str}" ) . "\n";
- }
- else {
- return " \\${field_type}{$field}{$str}\n";
- }
- }
- else {
- return " \\${field_type}{$field}{$str}\n";
- }
- return;
-}
-
-=head2 set_output_undefkey
-
- Set the .bbl output for an undefined key
-
-=cut
-
-sub set_output_undefkey {
- my $self = shift;
- my $key = shift; # undefined key
- my $section = shift; # Section object the entry occurs in
- my $acc = '';
- my $secnum = $section->number;
-
- $acc .= " \\missing{$key}\n";
-
- # Create an index by keyname for easy retrieval
- $self->{output_data}{ENTRIES}{$secnum}{index}{lc($key)} = \$acc;
-
- return;
-}
-
-
-=head2 set_output_entry
-
- Set the .bbl output for an entry. This is the meat of
- the .bbl output
-
-=cut
-
-sub set_output_entry {
- my $self = shift;
- my $be = shift; # Biber::Entry object
- my $section = shift; # Section object the entry occurs in
- my $struc = shift; # Structure object
- my $acc = '';
- my $opts = '';
- my $citekey; # entry key in original form (case) from citation
- my $secnum = $section->number;
-
- if ( $be->get_field('citekey') ) {
- $citekey = $be->get_field('citekey');
- }
-
- if ($be->field_exists('options')) {
- $opts = $be->get_field('options');
- }
-
- $acc .= " \\entry{$citekey}{" . $be->get_field('entrytype') . "}{$opts}\n";
-
- # Generate set information
- if ( $be->get_field('entrytype') eq 'set' ) { # Set parents get \set entry ...
- $acc .= " \\set{" . $be->get_field('entryset') . "}\n";
- }
- else { # Everything else that isn't a set parent ...
- if (my $es = $be->get_field('entryset')) { # ... gets a \inset if it's a set member
- $acc .= " \\inset{$es}\n";
- }
- }
-
- # Output name fields
-
- # first output copy in labelname
- # This is essentially doing the same thing twice but in the future,
- # labelname will have different things attached than the raw name
- my $lnn = $be->get_field('labelnamename'); # save name of labelname field
- my $name_others_deleted = '';
- if (my $ln = $be->get_field('labelname')) {
- if ( $ln->last_element->get_namestring eq 'others' ) {
- $acc .= " \\true{morelabelname}\n";
- $ln->del_last_element;
- # record that we have deleted "others" from labelname field
- # we will need this below
- $name_others_deleted = $lnn;
- }
- my $total = $ln->count_elements;
- $acc .= " \\name{labelname}{$total}{%\n";
- foreach my $n (@{$ln->names}) {
- $acc .= $n->name_to_bbl;
- }
- $acc .= " }\n";
- }
-
- # then names themselves
- foreach my $namefield (@{$struc->get_field_type('name')}) {
- next if $struc->is_field_type('skipout', $namefield);
- if ( my $nf = $be->get_field($namefield) ) {
- # If this name is labelname, we've already deleted the "others"
- # so just add the boolean
- if ($name_others_deleted eq $namefield) {
- $acc .= " \\true{more$namefield}\n";
- }
- # otherwise delete and add the boolean
- elsif ($nf->last_element->get_namestring eq 'others') {
- $acc .= " \\true{more$namefield}\n";
- $nf->del_last_element;
- }
- my $total = $nf->count_elements;
- $acc .= " \\name{$namefield}{$total}{%\n";
- foreach my $n (@{$nf->names}) {
- $acc .= $n->name_to_bbl;
- }
- $acc .= " }\n";
- }
- }
-
- # Output list fields
- foreach my $listfield (@{$struc->get_field_type('list')}) {
- if (my $lf = $be->get_field($listfield)) {
- if ( $be->get_field($listfield)->[-1] eq 'others' ) {
- $acc .= " \\true{more$listfield}\n";
- pop @$lf; # remove the last element in the array
- };
- my $total = $#$lf + 1;
- $acc .= " \\list{$listfield}{$total}{%\n";
- foreach my $f (@$lf) {
- $acc .= " {$f}%\n";
- }
- $acc .= " }\n";
- }
- }
-
- my $namehash = $be->get_field('namehash');
- $acc .= " \\strng{namehash}{$namehash}\n";
- my $fullhash = $be->get_field('fullhash');
- $acc .= " \\strng{fullhash}{$fullhash}\n";
-
- if ( Biber::Config->getblxoption('labelalpha', $be->get_field('entrytype')) ) {
- # Might not have been set due to skiplab/dataonly
- if (my $label = $be->get_field('labelalpha')) {
- $acc .= " \\field{labelalpha}{$label}\n";
- }
- }
-
- # This is special, we have to put a marker for sortinit and then replace this string
- # on output as it can vary between lists
- $acc .= " <BDS>SORTINIT</BDS>\n";
-
- # The labelyear option determines whether "extrayear" is output
- if ( Biber::Config->getblxoption('labelyear', $be->get_field('entrytype'))) {
- # Might not have been set due to skiplab/dataonly
- if (my $nameyear_extrayear = $be->get_field('nameyear_extrayear')) {
- if ( Biber::Config->get_seen_nameyear_extrayear($nameyear_extrayear) > 1) {
- $acc .= " <BDS>EXTRAYEAR</BDS>\n";
- }
- }
- if (my $ly = $be->get_field('labelyear')) {
- $acc .= " \\field{labelyear}{$ly}\n";
- }
- }
-
- # The labelalpha option determines whether "extraalpha" is output
- if ( Biber::Config->getblxoption('labelalpha', $be->get_field('entrytype'))) {
- # Might not have been set due to skiplab/dataonly
- if (my $nameyear_extraalpha = $be->get_field('nameyear_extraalpha')) {
- if ( Biber::Config->get_seen_nameyear_extraalpha($nameyear_extraalpha) > 1) {
- $acc .= " <BDS>EXTRAALPHA</BDS>\n";
- }
- }
- }
-
- if ( Biber::Config->getblxoption('labelnumber', $be->get_field('entrytype')) ) {
- if (my $sh = $be->get_field('shorthand')) {
- $acc .= " \\field{labelnumber}{$sh}\n";
- }
- elsif (my $lnum = $be->get_field('labelnumber')) {
- $acc .= " \\field{labelnumber}{$lnum}\n";
- }
- }
-
- if (my $unopt = Biber::Config->getblxoption('uniquename', $be->get_field('entrytype'))) {
- my $lname = $be->get_field('labelnamename');
- my $name;
- my $lastname;
- my $nameinitstr;
- my $un;
-
- if ($lname) {
- $name = $be->get_field($lname)->nth_element(1);
- $lastname = $name->get_lastname;
- $nameinitstr = $name->get_nameinitstring;
- }
- # uniquename is requested but there is no labelname or there are more than two names in
- # labelname
- if ($be->get_field('ignoreuniquename')) {
- $un = '0';
- }
- # If there is one entry (hash) for the lastname, then it's unique
- elsif (Biber::Config->get_numofuniquenames($lastname) == 1 ) {
- $un = '0';
- }
- # Otherwise, if there is one entry (hash) for the lastname plus initials,
- # then it needs the initials to make it unique
- elsif (Biber::Config->get_numofuniquenames($nameinitstr) == 1 ) {
- $un = '1';
- }
- # Otherwise the name needs to be full to make it unique
- # but restricted to uniquename biblatex option value just in case
- # this is inits only (1);
- else {
- $un = $unopt;
- }
- $acc .= " \\count{uniquename}{$un}\n";
- }
-
- # skiplab entries don't have a seennamehash count so this gives an error
- # unless we check for this
- if ( Biber::Config->getblxoption('singletitle', $be->get_field('entrytype'))
- and (not Biber::Config->get_seennamehash($be->get_field('fullhash')) or
- Biber::Config->get_seennamehash($be->get_field('fullhash')) < 2 ))
- {
- $acc .= " \\true{singletitle}\n";
- }
-
- foreach my $lfield (@{$struc->get_field_type('literal')}) {
- next if $struc->is_field_type('skipout', $lfield);
- if ( ($struc->is_field_type('nullok', $lfield) and
- $be->field_exists($lfield)) or
- $be->get_field($lfield) ) {
- # we skip outputting the crossref or xref when the parent is not cited
- # (biblatex manual, section 2.23)
- # sets are a special case so always output crossref/xref for them since their
- # children will always be in the .bbl otherwise they make no sense.
- unless ( $be->get_field('entrytype') eq 'set') {
- next if ($lfield eq 'crossref' and
- not $section->has_citekey($be->get_field('crossref')));
- next if ($lfield eq 'xref' and
- not $section->has_citekey($be->get_field('xref')));
- }
- $acc .= $self->_printfield( $lfield, $be->get_field($lfield) );
- }
- }
-
- foreach my $rfield (@{$struc->get_field_type('range')}) {
- if ( my $rf = $be->get_field($rfield) ) {
- # range fields are an array ref of two-element array refs [range_start, range_end]
- # range_end can be be empty for open-ended range or undef
- my @pr;
- foreach my $f (@$rf) {
- if (defined($f->[1])) {
- push @pr, $f->[0] . '\bibrangedash' . ($f->[1] ? ' ' . $f->[1] : '');
- }
- else {
- push @pr, $f->[0];
- }
- }
- my $bbl_rf = join(', ', @pr);
- $acc .= " \\field{$rfield}{$bbl_rf}\n";
- }
- }
-
- foreach my $vfield (@{$struc->get_field_type('verbatim')}) {
- if ( my $vf = $be->get_field($vfield) ) {
- $acc .= " \\verb{$vfield}\n";
- $acc .= " \\verb $vf\n \\endverb\n";
- }
- }
- if ( my $k = $be->get_field('keywords') ) {
- $acc .= " \\keyw{$k}\n";
- }
-
- # Append any warnings to the entry, if any
- if ( my $w = $be->get_field('warnings')) {
- foreach my $warning (@$w) {
- $acc .= " \\warn{\\item $warning}\n";
- }
- }
-
- $acc .= " \\endentry\n\n";
-
- # Create an index by keyname for easy retrieval
- $self->{output_data}{ENTRIES}{$secnum}{index}{lc($citekey)} = \$acc;
-
- return;
-}
-
-
-=head2 output
-
- BBL output method - this takes care to output entries in the explicit order
- derived from the virtual order of the citekeys after sortkey sorting.
-
-=cut
-
-sub output {
- my $self = shift;
- my $data = $self->{output_data};
- my $target = $self->{output_target};
- my $target_string = "Target"; # Default
- if ($self->{output_target_file}) {
- $target_string = $self->{output_target_file};
- }
-
- # for debugging mainly
- unless ($target) {
- $target = new IO::File '>-';
- }
-
- $logger->debug('Preparing final output using class ' . __PACKAGE__ . '...');
-
- $logger->info("Writing '$target_string' with encoding '" . Biber::Config->getoption('bblencoding') . "'");
-
- print $target $data->{HEAD} or $logger->logdie("Failure to write head to $target_string: $!");
-
- foreach my $secnum (sort keys %{$data->{ENTRIES}}) {
- $logger->debug("Writing entries for section $secnum");
-
- print $target "\n\\refsection{$secnum}\n";
- my $section = $self->get_output_section($secnum);
-
- # This sort is cosmetic, just to order the lists in a predictable way in the .bbl
- foreach my $list (sort {$a->get_label cmp $b->get_label} @{$section->get_lists}) {
- my $listlabel = $list->get_label;
- my $listtype = $list->get_type;
- $logger->debug("Writing entries in list '$listlabel'");
-
- # Remove most of this conditional when biblatex supports lists
- if ($listlabel eq 'SHORTHANDS') {
- print $target " \\lossort\n";
- }
- else {
- print $target "\n \\sortlist{$listlabel}\n" unless ($listlabel eq 'MAIN');
- }
-
- # The order of this array is the sorted order
- foreach my $k ($list->get_keys) {
- $logger->debug("Writing entry for key '$k'");
- if ($listtype eq 'entry') {
- my $entry = $data->{ENTRIES}{$secnum}{index}{lc($k)};
-
- # Instantiate any dynamic, list specific entry information
- my $entry_string = $list->instantiate_entry($entry, $k);
-
- # If requested to convert UTF-8 to macros ...
- if (Biber::Config->getoption('bblsafechars')) {
- $entry_string = latex_recode_output($entry_string);
- }
-
- print $target $entry_string or $logger->logdie("Failure to write list element to $target_string: $!");
- }
- elsif ($listtype eq 'shorthand') {
- print $target " \\key{$k}\n" or $logger->logdie("Failure to write list element to $target_string: $!");
- }
- }
-
- # Remove most of this conditional when biblatex supports lists
- if ($listlabel eq 'SHORTHANDS') {
- print $target " \\endlossort\n\n";
- }
- else {
- print $target "\n \\endsortlist\n\n" unless ($listlabel eq 'MAIN');
- }
- }
-
- print $target "\\endrefsection\n"
- }
-
- print $target $data->{TAIL} or $logger->logdie("Failure to write tail to $target_string: $!");
-
- $logger->info("Output to $target_string");
- close $target or $logger->logdie("Failure to close $target_string: $!");
- return;
-}
-
-
-=head1 AUTHORS
-
-François Charette, C<< <firmicus at gmx.net> >>
-Philip Kime C<< <philip at kime.org.uk> >>
-
-=head1 BUGS
-
-Please report any bugs or feature requests on our sourceforge tracker at
-L<https://sourceforge.net/tracker2/?func=browse&group_id=228270>.
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright 2009-2011 François Charette and Philip Kime, all rights reserved.
-
-This module is free software. You can redistribute it and/or
-modify it under the terms of the Artistic License 2.0.
-
-This program is distributed in the hope that it will be useful,
-but without any warranty; without even the implied warranty of
-merchantability or fitness for a particular purpose.
-
-=cut
-
-1;
-
-# vim: set tabstop=2 shiftwidth=2 expandtab:
-