File Coverage

blib/lib/HTML/Rebase.pm
Criterion Covered Total %
statement 38 40 95.0
branch 3 6 50.0
condition n/a
subroutine 9 9 100.0
pod 2 5 40.0
total 52 60 86.6


line stmt bran cond sub pod time code
1             package HTML::Rebase;
2 7     7   387606 use strict;
  7         62  
  7         205  
3 7     7   2996 use URI::WithBase;
  7         52984  
  7         186  
4 7     7   3015 use URI::URL;
  7         15187  
  7         360  
5 7     7   49 use Exporter 'import';
  7         13  
  7         4114  
6             our $VERSION = '0.05';
7             our @EXPORT_OK= qw(rebase_html rebase_css rebase_html_inplace rebase_css_inplace);
8              
9             =head1 NAME
10              
11             HTML::Rebase - rewrite HTML links to be relative to a given URL
12              
13             =head1 SYNOPSIS
14              
15             use HTML::Rebase qw(rebase_html rebase_css);
16             my $html = <
17            
18            
19            
20            
21            
22             Go to Perlmonks.org
23             Go to home page/a>
24            
25            
26             HTML
27              
28             my $local_html = rebase_html( "http://localhost:5000/about.html", $html );
29             print $local_html;
30             __END__
31            
32            
33            
34            
35            
36             Go to Perlmonks.org
37             Go to home page/a>
38            
39            
40              
41             =head2 C<< rebase_html >>
42              
43             Rewrites all HTML links to be relative to the given URL. This
44             only rewrites things that look like C<< src= >> and C<< href= >> attributes.
45             Unquoted attributes will not be rewritten. This should be fixed.
46              
47             =cut
48              
49             sub rebase_html {
50 8     8 1 3233 my($url, $html)= @_;
51            
52             #croak "Can only rewrite relative to an absolute URL!"
53             # unless $url->is_absolute;
54            
55             # Rewrite absolute to relative
56 8         87 rebase_html_inplace( $url, $html );
57            
58 8         216 $html
59             }
60              
61             sub rebase_html_inplace {
62 8     8 0 18 my $url = shift;
63 8         38 $url = URI::URL->new( $url );
64            
65             #croak "Can only rewrite relative to an absolute URL!"
66             # unless $url->is_absolute;
67              
68             # Check if we have a tag which should replace the user-supplied URL
69 8 100       30657 if( $_[0] =~ s!<\s*\bbase\b[^>]+\bhref=([^>]+)>!!i ) {
70             # Extract the HREF:
71 3         7 my $href= $1;
72 3 50       16 if( $href =~ m!^(['"])(.*?)\1! ) {
    0          
73             # href="..." , with quotes
74 3         8 $href = $2;
75             } elsif( $href =~ m!^([^>"' ]+)! ) {
76             # href=... , without quotes
77 0         0 $href = $1;
78             } else {
79 0         0 die "Should not get here, weirdo href= tag: [$href]"
80             };
81            
82 3         4 my $old_url = $url;
83 3         6 $url = relative_url( $url, $href );
84             #warn "base: $old_url / $href => $url";
85             };
86              
87             # Rewrite absolute to relative
88             # Rewrite all tags with quotes
89 8         78 $_[0] =~ s!((?:\bsrc|\bhref)\s*=\s*(["']))(.+?)\2!$1 . relative_url($url,"$3") . $2!ige;
  6         64  
90             # Rewrite all tags without quotes
91 8         92 $_[0] =~ s!((?:\bsrc|\bhref)\s*=\s*)([^>"' ]+)!$1 . '"' . relative_url($url,"$2") . '"'!ige;
  4         20  
92             }
93              
94             =head2 C<< rebase_css >>
95              
96             Rewrites all CSS links to be relative to the given URL. This
97             only rewrites things that look like C<< url( ... ) >> .
98              
99             =cut
100              
101             sub rebase_css {
102 1     1 1 81 my($url, $css)= @_;
103            
104             #croak "Can only rewrite relative to an absolute URL!"
105             # unless $url->is_absolute;
106              
107             # Rewrite absolute to relative
108 1         4 rebase_css_inplace( $url, $css );
109            
110 1         23 $css
111             }
112              
113             sub rebase_css_inplace {
114 1     1 0 2 my $url = shift;
115 1         7 $url = URI::URL->new( $url );
116            
117             #croak "Can only rewrite relative to an absolute URL!"
118             # unless $url->is_absolute;
119              
120             # Rewrite absolute to relative
121 1         7911 $_[0] =~ s!(url\(\s*(["']?))([^)]+?)\2!$1 . relative_url($url,"$3") . $2!ige;
  3         44  
122             }
123              
124             sub relative_url {
125 18     18 0 8445 my( $curr, $url ) = @_;
126 18         67 my $res = URI::WithBase->new( $url, $curr )->abs;
127 18         5589 $res = $res->rel();
128            
129 18         10111 $res
130             };
131              
132             =head1 CAVEATS
133              
134             =head2 Does handle the C<< >> tag in a specific way
135              
136             If the HTML contains a C<< >> tag, it's C<< href= >> attribute
137             is used as the page URL relative to which links are rewritten.
138              
139             =head2 Uses regular expressions to do all parsing
140              
141             Instead of parsing the HTML into a DOM, performing the modifications and
142             then writing the DOM back out, this module uses a simplicistic regular
143             expressions to recognize C<< href= >> and C<< src= >> attributes and
144             to rewrite them.
145              
146             =head1 REPOSITORY
147              
148             The public repository of this module is
149             L.
150              
151             =head1 SUPPORT
152              
153             The public support forum of this module is
154             L.
155              
156             =head1 BUG TRACKER
157              
158             Please report bugs in this module via the RT CPAN bug queue at
159             L
160             or via mail to L.
161              
162             =head1 AUTHOR
163              
164             Max Maischein C
165              
166             =head1 COPYRIGHT (c)
167              
168             Copyright 2015-2018 by Max Maischein C.
169              
170             =head1 LICENSE
171              
172             This module is released under the same terms as Perl itself.
173              
174             =cut
175              
176             1;