- $_ = html2txt($_); #Convert general HTML markup to text.
- $reached_table = 1 if (/^\s*\d/);
- next unless $reached_table;
-
- # Remove optional 'average value' column.
- s/^\s*(\d+)\s+(\S+)\s+(\d+(KB|MB|GB|\b)\s+)/$1 $2 /;
-
- if (/^\s*(\d+)\s+(\S+)\s*(.*?)\s*$/) {
- my($count,$rounded_volume,$entry) = ($1,$2,$3);
- #Note: $entry fields can be both null and can contain spaces.
-
- #Add the entry into the %table_order hash if it has a rounded volume (KB/MB/GB).
- push(@{$table_order{$rounded_volume}{$by_count_or_volume}},$entry) if ($rounded_volume =~ /\D/);
-
- unless ($league_table_value_entered{$entry}) {
- $league_table_value_entered{$entry} = 1;
- unless ($$count_href{$entry}) {
- $$count_href{$entry} = 0;
- $$data_href{$entry} = 0;
- $$data_gigs_href{$entry} = 0;
- $league_table_value_was_zero{$entry} = 1;
- }
-
- $$count_href{$entry} += $count;
- #Add the rounded value to the data and data_gigs hashes.
- un_round($rounded_volume,\$$data_href{$entry},\$$data_gigs_href{$entry});
- print STDERR "$category by $by_count_or_volume: added $count,$rounded_volume to $entry\n" if $debug;
- }
- }
- else { #Finished the table ?
- if ($by_count_or_volume =~ /volume/) {
- #Add a few bytes to appropriate entries to preserve the order.
-
- my($rounded_volume);
- foreach $rounded_volume (keys %table_order) {
- #For each rounded volume, we want to create a list which has things
- #ordered from the volume table at the front, and additional things
- #from the count table ordered at the back.
- @{$table_order{$rounded_volume}{volume}} = () unless defined $table_order{$rounded_volume}{volume};
- @{$table_order{$rounded_volume}{'message count'}} = () unless defined $table_order{$rounded_volume}{'message count'};
- my(@order,%mark);
- map {$mark{$_} = 1} @{$table_order{$rounded_volume}{volume}};
- @order = @{$table_order{$rounded_volume}{volume}};
- map {push(@order,$_)} grep(!$mark{$_},@{$table_order{$rounded_volume}{'message count'}});
-
- my $bonus_bytes = $#order;
- $bonus_bytes = 511 if ($bonus_bytes > 511); #Don't go over the half-K boundary!
- while (@order and ($bonus_bytes > 0)) {
- my $entry = shift(@order);
- if ($league_table_value_was_zero{$entry}) {
- $$data_href{$entry} += $bonus_bytes;
- print STDERR "$category by $by_count_or_volume: added $bonus_bytes bonus bytes to $entry\n" if $debug;
- }
- $bonus_bytes--;
- }
- }
- }
-
- last;
- }
+ # Watch out for empty tables.
+ goto PARSE_OLD_REPORT_LINE if (/<h2>/ or (/^\s*[a-zA-Z]/ && !/^\s*Messages/));
+
+ $_ = html2txt($_); #Convert general HTML markup to text.
+
+ # Messages Addresses Bytes Average
+ if (/^\s*Messages/) {
+ my $pattern = '^\s*(\d+)';
+ $pattern .= (/Addresses/) ? '\s+(\d+)' : '()';
+ $pattern .= (/Bytes/) ? '\s+([\dKMGB]+)' : '()';
+ $pattern .= (/Average/) ? '\s+[\dKMGB]+' : '';
+ $pattern .= '\s+(.*?)\s*$';
+ $row_re = qr/$pattern/;
+ $reached_table = 1;
+ next;
+ }
+ next unless $reached_table;
+
+ my($messages, $addresses, $rounded_volume, $entry);
+
+ if (/$row_re/) {
+ ($messages, $addresses, $rounded_volume, $entry) = ($1, $2, $3, $4);
+ }
+ else {
+ #Else we have finished the table and we may need to do some
+ #kludging to retain the order of the entries.
+
+ if ($by_count_or_volume =~ /volume/) {
+ #Add a few bytes to appropriate entries to preserve the order.
+ foreach $rounded_volume (keys %table_order) {
+ #For each rounded volume, we want to create a list which has things
+ #ordered from the volume table at the front, and additional things
+ #from the count table ordered at the back.
+ @{$table_order{$rounded_volume}{volume}} = () unless defined $table_order{$rounded_volume}{volume};
+ @{$table_order{$rounded_volume}{'message count'}} = () unless defined $table_order{$rounded_volume}{'message count'};
+ my(@order,%mark);
+ map {$mark{$_} = 1} @{$table_order{$rounded_volume}{volume}};
+ @order = @{$table_order{$rounded_volume}{volume}};
+ map {push(@order,$_)} grep(!$mark{$_},@{$table_order{$rounded_volume}{'message count'}});
+
+ my $bonus_bytes = $#order;
+ $bonus_bytes = 511 if ($bonus_bytes > 511); #Don't go over the half-K boundary!
+ while (@order and ($bonus_bytes > 0)) {
+ my $entry = shift(@order);
+ if ($league_table_value_was_zero{$entry}) {
+ $$data_href{$entry} += $bonus_bytes;
+ print STDERR "$category by $by_count_or_volume: added $bonus_bytes bonus bytes to $entry\n" if $debug;
+ }
+ $bonus_bytes--;
+ }
+ }
+ }
+ last;
+ }
+
+ # Store a new table entry.
+
+ # Add the entry into the %table_order hash if it has a rounded
+ # volume (KB/MB/GB).
+ push(@{$table_order{$rounded_volume}{$by_count_or_volume}},$entry) if ($rounded_volume =~ /\D/);
+
+ unless ($league_table_value_entered{$entry}) {
+ $league_table_value_entered{$entry} = 1;
+ unless ($$messages_href{$entry}) {
+ $$messages_href{$entry} = 0;
+ $$addresses_href{$entry} = 0;
+ $$data_href{$entry} = 0;
+ $$data_gigs_href{$entry} = 0;
+ $league_table_value_was_zero{$entry} = 1;
+ }
+
+ $$messages_href{$entry} += $messages;
+
+ # When adding the addresses, be aware that we could be merging
+ # an old report which does not include addresses. In this case,
+ # we add the messages instead.
+ $$addresses_href{$entry} += ($addresses) ? $addresses : $messages;
+
+ #Add the rounded value to the data and data_gigs hashes.
+ un_round($rounded_volume,\$$data_href{$entry},\$$data_gigs_href{$entry}) if $rounded_volume;
+ print STDERR "$category by $by_count_or_volume: added $messages,$rounded_volume to $entry\n" if $debug;
+ }
+