diff -r 15a5ac599b95 -r 9f127fcfdf6d lib/Message/2822.pm --- a/lib/Message/2822.pm Thu Nov 10 16:18:38 2011 +0100 +++ b/lib/Message/2822.pm Fri Nov 11 11:22:50 2011 +0100 @@ -26,30 +26,53 @@ or die "Can't open $DATA{fn}{$self}: $!\n"; local $/ = ""; - $DATA{header}{$self} = <$fh>; + chomp($DATA{header}{$self} = <$fh>); $DATA{body_pos}{$self} = tell($fh); return $self; } -sub __header_fields { +sub header_fields { + my ($self, $pattern) = @_; + $pattern //= qr/\S+/; + return grep /$pattern/i => $DATA{header}{$self} =~ /^(\S+?[: ])/mg; +} + +sub header_lines { my $self = shift; - my %h; - @h{ $DATA{header}{$self} =~ /^(\S+?[: ])/mg } = (); - return keys %h; + my $field = shift // qr/.*/; + my @r = grep /$field/i => $DATA{header}{$self} =~ /(^\S+?[: ]\s*.*?\n)(?=^\S|\Z)/imsg; + return @r if wantarray; + + foreach (@r) { s/\s*?\n\s+/ /mg; } + return join "" => @r; } -sub header_content { - my $self = shift; - my $field = shift; +sub remove_header_lines { + my $self = shift; + my $pattern = shift // die "Need a pattern!"; + $DATA{header}{$self} =~ s/^$pattern.*?(?=^\S|\Z)//imsg; +} - ### assert: $field =~ /[: ]$/ +sub add_header_line { + my $self = shift; + my $_ = shift; + $_ .= "\n" unless /\n$/; + $DATA{header}{$self} .= $_; +} - # FIXME: not sure if the space following the header field name - # is optional or required - return $DATA{header}{$self} =~ /^$field\s+(.*?)(?=^\S)/imsg; +sub header_contents { + my $self = shift; + my $field = shift // qr/.*/; + + my @r = map { (split /[: ]/, $_, 2)[1] } $self->header_lines($field); + return @r if wantarray; + + foreach (@r) { s/\s*?\n\s+/ /mg; } + return join "" => @r; } + sub orig_header { my $self = shift; my $fh = $DATA{fh}{$self}; @@ -105,10 +128,28 @@ The construcor. The file is opened r/o and read. The file will not be closed until the object disappears. -=item @list = B(I) +=item @list = B([I]) + +Return a list of existing header fields, matching the pattern. +See B for information about the +returned format. (default pattern: /.*/) + + +=item @list = B([I]) -Returns a list (*always* a list) with the contents of the specified -header field. The I has to include the colon ":" or space " ", +Returns the header line matching the I. See B +about the returned format. (default pattern: /.*/) + +=item @list = B([I]) + +Returns the contents of the header lines matching the pattern. (default +pattern: /.*/) + +In list context a list of B header lines is returned. +In scalar context the header lines are de-wrapped and then returned, +delimited by single linebreak. + +The I has to include the colon ":" or space " ", since it is considered a part of the field name. I is case insensitive!