\EMBED{lang=perl}

 # a very general test filter
 sub numberLines
  {
   # get parameters: start value
   my ($counter)=@_;
   $counter=1 unless defined $counter;

   # declare variables
   my ($buffer, @results, @lines, @buffer)=(0, '');

   # extract lines
   @lines=split("\n", $main::_pfilterText);

   # block specific preparations
   @buffer=(shift(@lines), pop(@lines)) if $main::_pfilterType eq 'verbatim block';
   $lines[0]=~/^(\s*)/, $buffer=defined $1 ? $1 : '' if $main::_pfilterType=~/block$/;

   # handle paragraph lines
   foreach my $line (@lines)
    {
     # empty lines in blocks
     push(@results, $main::_pfilterType=~/block$/ ? join('', $buffer, sprintf("%.2d:", $counter++)) : ''), next unless $line;

     # typical block lines
     push(@results, join('', $1, sprintf("%.2d: ", $counter++), $2)), next if $line=~/^(\s+)(.*)$/;

     # headlines
     push(@results, join('', $1, sprintf("%.2d: ", $counter++), $2)), next if $main::_pfilterType eq 'headline' and $line=~/^(=+)(.*)$/;

     # list lines
     push(@results, join('', $1, sprintf("%.2d: ", $counter++), $2)), next if $line=~/^([*#]\s*)(.*)$/ and $main::_pfilterType eq 'list';
     push(@results, join('', $1, sprintf(" (%.2d)", $counter++))), next if $line=~/^(:[^:]+:\s*.*)$/ and $main::_pfilterType eq 'list';

     # other lines
     push(@results, join('', sprintf("%.2d: ", $counter++), $line));
    }

   # complete result
   unshift(@results, $buffer[0]), push(@results, $buffer[1]) if $main::_pfilterType eq 'verbatim block';

   # provide result
   join('', map {"$_\n"} @results);
  }

\END_EMBED