HTML-FormFu
view release on metacpan or search on metacpan
lib/HTML/FormFu/OutputProcessor/StripWhitespace.pm view on Meta::CPAN
use strict;
package HTML::FormFu::OutputProcessor::StripWhitespace;
$HTML::FormFu::OutputProcessor::StripWhitespace::VERSION = '2.07';
# ABSTRACT: Strip shitespace from HTML output
use Moose;
use MooseX::Attribute::Chained;
extends 'HTML::FormFu::OutputProcessor';
use HTML::FormFu::Constants qw( $EMPTY_STR );
use HTML::TokeParser::Simple;
use List::Util 1.33 qw( any );
has collapse_tags => (
is => 'rw',
default => sub {
[ qw(
fieldset
form
hr
legend
optgroup
option
table
td
th
tr
) ];
},
lazy => 1,
traits => ['Chained'],
);
has collapse_consecutive_tags => (
is => 'rw',
default => sub {
[ qw(
span
div
) ];
},
lazy => 1,
traits => ['Chained'],
);
sub process {
my ( $self, $input ) = @_;
my $parser = HTML::TokeParser::Simple->new( \$input );
my @tokens;
while ( my $token = $parser->get_token ) {
push @tokens, $token;
}
my $iter
= HTML::FormFu::OutputProcessor::StripWhitespace::_iter->new(@tokens);
my @collapse = @{ $self->collapse_tags };
my @consecutive = @{ $self->collapse_consecutive_tags };
my $output = $EMPTY_STR;
while ( defined( my $token = $iter->next ) ) {
if ( $token->is_start_tag ) {
my $tag = $token->get_tag;
my $prev_tag = $iter->prev_tag_name;
if ( any { $tag eq $_ } @collapse ) {
# strip \s from before us
$output =~ s/ \s+ \z //x;
}
elsif ( defined $prev_tag ) {
# strip \s between <start> <start>
for my $consec (@consecutive) {
if ( $tag eq $consec && $tag eq $prev_tag ) {
$output =~ s/ \s+ \z //x;
}
}
( run in 2.125 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )