\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