rt 4.2.14 (#13852)
[freeside.git] / rt / lib / RT / Pod / HTMLBatch.pm
1 # BEGIN BPS TAGGED BLOCK {{{
2 #
3 # COPYRIGHT:
4 #
5 # This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
6 #                                          <sales@bestpractical.com>
7 #
8 # (Except where explicitly superseded by other copyright notices)
9 #
10 #
11 # LICENSE:
12 #
13 # This work is made available to you under the terms of Version 2 of
14 # the GNU General Public License. A copy of that license should have
15 # been provided with this software, but in any event can be snarfed
16 # from www.gnu.org.
17 #
18 # This work is distributed in the hope that it will be useful, but
19 # WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21 # General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software
25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26 # 02110-1301 or visit their web page on the internet at
27 # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
28 #
29 #
30 # CONTRIBUTION SUBMISSION POLICY:
31 #
32 # (The following paragraph is not intended to limit the rights granted
33 # to you to modify and distribute this software under the terms of
34 # the GNU General Public License and is only of importance to you if
35 # you choose to contribute your changes and enhancements to the
36 # community by submitting them to Best Practical Solutions, LLC.)
37 #
38 # By intentionally submitting any modifications, corrections or
39 # derivatives to this work, or any other work intended for use with
40 # Request Tracker, to Best Practical Solutions, LLC, you confirm that
41 # you are the copyright holder for those contributions and you grant
42 # Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
43 # royalty-free, perpetual, license to use, copy, create derivative
44 # works based on those contributions, and sublicense and distribute
45 # those contributions and any derivatives thereof.
46 #
47 # END BPS TAGGED BLOCK }}}
48
49 use strict;
50 use warnings;
51
52 package RT::Pod::HTMLBatch;
53 use base 'Pod::Simple::HTMLBatch';
54
55 use List::MoreUtils qw/all/;
56
57 use RT::Pod::Search;
58 use RT::Pod::HTML;
59
60 sub new {
61     my $self = shift->SUPER::new(@_);
62     $self->verbose(0);
63
64     # Per-page output options
65     $self->css_flurry(0);          # No CSS
66     $self->javascript_flurry(0);   # No JS
67     $self->no_contents_links(1);   # No header/footer "Back to contents" links
68
69     # TOC options
70     $self->index(1);                    # Write a per-page TOC
71     $self->contents_file("index.html"); # Write a global TOC
72
73     $self->html_render_class('RT::Pod::HTML');
74     $self->search_class('RT::Pod::Search');
75
76     return $self;
77 }
78
79 sub classify {
80     my $self = shift;
81     my %info = (@_);
82
83     my $is_install_doc = sub {
84         my %page = @_;
85         local $_ = $page{name};
86         return 1 if /^(README|UPGRADING)/;
87         return 1 if /^RT\w*?_Config$/;
88         return 1 if $_ eq "web_deployment";
89         return 1 if $page{infile} =~ m{^configure(\.ac)?$};
90         return 0;
91     };
92
93     my $section = $info{infile} =~ m{/plugins/([^/]+)}      ? "05 Extension: $1"           :
94                   $info{infile} =~ m{/local/}               ? '04 Local Documenation'      :
95                   $is_install_doc->(%info)                  ? '00 Install and Upgrade '.
96                                                                  'Documentation'           :
97                   $info{infile} =~ m{/(docs|etc)/}          ? '01 User Documentation'      :
98                   $info{infile} =~ m{/bin/}                 ? '02 Utilities (bin)'         :
99                   $info{infile} =~ m{/sbin/}                ? '03 Utilities (sbin)'        :
100                   $info{name}   =~ /^RT::Action/            ? '08 Actions'                 :
101                   $info{name}   =~ /^RT::Condition/         ? '09 Conditions'              :
102                   $info{name}   =~ /^RT(::|$)/              ? '07 Developer Documentation' :
103                   $info{infile} =~ m{/devel/tools/}         ? '20 Utilities (devel/tools)' :
104                                                               '06 Miscellaneous'           ;
105
106     if ($info{infile} =~ m{/(docs|etc)/}) {
107         $info{name} =~ s/_/ /g;
108         $info{name} = join "/", map { ucfirst } split /::/, $info{name};
109     }
110
111     return ($info{name}, $section);
112 }
113
114 sub write_contents_file {
115     my ($self, $to) = @_;
116     return unless $self->contents_file;
117
118     my $file = join "/", $to, $self->contents_file;
119     open my $index, ">", $file
120         or warn "Unable to open index file '$file': $!\n", return;
121
122     my $pages = $self->_contents;
123     return unless @$pages;
124
125     # Classify
126     my %toc;
127     for my $page (@$pages) {
128         my ($name, $infile, $outfile, $pieces) = @$page;
129
130         my ($title, $section) = $self->classify(
131             name    => $name,
132             infile  => $infile,
133         );
134
135         (my $path = $outfile) =~ s{^\Q$to\E/?}{};
136
137         push @{ $toc{$section} }, {
138             name => $title,
139             path => $path,
140         };
141     }
142
143     # Write out index
144     print $index "<dl class='superindex'>\n";
145
146     for my $key (sort keys %toc) {
147         next unless @{ $toc{$key} };
148
149         (my $section = $key) =~ s/^\d+ //;
150         print $index "<dt>", esc($section), "</dt>\n";
151         print $index "<dd>\n";
152
153         my @sorted = sort {
154             my @names = map { $_->{name} } $a, $b;
155
156             # Sort just the upgrading docs descending within everything else
157             @names = reverse @names
158                 if all { /^UPGRADING-/ } @names;
159
160             $names[0] cmp $names[1]
161         } @{ $toc{$key} };
162
163         for my $page (@sorted) {
164             print $index "  <a href='", esc($page->{path}), "'>",
165                                 esc($page->{name}),
166                            "</a><br>\n";
167         }
168         print $index "</dd>\n";
169     }
170     print $index '</dl>';
171
172     close $index;
173 }
174
175 sub esc {
176     Pod::Simple::HTMLBatch::esc(@_);
177 }
178
179 sub found {
180     my ($self, $module) = @_;
181     return grep { $_->[0] eq $module } @{$self->_contents};
182 }
183
184 1;