
package Mail::SpamAssassin::Plugin::NrOfLines;

use Mail::SpamAssassin;
use Mail::SpamAssassin::Plugin;
use vars qw(@ISA);
@ISA = qw(Mail::SpamAssassin::Plugin);

sub new {
	my ($class, $mailsa) = @_;

	# the usual perlobj boilerplate to create a subclass object
	$class = ref($class) || $class;
	my $self = $class->SUPER::new($mailsa);
	bless ($self, $class);

	# then register an eval rule, if desired...
	$self->register_eval_rule ("body_lines");
	Mail::SpamAssassin::dbg("Registering 'body_lines'");
	$self->register_eval_rule ("nonempty_lines");
	Mail::SpamAssassin::dbg("Registering 'nonempty_lines'");

	# and return the new plugin object
	return $self;
}

# simply counting all lines (==scalar(arrayref))
sub body_lines {
	my ($self, $permsgstatus, $dummy, $tst_nr_of_lines) = @_;

	#my @body = $self->get_decoded_stripped_body_text_array();
	my $bodyref = $permsgstatus->{msg}->get_body();

	my $lines = scalar(@$bodyref);

	Mail::SpamAssassin::dbg("body_lines: lines=$lines, param=$tst_nr_of_lines");

	if ($tst_nr_of_lines < 0) { # compare for less
		$tst_nr_of_lines = -1 * $tst_nr_of_lines;
		return($lines < $tst_nr_of_lines);
	}
	else { # check for equal NOT for 'more'
		return($lines == $tst_nr_of_lines);
	}
}

# same as above but count only 'nonempty' lines (by grep match ==> slow?)
sub nonempty_lines {
	my ($self, $permsgstatus, $dummy, $tst_nr_of_lines) = @_;

	#my @body = $self->get_decoded_stripped_body_text_array();
	my $bodyref = $permsgstatus->{msg}->get_body();

	my $lines = scalar(grep { !/^$/ } @$bodyref);

	Mail::SpamAssassin::dbg("nonempty_lines: lines=$lines, param=$tst_nr_of_lines");

	if ($tst_nr_of_lines < 0) { # compare for less
		$tst_nr_of_lines = -1 * $tst_nr_of_lines;
		return($lines < $tst_nr_of_lines);
	}
	else { # check for equal NOT for 'more'
		return($lines == $tst_nr_of_lines);
	}
}

1;
