File Coverage

blib/lib/EPublisher/Target/Plugin/OTRSDoc.pm
Criterion Covered Total %
statement 94 94 100.0
branch 28 28 100.0
condition 7 7 100.0
subroutine 17 17 100.0
pod 1 1 100.0
total 147 147 100.0


line stmt bran cond sub pod time code
1             package EPublisher::Target::Plugin::OTRSDoc;
2              
3             # ABSTRACT: Create HTML version of OTRS documentation
4              
5 8     8   1391789 use strict;
  8         67  
  8         268  
6 8     8   58 use warnings;
  8         29  
  8         288  
7              
8 8     8   40 use File::Basename;
  8         16  
  8         544  
9 8     8   66 use File::Path qw(make_path);
  8         32  
  8         526  
10 8     8   6286 use HTML::Template::Compiled;
  8         443443  
  8         56  
11 8     8   4068 use Pod::Simple::XHTML;
  8         280623  
  8         308  
12              
13 8     8   3731 use EPublisher;
  8         70680  
  8         281  
14 8     8   3327 use EPublisher::Target::Base;
  8         2221  
  8         250  
15 8     8   894 use parent qw(EPublisher::Target::Base);
  8         590  
  8         64  
16              
17             our $VERSION = 1.01;
18              
19             sub deploy {
20 6     6 1 16638 my ($self, $sources) = @_;
21            
22 6 100       14 my @pods = @{ $sources || [] };
  6         49  
23 6 100       22 if ( !@pods ) {
24 5 100       22 @pods = @{ $self->_config->{source} || [] };
  5         19  
25             }
26              
27 6 100       89 return if !@pods;
28            
29 5   100     20 my $encoding = $self->_config->{encoding} || 'utf-8';
30 5   100     63 my $base_url = $self->_config->{base_url} || '';
31 5         46 my $version = 0;
32            
33             my @TOC = map{
34 5         15 (my $name = $_->{title}) =~ s/::/_/g;
  5         21  
35 5         46 { target => join( '/', $base_url, lc( $name ) . '.html'), name => $_->{title} };
36             } @pods;
37            
38 5         18 my $output = $self->_config->{output};
39 5 100 100     298 make_path $output if $output && !-d $output;
40            
41 5         19 for my $pod ( @pods ) {
42 5         55 my $parser = Pod::Simple::XHTML->new;
43 5         870 $parser->index(0);
44            
45 5         43 (my $name = $pod->{title}) =~ s/::/_/g;
46            
47 5         40 $parser->output_string( \my $xhtml );
48 5         5156 $parser->parse_string_document( $pod->{pod} );
49              
50 5         1855 my $template = $self->_config->{template};
51             my %opts = $template ?
52             ( filename => $template ) :
53 5 100       58 ( scalarref => \do { local $/; } );
  3         13  
  3         103  
54            
55 5         62 my $tmpl = HTML::Template::Compiled->new(
56             %opts,
57             );
58            
59 5         30411 $xhtml =~ s{}{};
60 5         29 $xhtml =~ s{}{};
61            
62 5         34 $tmpl->param(
63             TOC => \@TOC,
64             Body => $xhtml,
65             );
66            
67 5         139 my $fh = *STDOUT;
68              
69 5 100       23 if ( $output ) {
70 2         281 open $fh, '>', File::Spec->catfile( $output, lc $name . '.html' );
71 2     2   75 binmode $fh, ":encoding($encoding)";
  2         17  
  2         6  
  2         18  
72             }
73              
74 5         2288 print $fh $tmpl->output;
75              
76 5 100       978 if ( $output ) {
77 2         148 close $fh;
78             }
79             }
80             }
81              
82             ## -------------------------------------------------------------------------- ##
83             ## Change behavour of Pod::Simple::XHTML
84             ## -------------------------------------------------------------------------- ##
85              
86             {
87 8     8   4082 no warnings 'redefine';
  8         19  
  8         4201  
88            
89             *Pod::Simple::XHTML::idify = sub {
90 14     14   5192 my ($self, $t, $not_unique) = @_;
91 14         40 for ($t) {
92 14         31 s/<[^>]+>//g; # Strip HTML.
93 14         76 s/&[^;]+;//g; # Strip entities.
94 14         77 s/^([^a-zA-Z]+)$/pod$1/; # Prepend "pod" if no valid chars.
95 14         80 s/^[^a-zA-Z]+//; # First char must be a letter.
96 14         87 s/[^-a-zA-Z0-9_]+/-/g; # All other chars must be valid.
97             }
98 14 100       93 return $t if $not_unique;
99 10         22 my $i = '';
100 10         52 $i++ while $self->{ids}{"$t$i"}++;
101 10         33 return "$t$i";
102             };
103            
104       4     *Pod::Simple::XHTML::start_Verbatim = sub {};
105            
106             *Pod::Simple::XHTML::end_Verbatim = sub {
107 4     4   204 my ($self) = @_;
108            
109 4         23 $self->{scratch} =~ s{ }{  }g;
110 4         17 $self->{scratch} =~ s{\n}{
}g;
111             #$self->{scratch} = '
' . $self->{scratch} . '
';
112 4         14 $self->{scratch} = '

' . $self->{scratch} . '

';
113            
114 4         12 $self->emit;
115             };
116              
117             *Pod::Simple::XHTML::start_L = sub {
118              
119             # The main code is taken from Pod::Simple::XHTML.
120 14     14   7789 my ( $self, $flags ) = @_;
121 14         29 my ( $type, $to, $section ) = @{$flags}{ 'type', 'to', 'section' };
  14         57  
122 14 100       99 my $url =
    100          
    100          
123             $type eq 'url' ? $to
124             : $type eq 'pod' ? $self->resolve_pod_page_link( $to, $section )
125             : $type eq 'man' ? $self->resolve_man_page_link( $to, $section )
126             : undef;
127              
128             # This is the new/overridden section.
129 14 100       394 if ( defined $url ) {
130 13         50 $url = $self->encode_entities( $url );
131             }
132              
133             # If it's an unknown type, use an attribute-less like HTML.pm.
134 14 100       367 $self->{'scratch'} .= '' : '>' );
135             };
136            
137             *Pod::Simple::XHTML::start_Document = sub {
138 5     5   1358 my ($self) = @_;
139              
140             #my $xhtml_headers =
141             # qq{\n}
142             # . qq{
143             # . qq{ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n}
144             # . qq{ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n} . qq{\n}
145             # . qq{\n}
146             # . qq{\n}
147             # . qq{\n}
148             # . qq{
149             # . qq{content="text/html; charset=utf-8"/>\n}
150             # . qq{
151             # . qq{type="text/css"/>\n}
152             # . qq{\n} . qq{\n}
153             # . qq{\n};
154              
155              
156             #$self->{'scratch'} .= $xhtml_headers;
157 5         27 $self->emit('nowrap');
158             };
159             }
160              
161             1;
162              
163             =pod
164              
165             =encoding UTF-8
166              
167             =head1 NAME
168              
169             EPublisher::Target::Plugin::OTRSDoc - Create HTML version of OTRS documentation
170              
171             =head1 VERSION
172              
173             version 1.01
174              
175             =head1 SYNOPSIS
176              
177             use EPublisher::Target;
178             my $EPub = EPublisher::Target->new( { type => 'OTRSDoc' } );
179             $EPub->deploy;
180              
181             =head1 METHODS
182              
183             =head2 deploy
184              
185             creates the output.
186              
187             $EPub->deploy;
188              
189             =head1 YAML SPEC
190              
191             EPubTest:
192             source:
193             #...
194             target:
195             type: ÓTRSDoc
196              
197             =head1 TODO
198              
199             =head2 document methods
200              
201             =head1 AUTHOR
202              
203             Renee Bäcker
204              
205             =head1 COPYRIGHT AND LICENSE
206              
207             This software is Copyright (c) 2013 by Renee Bäcker.
208              
209             This is free software, licensed under:
210              
211             The Artistic License 2.0 (GPL Compatible)
212              
213             =cut
214              
215             __DATA__