File Coverage

blib/lib/HTML/RewriteAttributes/Resources.pm
Criterion Covered Total %
statement 62 62 100.0
branch 18 22 81.8
condition 11 17 64.7
subroutine 12 12 100.0
pod n/a
total 103 113 91.1


line stmt bran cond sub pod time code
1             package HTML::RewriteAttributes::Resources;
2 6     6   25899 use strict;
  6         14  
  6         253  
3 6     6   28 use warnings;
  6         9  
  6         297  
4 6     6   39 use base 'HTML::RewriteAttributes';
  6         23  
  6         2755  
5 6     6   3490 use URI;
  6         49864  
  6         6434  
6              
7             our $VERSION = '0.03';
8              
9             my %rewritable_attrs = (
10             bgsound => { src => 1 },
11             body => { background => 1 },
12             img => { src => 1 },
13             input => { src => 1 },
14             table => { background => 1 },
15             td => { background => 1 },
16             th => { background => 1 },
17             tr => { background => 1 },
18             );
19              
20             sub _rewrite {
21 6     6   13 my $self = shift;
22 6         14 my $html = shift;
23 6         9 my $cb = shift;
24 6         21 my %args = @_;
25              
26 6         37 $self->{rewrite_inline_css_cb} = $args{inline_css};
27 6         24 $self->{rewrite_inline_imports} = $args{inline_imports};
28 6         30 $self->{rewrite_inline_imports_seen} = {};
29              
30 6         37 $self->SUPER::_rewrite($html, $cb);
31             }
32              
33             sub _should_rewrite {
34 19     19   47 my ($self, $tag, $attr) = @_;
35              
36 19   100     115 return ( $rewritable_attrs{$tag} || {} )->{$attr};
37             }
38              
39             sub _invoke_callback {
40 7     7   14 my $self = shift;
41 7         20 my ($tag, $attr, $value, $attrs, $attr_list) = @_;
42              
43             return $self->{rewrite_callback}
44 7         27 ->( $value, tag => $tag, attr => $attr, rewriter => $self, attrs => $attrs, attr_list => $attr_list );
45             }
46              
47             sub _start_tag {
48 39     39   64 my $self = shift;
49 39         78 my ($tag, $attr, $attrseq, $text) = @_;
50              
51 39 100       91 if ($self->{rewrite_inline_css_cb}) {
52 25 50 66     145 if ($tag eq 'link' and defined $attr->{type} and $attr->{type} eq 'text/css' and defined $attr->{href}) {
      66        
      33        
53 7         22 my $content = $self->_import($attr->{href});
54 7 50       20 if (defined $content) {
55 7         27 $content = $self->_handle_imports($content, $attr->{href});
56 7         18 $self->{rewrite_html} .= "\n\n";
59 7         50 return;
60             }
61             }
62 18 50 66     49 if ($tag eq 'style' and defined $attr->{type} and $attr->{type} eq 'text/css') {
      66        
63 2         4 $self->{rewrite_look_for_style} = 1;
64             }
65             }
66              
67 32         81 $self->SUPER::_start_tag(@_);
68             }
69              
70             sub _default {
71 97     97   186 my ($self, $tag, $attrs, $text) = @_;
72 97 100       183 if (delete $self->{rewrite_look_for_style}) {
73 2         6 $text = $self->_handle_imports($text, '.');
74             }
75              
76 97         200 $self->SUPER::_default($tag, $attrs, $text);
77             }
78              
79             sub _handle_imports {
80 19     19   26 my $self = shift;
81 19         44 my $content = shift;
82 19         30 my $base = shift;
83              
84 19 100       59 return $content if !$self->{rewrite_inline_imports};
85              
86             # here we both try to preserve comments *and* ignore any @import
87             # statements that are in comments
88 10         46 $content =~ s{
89             ( /\* .*? \*/ )
90             |
91             (//[^\n]*)
92             |
93             \@import \s* " ([^"]+) " \s* ;
94             }{
95 25 100       109 defined($1) ? $1
    100          
96             : defined($2) ? $2
97             : $self->_import($self->_absolutify($3, $base))
98             }xsmeg;
99              
100 10         27 return $content;
101             }
102              
103             sub _absolutify {
104 7     7   8 my $self = shift;
105 7         19 my $path = shift;
106 7         9 my $base = shift;
107              
108 7         35 my $uri = URI->new($path);
109 7 50       9460 unless (defined $uri->scheme) {
110 7         170 $uri = $uri->abs($base);
111             }
112              
113 7         1149 return $uri->as_string;
114             }
115              
116             sub _import {
117 14     14   40 my $self = shift;
118 14         25 my $path = shift;
119              
120 14 100       58 return '' if $self->{rewrite_inline_imports_seen}{$path}++;
121              
122             my $content = "\n/* $path */\n"
123 10         34 . $self->{rewrite_inline_css_cb}->($path);
124 10         80 return $self->_handle_imports($content, $path);
125             }
126              
127             1;
128              
129             __END__