File Coverage

blib/lib/HTML/RewriteAttributes.pm
Criterion Covered Total %
statement 50 56 89.2
branch 9 12 75.0
condition 1 6 16.6
subroutine 14 16 87.5
pod 2 3 66.6
total 76 93 81.7


line stmt bran cond sub pod time code
1             package HTML::RewriteAttributes;
2 11     11   124140 use strict;
  11         32  
  11         428  
3 11     11   55 use warnings;
  11         20  
  11         563  
4 11     11   60 use base 'HTML::Parser';
  11         43  
  11         7633  
5 11     11   75746 use Carp 'croak';
  11         27  
  11         937  
6 11     11   78 use HTML::Entities 'encode_entities';
  11         25  
  11         8435  
7              
8             our $VERSION = '0.06';
9              
10             sub new {
11 17     17 1 36 my $class = shift;
12 17         322 return $class->SUPER::new(
13             start_h => [ '_start_tag', "self,tagname,attr,attrseq,text" ],
14             default_h => [ '_default', "self,tagname,attr,text" ],
15             );
16             }
17              
18             sub rewrite {
19 17     17 1 3229625 my $self = shift;
20 17 50       130 $self = $self->new if !ref($self);
21 17         1276 $self->_rewrite(@_);
22             }
23              
24             sub _rewrite {
25 17     17   43 my $self = shift;
26 17         48 my $html = shift;
27 17   33 0   72 my $cb = shift || sub { $self->rewrite_resource(@_) };
  0         0  
28              
29 17         85 $self->_begin_rewriting($cb);
30              
31 17         271 $self->parse($html);
32 17         205 $self->eof;
33              
34 17         123 $self->_done_rewriting;
35              
36 17         171 return $self->{rewrite_html};
37             }
38              
39             sub rewrite_resource {
40 0     0 0 0 my $self = shift;
41 0   0     0 my $class = ref($self) || $self;
42              
43 0         0 my $error = "You must specify a callback to $class->rewrite";
44 0 0       0 $error .= " or define $class->rewrite_resource" if $class ne __PACKAGE__;
45 0         0 croak "$error.";
46             }
47              
48             sub _begin_rewriting {
49 17     17   75 my $self = shift;
50 17         34 my $cb = shift;
51              
52 17         111 $self->{rewrite_html} = '';
53 17         64 $self->{rewrite_callback} = $cb;
54             }
55              
56       17     sub _done_rewriting { }
57              
58 22     22   63 sub _should_rewrite { 1 }
59              
60             sub _start_tag {
61 97     97   253 my ($self, $tag, $attrs, $attrseq, $text) = @_;
62              
63 97         188 $self->{rewrite_html} .= "<$tag";
64              
65 97         185 my @attr_list;
66 97         234 for my $attr (@$attrseq) {
67 105 100       279 next if $attr eq '/';
68              
69 77 100       271 if ($self->_should_rewrite($tag, $attr)) {
70 55         257 $attrs->{$attr} = $self->_invoke_callback($tag, $attr, $attrs->{$attr}, $attrs, \@attr_list);
71 55 100       665 next if !defined($attrs->{$attr});
72             }
73              
74 71         229 push @attr_list, $attr;
75             }
76              
77 97         205 for my $attr (@attr_list) {
78 73         696 $self->{rewrite_html} .= sprintf ' %s="%s"', $attr, encode_entities( $attrs->{$attr} );
79             }
80              
81 97 100       1702 $self->{rewrite_html} .= ' /' if $attrs->{'/'};
82 97         771 $self->{rewrite_html} .= '>';
83             }
84              
85             sub _default {
86 251     251   598 my ($self, $tag, $attrs, $text) = @_;
87 251         1409 $self->{rewrite_html} .= $text;
88             }
89              
90             sub _invoke_callback {
91 48     48   86 my $self = shift;
92 48         179 return $self->{rewrite_callback}->(@_);
93             }
94              
95             1;
96              
97             __END__