Gaim-Log-Parser
view release on metacpan or search on metacpan
lib/Gaim/Log/Parser.pm view on Meta::CPAN
local $Text::Wrap::columns = ($opts->{columns} || 70);
while(my $m = $self->next_message()) {
my $content = $m->content();
$content =~ s/\n+/ /g;
$string .= fill("", " ",
nice_time($m->date()) . " " .
$m->from() . ": " . $content) . "\n\n";
}
# reset fh
$self->{offset} = $old_offset;
seek $fh, $self->{offset}, 0;
return $string;
}
###########################################
sub next_message {
###########################################
my($self) = @_;
my $fh = $self->{fh};
my $time_match = qr(\d{2}:\d{2}:\d{2}(?: [AP]M)?);
my $date_match = qr(\d{2}/\d{2}/\d{2,4});
my $euro_date_match = qr(\d{2}\.\d{2}\.\d{2,4});
my $iso_date_match = qr(\d{4}-\d{2}-\d{2});
my $line_match_with_time = qr/^\(($time_match)\) (.*)/;
my $line_match_with_date_and_time =
qr/^\(($date_match) ($time_match)\) (.*)/;
my $line_match_with_euro_date_and_time =
qr/^\(($euro_date_match) ($time_match)\) (.*)/;
my $line_match_with_iso_date_and_time =
qr/^\(($iso_date_match) ($time_match)\) (.*)/;
my $line_match = qr($line_match_with_time|
$line_match_with_date_and_time|
$line_match_with_euro_date_and_time|
$line_match_with_iso_date_and_time)x;
# Read next line
my $line = <$fh>;
# End of file?
if(! defined $line) {
DEBUG "End of file $self->{file}";
$self->{fh} = $fh;
return undef;
}
my($time, $date, $msg, $day, $month, $year);
# Valid line?
if($line =~ /$line_match_with_time/) {
$time = $1;
$msg = $2;
} elsif($line =~ /$line_match_with_date_and_time/) {
$date = $1;
($month, $day, $year) = split m#/#, $date;
$time = $2;
$msg = $3;
} elsif($line =~ /$line_match_with_euro_date_and_time/) {
$date = $1;
($day, $month, $year) = split m#\.#, $date;
$time = $2;
$msg = $3;
} elsif($line =~ /$line_match_with_iso_date_and_time/) {
$date = $1;
($year, $month, $day) = split m#-#, $date;
$time = $2;
$msg = $3;
} else {
while(defined $line and $line !~ /$line_match/) {
chomp $line;
LOGWARN "Format error in $self->{file}: ",
"Line '$line' doesn't match $line_match";
$line = <$fh>;
}
}
# We accepted either 2 or 4 digit years. Hopefully there's no
# gaim logs from < 2000 :).
if($year) {
$year += 2000 unless length $year == 4;
}
$self->{offset} = tell $fh;
# We've got a message, let's see if there's continuation lines
while(defined($_ = <$fh>)) {
if(/$line_match/) {
# Next line doesn't look like a continuation line,
last;
}
# We have a continuation line.
chomp;
$msg .= "\n$_";
$self->{offset} = tell $fh;
}
# Go back to the previous offset, before we tried searching
# for continuation lines
seek $fh, $self->{offset}, 0;
$self->{fh} = $fh;
# Check if we have a roll-over
my $dtclone = $self->{dt}->clone();
if($date) {
$dtclone = DateTime->new(year => $year,
month => $month,
day => $day,
time_zone => $self->{time_zone}
);
$self->{dt} = $dtclone;
}
my $pm = 0;
if($time =~ / PM/) {
$pm = 1;
}
$time =~ s/ .*//;
my($hour, $minute, $second) = split /:/, $time;
$dtclone->set_hour($hour);
$dtclone->set_minute($minute);
$dtclone->set_second($second);
( run in 0.730 second using v1.01-cache-2.11-cpan-71847e10f99 )