File Coverage

blib/lib/HTML/Strip.pm
Criterion Covered Total %
statement 45 47 95.7
branch 8 10 80.0
condition n/a
subroutine 13 13 100.0
pod 7 7 100.0
total 73 77 94.8


line stmt bran cond sub pod time code
1             package HTML::Strip;
2              
3             require DynaLoader;
4             our @ISA = qw(DynaLoader);
5             our $VERSION = '2.11';
6             bootstrap HTML::Strip $VERSION;
7              
8 12     12   624819 use 5.008;
  12         142  
9 12     12   51 use warnings;
  12         19  
  12         283  
10 12     12   57 use strict;
  12         20  
  12         273  
11              
12 12     12   52 use Carp;
  12         16  
  12         6338  
13              
14             my $_html_entities_p = eval { require HTML::Entities; 1 };
15              
16             my %defaults = (
17             striptags => [qw( title
18             style
19             script
20             applet )],
21             emit_spaces => 1,
22             emit_newlines => 0,
23             decode_entities => 1,
24             filter => $_html_entities_p ? 'filter_entities' : undef,
25             auto_reset => 0,
26             debug => 0,
27             );
28              
29             sub new {
30 17     17 1 19623 my $class = shift;
31 17         95 my $obj = _create();
32 17         39 bless $obj, $class;
33              
34 17         120 my %args = (%defaults, @_);
35 17         113 while( my ($key, $value) = each %args ) {
36 119         193 my $method = "set_${key}";
37 119 50       315 if( $obj->can($method) ) {
38 119         383 $obj->$method($value);
39             } else {
40 0         0 Carp::carp "Invalid setting '$key'";
41             }
42             }
43 17         60 return $obj;
44             }
45              
46             sub set_striptags {
47 19     19 1 48 my ($self, @tags) = @_;
48 19 100       56 if( ref($tags[0]) eq 'ARRAY' ) {
49 18         138 $self->_set_striptags_ref( $tags[0] );
50             } else {
51 1         5 $self->_set_striptags_ref( \@tags );
52             }
53             }
54              
55             {
56             # an inside-out object approach
57             # for the 'filter' attribute
58             my %filter_of;
59              
60             sub set_filter {
61 17     17 1 32 my ($self, $filter) = @_;
62 17         99 $filter_of{0+$self} = $filter;
63             }
64              
65             sub filter {
66 40     40 1 54 my $self = shift;
67 40         102 return $filter_of{0+$self}
68             }
69              
70             # XXX rename _xs_destroy() to DESTROY() in Strip.xs if removing this code
71             sub DESTROY {
72 17     17   3163 my $self = shift;
73 17         55 delete $filter_of{0+$self};
74 17         780 $self->_xs_destroy;
75             }
76             }
77              
78             # $decoded_string = $self->filter_entities( $string )
79             sub filter_entities {
80 38     38 1 49 my $self = shift;
81 38 50       103 if( $self->decode_entities ) {
82 38         289 return HTML::Entities::decode($_[0]);
83             }
84 0         0 return $_[0];
85             }
86              
87             sub _do_filter {
88 40     40   56 my $self = shift;
89 40         76 my $filter = $self->filter;
90             # no filter: return immediately
91 40 100       107 return $_[0] unless defined $filter;
92              
93 39 100       87 if ( !ref $filter ) { # method name
94 38         110 return $self->$filter( @_ );
95             } else { # code ref
96 1         3 return $filter->( @_ );
97             }
98             }
99              
100             sub parse {
101 40     40 1 2601 my ($self, $text) = @_;
102 40         350 my $stripped = $self->_strip_html( $text );
103 40         99 return $self->_do_filter( $stripped );
104             }
105              
106             sub eof {
107 24     24 1 388 my $self = shift;
108 24         81 $self->_reset();
109             }
110              
111             1;
112             __END__