11 my $class = ref($proto) || $proto;
14 my $last_enum = undef;
16 $self->{CAPTION} = $caption;
19 $self->{PATTERN} = {};
20 $self->{COPY} = undef;
21 $self->{UNIT} = undef;
22 $self->{COMPRESSIBLE} = 1; # until proven otherwise
24 foreach my $subfield ($caption->subfields) {
25 my ($key, $val) = @$subfield;
28 } elsif ($key =~ /[a-h]/) {
29 # Enumeration Captions
30 $self->{ENUMS}->{$key} = {CAPTION => $val,
38 } elsif ($key =~ /[i-m]/) {
40 $self->{CHRONS}->{$key} = $val;
41 } elsif ($key eq 'u') {
42 # Bib units per next higher enumeration level
43 carp('$u specified for top-level enumeration')
44 unless defined($last_enum);
45 $self->{ENUMS}->{$last_enum}->{COUNT} = $val;
46 } elsif ($key eq 'v') {
47 carp '$v specified for top-level enumeration'
48 unless defined($last_enum);
49 $self->{ENUMS}->{$last_enum}->{RESTART} = ($val eq 'r');
50 } elsif ($key =~ /[npw-z]/) {
51 # Publication Pattern ('o' == type of unit, 'q'..'t' undefined)
52 $self->{PATTERN}->{$key} = $val;
53 } elsif ($key eq 'o') {
56 } elsif ($key eq 't') {
59 carp "Unknown caption subfield '$key'";
63 # subsequent levels of enumeration (primary and alternate)
64 # If an enumeration level doesn't document the number
65 # of "issues" per "volume", or whether numbering of issues
66 # restarts, then we can't compress.
67 foreach my $key ('b', 'c', 'd', 'e', 'f', 'h') {
68 if (exists $self->{ENUMS}->{$key}) {
69 my $pattern = $self->{ENUMS}->{$key};
70 if (!$pattern->{RESTART} || !$pattern->{COUNT}
71 || ($pattern->{COUNT} eq 'var')
72 || ($pattern->{COUNT} eq 'und')) {
73 $self->{COMPRESSIBLE} = 0;
79 # If there's a $x subfield and a $j, then it's compressible
80 if (exists $self->{PATTERN}->{x} && exists $self->{CHRONS}->{'j'}) {
81 $self->{COMPRESSIBLE} = 1;
84 bless ($self, $class);
91 return $self->{COMPRESSIBLE};
100 return $self->{ENUMS}->{$key}->{CAPTION};
102 return $self->{CAPTION};