use warnings;
use strict;
print html_filter(<<'END_HTML', qw/pre strong i/), "\n";
aaa
bbb
cccdddeeefffggg
END_HTML
use Mojo::DOM;
sub html_filter {
my $html = shift;
my %allowed = map {$_=>1} @_;
my $walk; $walk = sub {
my ($in, $out) = @_;
for my $n ( @{ $in->child_nodes } ) {
if ( $n->type eq 'cdata' || $n->type eq 'text' )
{ $out->append_content($n->content) }
elsif ( $n->type eq 'tag' ) {
if ($allowed{$n->tag}) {
my $t = $out->new_tag( $n->tag, %{$n->attr} )
->child_nodes->first;
$walk->($n, $t);
$out->append_content($t);
} else { $walk->($n, $out) }
} # ignore other node types for now
}
return $out;
};
return $walk->(Mojo::DOM->new($html), Mojo::DOM->new)->to_string;
}
__END__
aaabbb
cccdddeeefffggg