# $File: //depot/libOurNet/BBS/lib/OurNet/BBS/External/ArticleGroup.pm $ $Author: autrijus $
# $Revision: #3 $ $Change: 3807 $ $DateTime: 2003/01/24 22:48:36 $
package OurNet::BBS::External::ArticleGroup;
use if $OurNet::BBS::Encoding, 'open' => ":encoding($OurNet::BBS::Encoding)";
use strict;
no warnings 'deprecated';
use fields qw/article_store article_fetch board name dir recno mtime btime _ego _hash _array/;
use Date::Parse;
use Date::Format;
# btime: header, mtime: directory
use OurNet::BBS::Base (
'@packlist' => [qw/id author nick date title/],
);
my $chrono = 0;
sub refresh_meta {
my ($self, $key, $flag) = @_;
return 1;
}
sub STORE {
my ($self, $key, $value) = @_;
($self, my $flag) = @{${$self}};
# special case: hash without key becomes PUSH.
if ($flag == HASH) {
die 'arbitary storage of message-ids condered harmful.' if $key;
$key = $#{$self->{_array}} + 1;
$flag = ARRAY;
}
my $obj;
if (exists $self->{_array}[$key]) {
$obj = $self->{_array}[$key];
}
if ($value->{header}) {
# modern style
@{$value}{qw/author nick/} = ($1, $2)
if $value->{header}{From} =~ m/^\s*(.+?)\s*(?:\((.*)\))?$/g;
@{$value}{qw/author nick/} = ($2, $1)
if $value->{header}{From} =~ m/^\s*\"?(.*?)\"?\s*\<(.*)\>$/g;
$value->{date} = time2str(
'%y/%m/%d', str2time($value->{header}{Date})
) if $value->{header}{Date};
$value->{title} = $value->{header}{Subject};
}
else {
# traditional style
$value->{header} = {
From => $value->{author}.
(defined $self->{_hash}{nick}
? " ($self->{_hash}{nick})" : ''),
Subject => $value->{title},
}
}
$value->{author} =~ s/(?:\.bbs)?(\@[^\@]*)\@.*/$1/;
my $cmd = $self->{article_store};
$cmd =~ s/\$\{?header\}?\{(\w+)\=([^\}]+)\}/$value->{header}{$1} = $2/eg;
$cmd =~ s/\$\{(\w+)\=([^\}]+)\}/$value->{$1} = $2/eg;
$cmd =~ s/\$\{?header\}?\{(\w+)\}/$value->{header}{$1}/g;
$cmd =~ s/\$\{?(\w+)\}?/$value->{$1}/g;
open my $fh, "| $cmd";
while (my ($k, $v) = each %{$value->{header}}) {
print $fh "$k: $v\n";
}
print $fh "\n$value->{body}";
close $fh;
return 1;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1