File Coverage

blib/lib/Pod/Confluence.pm
Criterion Covered Total %
statement 131 145 90.3
branch 25 28 89.2
condition 3 4 75.0
subroutine 38 42 90.4
pod 1 31 3.2
total 198 250 79.2


line stmt bran cond sub pod time code
1 1     1   34981 use strict;
  1         1  
  1         23  
2 1     1   3 use warnings;
  1         1  
  1         43  
3              
4             package Pod::Confluence;
5             $Pod::Confluence::VERSION = '1.00';
6             # ABSTRACT: Converts pod to confluence flavored markdown
7             # PODNAME: Pod::Confluence
8              
9 1     1   3 use parent qw(Pod::Simple::Methody);
  1         0  
  1         6  
10              
11 1     1   22881 use HTML::Entities;
  1         3900  
  1         77  
12 1     1   398 use Log::Any;
  1         6268  
  1         4  
13              
14             my $logger = Log::Any->get_logger();
15              
16             sub new {
17 15     15 1 19557 return shift->Pod::Simple::Methody::new()->_init(@_);
18             }
19              
20             sub _confluence_macro_end {
21 1     1   2 my ( $self, %options ) = @_;
22              
23 1 50       3 my @optional_elements = ( ( $options{has_text} ? ']]>' : () ), );
24              
25 1         4 return join( '', @optional_elements, '' );
26             }
27              
28             sub _confluence_macro_start {
29 16     16   25 my ( $self, $name, %options ) = @_;
30 16   100     55 my $parameters = $options{parameters} || {};
31              
32             my @optional_elements = (
33 1         5 ( map {"$parameters->{$_}"}
34             keys(%$parameters)
35             ),
36 16 100       42 ( $options{has_text} ? '
37             );
38              
39             return join( '',
40             "
41 16 100       86 ( $options{self_close} ? ' /' : '' ), ">", @optional_elements );
42             }
43              
44             sub end_B {
45 1     1 0 6 my ( $self, $attribute_hash ) = @_;
46 1         3 $self->_print('');
47             }
48              
49             sub end_C {
50 1     1 0 6 my ( $self, $attribute_hash ) = @_;
51 1         2 $self->_print('');
52             }
53              
54             sub end_F {
55 1     1 0 6 my ( $self, $attribute_hash ) = @_;
56 1         3 $self->_print('');
57             }
58              
59             sub end_head1 {
60 6     6 0 27 my ( $self, $attribute_hash ) = @_;
61 6         9 $self->_print('');
62 6         23 pop( @{ $self->{element_stack} } );
  6         13  
63             }
64              
65             sub end_head2 {
66 2     2 0 10 my ( $self, $attribute_hash ) = @_;
67 2         5 $self->_print('');
68 2         7 pop( @{ $self->{element_stack} } );
  2         6  
69             }
70              
71             sub end_head3 {
72 0     0 0 0 my ( $self, $attribute_hash ) = @_;
73 0         0 $self->_print('');
74 0         0 pop( @{ $self->{element_stack} } );
  0         0  
75             }
76              
77             sub end_head4 {
78 0     0 0 0 my ( $self, $attribute_hash ) = @_;
79 0         0 $self->_print('');
80 0         0 pop( @{ $self->{element_stack} } );
  0         0  
81             }
82              
83             sub end_I {
84 1     1 0 6 my ( $self, $attribute_hash ) = @_;
85 1         2 $self->_print('');
86             }
87              
88             sub end_item_text {
89 2     2 0 10 my ( $self, $attribute_hash ) = @_;
90 2         3 $self->_print('');
91 2         9 $self->end_Para();
92             }
93              
94             sub end_L {
95 5     5 0 24 my ( $self, $attribute_hash ) = @_;
96 5 100       12 if ( $self->{link_type} eq 'pod' ) {
    50          
97 2         4 $self->_print( ']]>' . '' );
98             }
99             elsif ( $self->{link_type} eq 'url' ) {
100 3         4 $self->_print('');
101             }
102 5         26 delete( $self->{link_type} );
103             }
104              
105             sub end_over_text {
106 1     1 0 6 my ( $self, $attribute_hash ) = @_;
107 1         4 $self->{indent} -= 2;
108             }
109              
110             sub end_Para {
111 20     20 0 78 my ( $self, $attribute_hash ) = @_;
112 20         24 $self->_print('

');
113 20         92 pop( @{ $self->{element_stack} } );
  20         37  
114             }
115              
116             sub end_S {
117 1     1 0 6 my ( $self, $attribute_hash ) = @_;
118 1         3 $self->{in_non_breaking} = 0;
119             }
120              
121             sub end_Verbatim {
122 1     1 0 7 my ( $self, $attribute_hash ) = @_;
123 1         1 $self->{in_cdata} = 0;
124 1         4 $self->_print( $self->_confluence_macro_end( has_text => 1 ) );
125 1         5 pop( @{ $self->{element_stack} } );
  1         3  
126             }
127              
128             sub _handle_element_end {
129 55     55   863 $logger->tracef( '_handle_element_end(%s,%s)', $_[1], $_[2] );
130 55         328 Pod::Simple::Methody::_handle_element_end(@_);
131             }
132              
133             sub _handle_element_start {
134 55     55   8749 $logger->tracef( '_handle_element_start(%s,%s)', $_[1], $_[2] );
135 55         349 Pod::Simple::Methody::_handle_element_start(@_);
136             }
137              
138             sub handle_text {
139 38     38 0 338 my ( $self, $text ) = @_;
140              
141 38 100       103 $text = encode_entities($text) unless ( $self->{in_cdata} );
142 38 100       307 $text =~ s/[ \t]/ /g if ( $self->{in_non_breaking} );
143              
144 38         58 $logger->tracef( 'handle_text(%s)', $text );
145 38         184 $self->_print($text);
146             }
147              
148             sub _init {
149 15     15   226 my ( $self, %options ) = @_;
150              
151 15         24 $self->{space_key} = $options{space_key};
152             $self->{packages_in_space} =
153 15         12 { map { $_ => 1 } @{ $options{packages_in_space} } };
  2         3  
  15         31  
154 15   50     52 $self->{confluence_schema_version} = $options{confluence_schema_version} || 1;
155              
156 15         17 $self->{element_stack} = [];
157 15         24 $self->{indent} = 0;
158              
159 15         25 return $self;
160             }
161              
162             sub _print {
163 133     133   139 my ( $self, $text ) = @_;
164 133         77 print( { $self->{output_fh} } $text );
  133         223  
165             }
166              
167             sub start_B {
168 1     1 0 5 my ( $self, $attribute_hash ) = @_;
169 1         3 $self->_print('');
170             }
171              
172             sub start_C {
173 1     1 0 6 my ( $self, $attribute_hash ) = @_;
174 1         3 $self->_print('');
175             }
176              
177             sub start_F {
178 1     1 0 5 my ( $self, $attribute_hash ) = @_;
179 1         3 $self->_print('');
180             }
181              
182             sub start_Document {
183 15     15 0 77 my ( $self, $attribute_hash ) = @_;
184 15         26 $self->_print( '

' . $self->_confluence_macro_start( 'toc', self_close => 1 ) . '

' );
185             }
186              
187             sub start_head1 {
188 6     6 0 27 my ( $self, $attribute_hash ) = @_;
189 6         9 $self->_print('

');

190 6         31 $self->{indent} = 0;
191             }
192              
193             sub start_head2 {
194 2     2 0 9 my ( $self, $attribute_hash ) = @_;
195 2         3 $self->_print('

');

196 2         10 $self->{indent} = 0;
197             }
198              
199             sub start_head3 {
200 0     0 0 0 my ( $self, $attribute_hash ) = @_;
201 0         0 $self->_print('

');

202 0         0 $self->{indent} = 0;
203             }
204              
205             sub start_head4 {
206 0     0 0 0 my ( $self, $attribute_hash ) = @_;
207 0         0 $self->_print('

');

208 0         0 $self->{indent} = 0;
209             }
210              
211             sub start_I {
212 1     1 0 5 my ( $self, $attribute_hash ) = @_;
213 1         2 $self->_print('');
214             }
215              
216             sub start_item_text {
217 2     2 0 10 my ( $self, $attribute_hash ) = @_;
218 2         3 $self->{indent} -= 1;
219 2         2 $self->start_Para();
220 2         10 $self->{indent} += 1;
221 2         4 $self->_print('');
222             }
223              
224             sub start_L {
225 5     5 0 21 my ( $self, $attribute_hash ) = @_;
226 5         7 $self->{link_type} = $attribute_hash->{type};
227 5 100       14 if ( $attribute_hash->{type} eq 'pod' ) {
    50          
228 4 100       8 if ( $self->{packages_in_space}{"$attribute_hash->{to}"} ) {
229 2         31 $self->{link_type} = 'pod';
230             $self->_print(
231             ( $attribute_hash->{section}
232 2 100       7 ? ""
233             : ''
234             )
235             . ""
236             . '
237             );
238             }
239             else {
240 2         19 my $url = "https://metacpan.org/pod/$attribute_hash->{to}";
241 2         15 my $section = $attribute_hash->{section};
242 2 100       5 if ($section) {
243 1         14 $section =~ s/[^a-zA-Z0-9]+/-/g;
244 1         19 $section =~ s/-$//g;
245 1         2 $url .= "#$section";
246             }
247 2         2 $self->{link_type} = 'url';
248 2         6 $self->_print("");
249             }
250             }
251             elsif ( $attribute_hash->{type} eq 'url' ) {
252 1         3 $self->{link_type} = 'url';
253 1         4 $self->_print("");
254             }
255             }
256              
257             sub start_over_text {
258 1     1 0 6 my ( $self, $attribute_hash ) = @_;
259 1         2 $self->{indent} += 2;
260             }
261              
262             sub start_Para {
263 20     20 0 81 my ( $self, $attribute_hash ) = @_;
264 20         16 my $style;
265 20 100       36 if ( $self->{indent} ) {
266 4         7 $style = 'style="margin-left: ' . ( $self->{indent} * 30 ) . 'px;"';
267             }
268 20 100       43 $self->_print( $style ? "

" : '

' );

269             }
270              
271             sub start_S {
272 1     1 0 5 my ( $self, $attribute_hash ) = @_;
273 1         3 $self->{in_non_breaking} = 1;
274             }
275              
276             sub start_Verbatim {
277 1     1 0 6 my ( $self, $attribute_hash ) = @_;
278 1         4 $self->_print(
279             $self->_confluence_macro_start(
280             'code',
281             has_text => 1,
282             parameters => { language => 'perl' }
283             )
284             );
285 1         7 $self->{in_cdata} = 1;
286             }
287              
288             1;
289              
290             __END__