summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/bibtex/biber/lib/Biber/Section.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/bibtex/biber/lib/Biber/Section.pm')
-rw-r--r--Master/texmf-dist/source/bibtex/biber/lib/Biber/Section.pm452
1 files changed, 452 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/bibtex/biber/lib/Biber/Section.pm b/Master/texmf-dist/source/bibtex/biber/lib/Biber/Section.pm
new file mode 100644
index 00000000000..237f2d9fbfa
--- /dev/null
+++ b/Master/texmf-dist/source/bibtex/biber/lib/Biber/Section.pm
@@ -0,0 +1,452 @@
+package Biber::Section;
+#use feature 'unicode_strings';
+
+use Biber::Entries;
+use Biber::Utils;
+use List::Util qw( first );
+
+=encoding utf-8
+
+=head1 NAME
+
+Biber::Section
+
+=head2 new
+
+ Initialize a Biber::Section object
+
+=cut
+
+sub new {
+ my ($class, %params) = @_;
+ my $self = bless {%params}, $class;
+ $self->{bibentries} = new Biber::Entries;
+ $self->{allkeys} = 0;
+ $self->{citekeys} = [];
+ $self->{sortcache} = [];
+ $self->{dkeys} = {};
+ $self->{orig_order_citekeys} = [];
+ $self->{undef_citekeys} = [];
+ return $self;
+}
+
+=head2 allkeys
+
+ Sets flag to say citekey '*' occurred in citekeys
+
+=cut
+
+sub allkeys {
+ my $self = shift;
+ $self->{allkeys} = 1;
+ return;
+}
+
+=head2 is_allkeys
+
+ Checks flag which says citekey '*' occurred in citekeys
+
+=cut
+
+sub is_allkeys {
+ my $self = shift;
+ return $self->{allkeys};
+}
+
+
+=head2 bibentry
+
+ Returns a Biber::Entry object for the given citation key
+
+=cut
+
+sub bibentry {
+ my $self = shift;
+ my $key = shift;
+ $key = lc($key);
+ return $self->bibentries->entry($key);
+}
+
+=head2 bibentries
+
+ Return Biber::Entries object for this section
+
+=cut
+
+sub bibentries {
+ my $self = shift;
+ return $self->{bibentries};
+}
+
+=head2 del_bibentries
+
+ Delete all Biber::Entry objects from the Biber::Section object
+
+=cut
+
+sub del_bibentries {
+ my $self = shift;
+ $self->{bibentries} = new Biber::Entries;
+ return;
+}
+
+
+=head2 set_citekeys
+
+ Sets the citekeys in a Biber::Section object
+
+=cut
+
+sub set_citekeys {
+ my $self = shift;
+ my $keys = shift;
+ $self->{citekeys} = $keys;
+ return;
+}
+
+=head2 set_orig_order_citekeys
+
+ Sets the original order of citekeys in a Biber::Section object
+
+=cut
+
+sub set_orig_order_citekeys {
+ my $self = shift;
+ my $keys = shift;
+ $self->{orig_order_citekeys} = $keys;
+ return;
+}
+
+
+=head2 get_citekeys
+
+ Gets the citekeys of a Biber::Section object
+ Returns a normal array
+
+=cut
+
+sub get_citekeys {
+ my $self = shift;
+ return @{$self->{citekeys}};
+}
+
+=head2 get_static_citekeys
+
+ Gets the citekeys of a Biber::Section object
+ excluding dynamic set entry keys
+ Returns a normal array
+
+=cut
+
+sub get_static_citekeys {
+ my $self = shift;
+ return reduce_array($self->{citekeys}, $self->dynamic_set_keys);
+}
+
+
+=head2 get_undef_citekeys
+
+ Gets the list of undefined citekeys of a Biber::Section object
+ Returns a normal array
+
+=cut
+
+sub get_undef_citekeys {
+ my $self = shift;
+ return @{$self->{undef_citekeys}};
+}
+
+=head2 get_orig_order_citekeys
+
+ Gets the citekeys of a Biber::Section object in their original order
+ This is just to ensure we have a method that will return this, just in
+ case we mess about with the order at some point. This is needed by
+ citeorder sorting.
+
+=cut
+
+sub get_orig_order_citekeys {
+ my $self = shift;
+ return @{$self->{orig_order_citekeys}};
+}
+
+=head2 has_citekey
+
+ Returns true when $key is in the Biber::Section object
+
+=cut
+
+sub has_citekey {
+ my $self = shift;
+ my $key = shift;
+ return defined ( first { lc($_) eq lc($key) } $self->get_citekeys ) ? 1 : 0;
+}
+
+
+
+=head2 del_citekey
+
+ Deletes a citekey from a Biber::Section object
+
+=cut
+
+sub del_citekey {
+ my $self = shift;
+ my $key = shift;
+ return unless $self->has_citekey($key);
+ $self->{citekeys} = [ grep {$_ ne $key} @{$self->{citekeys}} ];
+ $self->{orig_order_citekeys} = [ grep {$_ ne $key} @{$self->{orig_order_citekeys}} ];
+ return;
+}
+
+=head2 del_citekeys
+
+ Deletes al citekeys from a Biber::Section object
+
+=cut
+
+sub del_citekeys {
+ my $self = shift;
+ $self->{citekeys} = [ ];
+ $self->{orig_order_citekeys} = [ ];
+ return;
+}
+
+
+=head2 set_dynamic_set
+
+ Record a mapping of dynamic key to member keys
+
+=cut
+
+sub set_dynamic_set {
+ my $self = shift;
+ my $dkey = shift;
+ my @members = @_;
+ $self->{dkeys}{$dkey} = \@members;
+ return;
+}
+
+=head2 get_dynamic_set
+
+ Retrieve member keys for a dynamic set key
+ Check on has reference returning anything stop spurious warnings
+ about empty dereference in return.
+
+=cut
+
+sub get_dynamic_set {
+ my $self = shift;
+ my $dkey = shift;
+ if (my $set_members = $self->{dkeys}{$dkey}) {
+ return @$set_members;
+ }
+ else {
+ return ();
+ }
+}
+
+=head2 dynamic_set_keys
+
+ Retrieve all dynamic set keys
+
+=cut
+
+sub dynamic_set_keys {
+ my $self = shift;
+ return [keys %{$self->{dkeys}}];
+}
+
+
+=head2 add_citekeys
+
+ Adds citekeys to the Biber::Section object
+
+=cut
+
+sub add_citekeys {
+ my $self = shift;
+ my @keys = @_;
+ foreach my $key (@keys) {
+ next if $self->has_citekey($key);
+ push @{$self->{citekeys}}, $key;
+ push @{$self->{orig_order_citekeys}}, $key;
+ }
+ return;
+}
+
+=head2 add_undef_citekey
+
+ Adds a citekey to the Biber::Section object as an undefined
+ key. This allows us to output this information to the .bbl and
+ so biblatex can do better reporting to external utils like latexmk
+
+=cut
+
+sub add_undef_citekey {
+ my $self = shift;
+ my $key = shift;
+ push @{$self->{undef_citekeys}}, $key;
+ return;
+}
+
+
+=head2 add_datasource
+
+ Adds a data source to a section
+
+=cut
+
+sub add_datasource {
+ my $self = shift;
+ my $source = shift;
+ push @{$self->{datasources}}, $source;
+ return;
+}
+
+=head2 set_datasources
+
+ Sets the data sources for a section
+
+=cut
+
+sub set_datasources {
+ my $self = shift;
+ my $sources = shift;
+ $self->{datasources} = $sources;
+ return;
+}
+
+
+=head2 get_datasources
+
+ Gets an array of data sources for this section
+
+=cut
+
+sub get_datasources {
+ my $self = shift;
+ if (exists($self->{datasources})) {
+ return $self->{datasources};
+ }
+ else {
+ return undef;
+ }
+}
+
+=head2 add_list
+
+ Adds a section list to this section
+
+=cut
+
+sub add_list {
+ my $self = shift;
+ my $list = shift;
+ push @{$self->{lists}}, $list;
+ return;
+}
+
+=head2 get_lists
+
+ Returns an array ref of all section lists
+
+=cut
+
+sub get_lists {
+ my $self = shift;
+ return $self->{lists};
+}
+
+=head2 get_list
+
+ Returns a specific list by label
+
+=cut
+
+sub get_list {
+ my $self = shift;
+ my $label = shift;
+ foreach my $list (@{$self->{lists}}) {
+ return $list if ($list->get_label eq $label);
+ }
+ return undef;
+}
+
+=head2 add_sort_cache
+
+ Adds a scheme/keys pair to the sort cache:
+ [$scheme, $keys, $sortinitdata, $extraalphadata, $extrayeardata ]
+
+=cut
+
+sub add_sort_cache {
+ my $self = shift;
+ my $cacheitem = shift;
+ push @{$self->{sortcache}}, $cacheitem;
+ return;
+}
+
+
+=head2 get_sort_cache
+
+ Retrieves the sort cache
+
+=cut
+
+sub get_sort_cache {
+ my $self = shift;
+ return $self->{sortcache};
+}
+
+=head2 reset_sort_cache
+
+ Reset the sort cache
+
+=cut
+
+sub reset_sort_cache {
+ my $self = shift;
+ $self->{sortcache} = [];
+ return;
+}
+
+
+
+=head2 number
+
+ Gets the section number of a Biber::Section object
+
+=cut
+
+sub number {
+ my $self = shift;
+ return $self->{number};
+}
+
+=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: