File Coverage

lib/OODoc/Export.pm
Criterion Covered Total %
statement 18 93 19.3
branch 0 34 0.0
condition 0 20 0.0
subroutine 6 26 23.0
pod 14 15 93.3
total 38 188 20.2


line stmt bran cond sub pod time code
1             # This code is part of Perl distribution OODoc version 3.05.
2             # The POD got stripped from this file by OODoc version 3.05.
3             # For contributors see file ChangeLog.
4              
5             # This software is copyright (c) 2003-2025 by Mark Overmeer.
6              
7             # This is free software; you can redistribute it and/or modify it under
8             # the same terms as the Perl 5 programming language system itself.
9             # SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later
10              
11              
12             package OODoc::Export;{
13             our $VERSION = '3.05';
14             }
15              
16 1     1   1655 use parent 'OODoc::Object';
  1         2  
  1         13  
17              
18 1     1   97 use strict;
  1         2  
  1         33  
19 1     1   7 use warnings;
  1         2  
  1         115  
20              
21 1     1   7 use Log::Report 'oodoc';
  1         2  
  1         11  
22              
23 1     1   451 use HTML::Entities qw/encode_entities/;
  1         2  
  1         118  
24 1     1   9 use POSIX qw/strftime/;
  1         2  
  1         11  
25              
26             our %exporters = (
27             json => 'OODoc::Export::JSON',
28             );
29              
30             #--------------------
31              
32             sub new(%)
33 0     0 1   { my ($class, %args) = @_;
34              
35 0 0         $class eq __PACKAGE__
36             or return $class->SUPER::new(%args);
37              
38 0 0         my $serial = $args{serializer} or panic;
39              
40 0 0         my $pkg = $exporters{$serial}
41             or error __x"exporter serializer '{name}' is unknown.";
42              
43 0           eval "require $pkg";
44 0 0         $@ and error __x"exporter {name} has compilation errors: {err}", name => $serial, err => $@;
45              
46 0           $pkg->new(%args);
47             }
48              
49             sub init($)
50 0     0 0   { my ($self, $args) = @_;
51 0           $self->SUPER::init($args);
52 0 0         $self->{OE_serial} = delete $args->{serializer} or panic;
53 0 0         $self->{OE_markup} = my $markup = delete $args->{markup} or panic;
54              
55 0 0         $markup eq 'html' # avoid producing errors in every method
56             or error __x"only HTML markup is currently supported, found {style UNKNOWN}.", style => $markup;
57              
58 0           $self;
59             }
60              
61             #--------------------
62              
63 0     0 1   sub serializer() { $_[0]->{OE_serial} }
64 0     0 1   sub markupStyle() { $_[0]->{OE_markup} }
65 0     0 1   sub parser() { $_[0]->{OE_parser} }
66 0     0 1   sub format() { $_[0]->{OE_format} }
67              
68             #--------------------
69              
70             sub tree($%)
71 0     0 1   { my ($self, $doc, %args) = @_;
72 0           $args{exporter} = $self;
73              
74 0           my $pubindex = +{};
75 0           $self->_publicationIndex($pubindex);
76              
77 0           my $selected_manuals = $args{manuals};
78 0 0         my %need_manual = map +($_ => 1), @{$selected_manuals || []};
  0            
79 0           my @podtail_chapters = $self->podChapters($args{podtail});
80              
81 0           my %man;
82 0           my $manindex = $doc->index;
83              
84 0           foreach my $package (sort $manindex->packageNames)
85             {
86 0           foreach my $manual ($manindex->manualsForPackage($package))
87 0 0 0       { !$selected_manuals || $need_manual{$manual} or next;
88 0 0         my $man = $manual->publish(\%args) or next;
89              
90 0           push @{$man->{chapters}}, @podtail_chapters;
  0            
91 0           $man{$manual->name} = $man->{id};
92             }
93             }
94              
95 0   0       my $meta = $args{meta} || {};
96 0           my %meta = map +($_ => $self->markup($meta->{$_}) ), keys %$meta;
97              
98             +{
99             project => $self->markup($doc->project),
100             distribution => $doc->distribution,
101             version => $doc->version,
102             manuals => \%man,
103             meta => \%meta,
104             distributions => $args{distributions} || {},
105 0   0       index => $pubindex,
      0        
      0        
106              
107             generated_by => +{
108             program => $0,
109             program_version => $main::VERSION // undef,
110             oodoc_version => $OODoc::VERSION // 'devel',
111             created => (strftime "%F %T", localtime),
112             },
113             };
114             }
115              
116 0     0 1   sub publish { panic }
117              
118              
119             sub _formatterHtml($$)
120 0     0     { my ($self, $manual, $parser) = @_;
121              
122             sub {
123             # called with $html, %settings
124             $parser->cleanupHtml($manual, @_, create_link => sub {
125             # called with ($manual, ...);
126 0           my (undef, $object, $html, $settings) = @_;
127 0   0       $html //= encode_entities $object->name;
128 0           my $unique = $object->unique;
129 0           qq{$html};
130 0     0     });
131 0           };
132             }
133              
134             sub _formatterPod($$)
135 0     0     { my ($self, $manual, $parser) = @_;
136              
137             sub {
138             # called with $text, %settings
139             $parser->cleanupPod($manual, @_, create_link => sub {
140             # called with ($manual, ...);
141 0           my (undef, $object, $text, $settings) = @_;
142 0           OODoc::Format::Pod->link($manual, $object, $text, $settings);
143 0     0     });
144 0           };
145             }
146              
147             sub processingManual($)
148 0     0 1   { my ($self, $manual) = @_;
149 0 0         my $parser = $self->{OE_parser} = defined $manual ? $manual->parser : undef;
150              
151 0 0         if(!defined $manual)
152 0           { delete $self->{OE_parser};
153 0     0     $self->{OE_format} = sub { panic };
  0            
154 0           return;
155             }
156              
157 0           my $style = $self->markupStyle;
158             $self->{OE_format}
159 0 0         = $style eq 'html' ? $self->_formatterHtml($manual, $parser)
    0          
160             : $style eq 'pod' ? $self->_formatterPod($manual, $parser)
161             : panic $style;
162              
163 0           $self;
164             }
165              
166              
167             sub markup($)
168 0     0 1   { my ($self, $string) = @_;
169 0 0 0       defined $string && $self->markupStyle eq 'html' ? encode_entities $string : $string;
170             }
171              
172              
173 0     0 1   sub boolean($) { !! $_[1] }
174              
175              
176             sub markupBlock($%)
177 0     0 1   { my ($self, $text, %args) = @_;
178 0           $self->format->($text, %args);
179             }
180              
181              
182             sub markupString($%)
183 0     0 1   { my ($self, $string, %args) = @_;
184 0           my $up = $self->format->($string, %args);
185 0 0         $self->markupStyle eq 'html' or return $up;
186              
187 0           $up =~ s!

\s*

!
!grs # keep line-breaks

188             =~ s!!!gr # remove paragraphing
189             =~ s!\!!gr;
190             }
191              
192              
193             sub podChapters($)
194 0     0 1   { my ($self, $pod) = @_;
195 0 0 0       defined $pod && length $pod or return ();
196              
197 0           my $parser = OODoc::Parser::Markov->new; # supports plain POD
198             ...
199 0           }
200              
201              
202             sub referTo($$)
203 0     0 1   { my ($self, $manual, $object) = @_;
204 0           $self->parser->formatReferTo($manual, $object);
205             }
206              
207             #--------------------
208              
209             1;