1 |
#!/usr/bin/env perl |
2 |
|
3 |
use strict; |
4 |
use warnings; |
5 |
use utf8; |
6 |
|
7 |
use constant rcsid => '$Id: genhelp,v 1.5 2007-08-28 17:08:06 pippijn Exp $'; |
8 |
|
9 |
BEGIN { |
10 |
unshift @INC, "lib"; |
11 |
} |
12 |
|
13 |
use Template; |
14 |
use YAML; |
15 |
use Pod::Man; |
16 |
|
17 |
use PodHTML; |
18 |
use PodHelp; |
19 |
|
20 |
use Pod::POM; |
21 |
my $parser = new Pod::POM; |
22 |
|
23 |
my @servicenames = qw/ChanServ GameServ Global MemoServ NickServ OperServ SaslServ UserServ/; |
24 |
|
25 |
# Static variables |
26 |
our $static = YAML::LoadFile("variables.yml"); |
27 |
my $toplevel = []; |
28 |
my $topleveltop = []; |
29 |
for (@servicenames) { |
30 |
push @$toplevel, { |
31 |
href => "../" . lc $_ . ".html", |
32 |
title => $_, |
33 |
}; |
34 |
push @$topleveltop, { |
35 |
href => lc $_ . ".html", |
36 |
title => $_, |
37 |
}; |
38 |
} |
39 |
|
40 |
mkdir "tthelp"; |
41 |
mkdir "ttsvs"; |
42 |
mkdir "man"; |
43 |
mkdir "html"; |
44 |
|
45 |
my @podfiles = <podhelp/*.pod>; |
46 |
|
47 |
for my $file (@podfiles) { |
48 |
my ($name) = $file =~ /podhelp\/(.+)\.pod$/; |
49 |
my $pom = $parser->parse ($file) |
50 |
or die $parser->error(); |
51 |
$PodHelp::subdir = $name; |
52 |
$PodHTML::subdir = $name; |
53 |
$PodHTML::dir = "tthelp"; |
54 |
mkdir "tthelp/$name"; |
55 |
$pom->present ("PodHelp"); |
56 |
$pom->present ("PodHTML"); |
57 |
$pom = $parser->parse ("podmisc/help.pod") |
58 |
or die $parser->error(); |
59 |
$pom->present ("PodHelp"); |
60 |
$pom->present ("PodHTML"); |
61 |
} |
62 |
|
63 |
@podfiles = <podsvs/*.pod>; |
64 |
|
65 |
for my $file (@podfiles) { |
66 |
my ($name) = $file =~ /podsvs\/(.+)\.pod$/; |
67 |
my $pom = $parser->parse ($file) |
68 |
or die $parser->error(); |
69 |
$PodHTML::dir = "ttsvs"; |
70 |
$PodHTML::subdir = undef; |
71 |
$pom->present ("PodHTML"); |
72 |
} |
73 |
|
74 |
my @services = <tthelp/*>; |
75 |
my @files; |
76 |
my %done; |
77 |
for my $svs (@services) { |
78 |
push @files, <$svs/*>; |
79 |
$svs =~ s/tthelp\///; |
80 |
mkdir "html/$svs"; |
81 |
$done{$svs} = 0; |
82 |
} |
83 |
|
84 |
for my $file (@files) { |
85 |
my @contents = do { open my $fh, "<$file" or die "$file: $!\n"; <$fh> }; |
86 |
my $name = $file; |
87 |
$name =~ s/tthelp\/(\w+)\/\w+/$1/; |
88 |
$name =~ s/serv/Serv/; |
89 |
$name =~ s/\.tt$//; |
90 |
$name = ucfirst $name; |
91 |
my $subtitle = shift @contents; |
92 |
chomp $subtitle; |
93 |
|
94 |
my $tt = Template->new({ |
95 |
INCLUDE_PATH => 'lib:.', |
96 |
INTERPOLATE => 1, |
97 |
POST_CHOMP => 1, |
98 |
EVAL_PERL => 1, |
99 |
}) or die "$Template::ERROR\n"; |
100 |
|
101 |
my $vars = { file => sub { return do { local $/; open my $fh, "<$_[0]" or die "$_[0]: $!\n"; <$fh> } if $_[0]; } }; |
102 |
|
103 |
my $contents = "@contents"; |
104 |
my $data = ''; # Variable to store processed templates |
105 |
$tt->process(\$contents, $vars, \$data) |
106 |
or die $tt->error(); |
107 |
$data =~ s/&nick&/$name/g; |
108 |
|
109 |
# Generate sidemenu |
110 |
for (@$toplevel) { |
111 |
if ($_->{title} ne $name) { |
112 |
$_->{menu} = undef; |
113 |
next; |
114 |
} |
115 |
$_->{menu} = $PodHTML::menu->{$name}; |
116 |
} |
117 |
for (@$topleveltop) { |
118 |
if ($_->{title} ne $name) { |
119 |
$_->{menu} = undef; |
120 |
next; |
121 |
} |
122 |
$_->{menu} = $PodHTML::menu->{$name}; |
123 |
} |
124 |
$vars = $static; |
125 |
# Toplevel menu |
126 |
$vars->{menu} = [ |
127 |
{ |
128 |
href => "../index.html", |
129 |
title => "Home", |
130 |
}, |
131 |
@$toplevel, |
132 |
]; |
133 |
my $sidemenu = ''; |
134 |
$tt->process('sidemenu.tt', $vars, \$sidemenu) |
135 |
or die $tt->error(), "\n"; |
136 |
|
137 |
for (@$topleveltop) { |
138 |
next unless $_->{title} eq $name; |
139 |
for (@{ $_->{menu} }) { |
140 |
$_->{href} =~ s/^\.\.\///; |
141 |
} |
142 |
} |
143 |
|
144 |
# Toplevel menu for top site |
145 |
$vars->{menu} = [ |
146 |
{ |
147 |
href => "index.html", |
148 |
title => "Home", |
149 |
}, |
150 |
@$topleveltop, |
151 |
]; |
152 |
my $sidemenutop = ''; |
153 |
$tt->process('sidemenu.tt', $vars, \$sidemenutop) |
154 |
or die $tt->error(), "\n"; |
155 |
|
156 |
# Revert change of above |
157 |
for (@$topleveltop) { |
158 |
next unless $_->{title} eq $name; |
159 |
for (@{ $_->{menu} }) { |
160 |
$_->{href} =~ s/^/..\//; |
161 |
} |
162 |
} |
163 |
|
164 |
# Re-initialised with static variables from YAML |
165 |
$vars->{subtitle} = $subtitle; |
166 |
$vars->{contents} = $data; |
167 |
$vars->{sidemenu} = $sidemenu; |
168 |
|
169 |
my $output = ''; # Variable to store the complete page |
170 |
$tt->process('html.tt', $vars, \$output) |
171 |
or die $tt->error(), "\n"; |
172 |
|
173 |
# Save the page to a html file |
174 |
$file =~ s/tthelp\/(.+)\.tt/html\/$1.html/; |
175 |
open HTML, ">$file"; |
176 |
print HTML $output; |
177 |
close HTML; |
178 |
|
179 |
# Do this once per service |
180 |
unless ($done{$name}) { |
181 |
$data = ''; # Variable to store processed templates |
182 |
$tt->process("ttsvs/" . lc $name . ".tt", $vars, \$data) |
183 |
or die $tt->error(); |
184 |
$data =~ s/&nick&/$name/g; |
185 |
|
186 |
# Re-initialised with static variables from YAML |
187 |
$vars->{subtitle} = $subtitle; |
188 |
$vars->{contents} = $data; |
189 |
$vars->{sidemenu} = $sidemenutop; |
190 |
|
191 |
my $output = ''; # Variable to store the complete page |
192 |
$tt->process('html.tt', $vars, \$output) |
193 |
or die $tt->error(), "\n"; |
194 |
|
195 |
# Save the page to a html file |
196 |
open HTML, ">html/" . lc $name . ".html"; |
197 |
print HTML $output; |
198 |
close HTML; |
199 |
|
200 |
$done{$name} = 1; |
201 |
} |
202 |
} |
203 |
|
204 |
=head1 AUTHOR |
205 |
|
206 |
Copyright © 2007 Pippijn van Steenhoven |
207 |
|
208 |
=head1 LICENSE |
209 |
|
210 |
This library is free software, you can redistribute it and/or modify |
211 |
it under the terms of the GNU General Public License as documented in COPYING. |
212 |
|
213 |
=cut |