File Coverage

lib/Pod/Hyperlink/BounceURL.pm
Criterion Covered Total %
statement 25 26 96.1
branch 5 6 83.3
condition 8 9 88.8
subroutine 6 7 85.7
pod 2 4 50.0
total 46 52 88.4


line stmt bran cond sub pod time code
1             package Pod::Hyperlink::BounceURL;
2 1     1   35449 use Pod::ParseUtils;
  1         9807  
  1         39  
3 1     1   1000 use URI::Escape;
  1         1683  
  1         90  
4              
5 1     1   9 use vars qw($VERSION @ISA);
  1         2  
  1         558  
6             $VERSION = ('$Revision: 1.7 $' =~ /([\d\.]+)/)[0];
7             @ISA = 'Pod::Hyperlink';
8              
9             sub configure {
10 1     1 1 696 my $self = shift;
11 1         5 my %opts = @_;
12 1 50       6 if ($opts{'URL'}) {
13 1         7 $self->{'___url'} = $opts{'URL'};
14             }
15             }
16              
17             sub type {
18 36     36 1 4098 my $self = shift;
19              
20             # very special case - if we are called explicitly (rather than by our superclass) and with other conditions
21             # 1) a page type with a page value
22             # 2) an item type with a page value
23             # We don't care about any other cases
24 36         85 my ($callpack) = caller();
25 36 100       179 if ($callpack ne $ISA[0]) {
26 18         147 DUMP(__PACKAGE__."::type", [ $self, @_ ]);
27             } else {
28 18         53 DUMP(" indirect call of ".__PACKAGE__."::type", [ $self, @_ ]);
29             }
30            
31 36 100 100     1512 if (
      66        
      100        
32             ($callpack ne $ISA[0])
33             && (($self->{'-type'} eq 'page') || ($self->{'-type'} eq 'item'))
34             && $self->{'-page'}
35             ) {
36 13         41 my $page_esc = uri_escape( $self->{'-page'} );
37 13         226 my $node_esc = uri_escape( $self->{'-node'} );
38 13         174 my $url = sprintf( $self->{'___url'}, $page_esc, $node_esc );
39 13         46 return "bounceurl:$url";
40             }
41             # in all other cases, let the superclass handle the work
42 23         97 return $self->SUPER::type(@_);
43             }
44              
45             # debug hooks
46 0     0 0 0 sub TRACE {}
47 36     36 0 53 sub DUMP {}
48              
49             1;
50              
51             =head1 NAME
52              
53             Pod::Hyperlink::BounceURL - Allow off-page links in POD to point to a URL
54              
55             =head1 SYNOPSIS
56              
57             use Pod::Hyperlink::BounceURL;
58             my $linkparser = new Pod::Hyperlink::BounceURL;
59             $linkparser->configure( URL => '/cgi-perl/support/bounce.pl?page=%s' );
60             my $pod2xhtml = new Pod::Xhtml( LinkParser => $linkparser );
61              
62             =head1 DESCRIPTION
63              
64             Some links in your pod may not be resolveable by Pod::Hyperlink, e.g. CSome::ModuleE> -
65             this module allows you to detect such links and generate a hyperlink instead of some static text.
66             The target URL will probably be some kind of dynamic webpage or CGI application which can then serve up
67             the relevant page or send a redirect to the page, hence the "bounce" in this module's name.
68              
69             This module overrides the type() method and, for relevant links, will return a string which is
70             "bounceurl:" followed by the URL, instead of returning "page" or "item".
71             Your pod-conversion module can then switch on this case and emit the correct kind of markup.
72             L supports the use of this module.
73              
74             =head1 METHODS
75              
76             =over 4
77              
78             =item configure( %OPTIONS )
79              
80             Set persistent configuration for this object. See L.
81              
82             =item type()
83              
84             Behaves as L's type() method except for the unresolveable links, where the string returned is
85             as described in L.
86              
87             =back
88              
89             =head1 OPTIONS
90              
91             =over 4
92              
93             =item URL
94              
95             The URL to handle the link, which may be absolute or relative, of any protocol - it's just
96             treated as a string and is passed through sprintf(), with two string arguments that are both
97             already URL-escaped.
98              
99             The first argument is the page name, and will always exist. The second argument is the "node" within the page, and may be
100             empty.
101              
102             Insert '%s' where you wish the arguments to be interpolated. The string goes through sprintf() so
103             you should have '%%' where you want an actual percent sign. If you need the arguments in a different order, see
104             the perl-specific features of L.
105              
106             =back
107              
108             =head1 VERSION
109              
110             $Revision: 1.7 $
111              
112             =head1 AUTHOR
113              
114             P Kent Ecpan _at_ bbc _dot_ co _dot_ ukE
115              
116             =head1 COPYRIGHT
117              
118             (c) BBC 2007. This program is free software; you can redistribute it and/or modify it under the GNU GPL.
119              
120             See the file COPYING in this distribution, or http://www.gnu.org/licenses/gpl.txt
121              
122             =cut
123