1 package Equinox::Migration::SimpleTagList;
8 Equinox::Migration::SimpleTagList - Generate taglist from file
16 our $VERSION = '1.000';
21 Using a file as input, E::M::STL generates a set of MARC datafield
22 tags and provides several access mechanisms to that set.
24 use Equinox::Migration::SimpleTagList;
26 my $stl = Equinox::Migration::SimpleTagList->new( file => "trashtags.txt" );
27 my $tags = $stl->as_hashref;
31 my $stl = Equinox::Migration::SimpleTagList->new( file => "trashtags.txt" );
32 if ( $stl->has($foo) ) {
33 # if $foo is an element of $stl's parsed list
43 Takes one optional argument, C<file>. If this is speficied, the tag
44 list will be populated as per that file on instantiation.
46 Returns a E::M::STL object.
51 my ($class, %args) = @_;
53 my $self = bless { conf => { except => 0,
54 range => { high => 0, low => 0 },
61 $self->{conf}{file} = $args{file};
64 die "Can't open tags file: $!\n";
75 Passed a data field tag, returns 1 if that tag is in the list and 0 if
78 When specifying tags under 100, they must be quoted if you wish to
79 include the leading zeroes
81 $stl->has('011'); # is equivalent to
84 or Perl will think you're passing a (possibly malformed) octal value.
88 sub has { my ($self, $t) = @_; $t =~ s/^0+//; return (defined $self->{tags}{$t}) ? 1 : 0 }
92 Returns a hashref of the entire, assembled tag list.
96 sub as_hashref { my ($self) = @_; return $self->{tags} }
100 Returns a listref of the entire, assembled tag list (sorted
105 sub as_listref { my ($self) = @_; return [ sort {$a <=> $b} keys %{$self->{tags}} ] }
110 open TAGFILE, '<', $self->{conf}{file};
115 $self->{conf}{lastwasrange} = 0;
116 $self->{conf}{range}{high} = 0;
117 $self->{conf}{range}{low} = 0;
119 my @chunks = split /\s+/;
120 while (my $chunk = shift @chunks) {
121 last if ($chunk =~ /^#/);
124 if ($chunk =~ /^\d{1,3}$/) {
125 $self->add_tag($chunk);
126 $self->{conf}{except} = 0;
131 if ($chunk =~ /^\d{1,3}\.\.\d{1,3}$/) {
132 $self->add_range($chunk);
133 $self->{conf}{except} = 0;
138 if ($chunk eq 'except') {
139 die "Keyword 'except' can only follow a range (line $.)\n"
140 unless $self->{conf}{lastwasrange};
141 $self->{conf}{except} = 1;
145 die "Unknown chunk $chunk in tags file (line $.)\n";
155 my ($self, $chunk) = @_;
156 my ($low,$high) = split /\.\./, $chunk;
160 die "Ranges must be 'low..high' ($low is greater than $high)\n"
162 if ($self->{conf}{except}) {
163 die "Exception ranges must be within last addition range ($low..$high)\n"
164 if ($low < $self->{conf}{range}{low} or $high > $self->{conf}{range}{high});
166 for my $tag ($low..$high) {
170 unless ($self->{conf}{except}) {
171 $self->{conf}{range}{high} = $high;
172 $self->{conf}{range}{low} = $low;
174 $self->{conf}{lastwasrange} = 1;
182 my ($self, $tag) = @_;
185 die "Values must be numeric\n" if ($tag =~ /[^\d\-]/);
187 die "Values must be valid tags (0-999)\n"
188 unless ($tag >= 0 and $tag <= 999);
190 if ($self->{conf}{except}) {
191 $self->remove_tag($tag);
193 die "Tag '$tag' specified twice\n"
194 if $self->{tags}{$tag};
195 $self->{tags}{$tag} = 1;
196 $self->{conf}{lastwasrange} = 0;
205 my ($self, $tag) = @_;
208 die "Tag '$tag' isn't in the list\n"
209 unless $self->{tags}{$tag};
210 delete $self->{tags}{$tag};
215 Shawn Boyette, C<< <sboyette at esilibrary.com> >>
219 Please report any bugs or feature requests to the above email address.
223 You can find documentation for this module with the perldoc command.
225 perldoc Equinox::Migration::SimpleTagList
228 =head1 COPYRIGHT & LICENSE
230 Copyright 2009 Equinox, all rights reserved.
232 This program is free software; you can redistribute it and/or modify it
233 under the same terms as Perl itself.
238 1; # End of Equinox::Migration::SimpleTagList