OSDN Git Service

Import JM CVS Repository from cvs.linux.or.jp.
[linuxjm/jm.git] / bin / mkmanweb.perl
1 #!/usr/bin/perl -w
2 #
3 # build html hierarchy using man2html 
4 #
5 # first version Thu Aug 19 00:53:30 JST 1999
6 #     by Tenkou N. Hattori <tnh@aurora.dti.ne.jp>
7 #
8 # $Id: mkmanweb.perl,v 1.5 2006/06/14 08:45:05 nakano Exp $
9 #
10 BEGIN{
11     $epath = `dirname $0`; chomp $epath;
12     unshift (@INC, $epath);
13 }
14 use JMtl ('line2hash', 'hash2line');
15 use strict 'vars';
16
17 my ($idx_header, $idx_footer);
18
19 #
20 # $MANROOT ¤Ï CVS ¥ê¥Ý¥¸¥È¥ê¤Î JM/manual,
21 # $WWWROOT ¤Ï web ¤Î html ¥³¥ó¥Æ¥ó¥Ä¤Î¥È¥Ã¥×,
22 # $MAN2HTML ¤Ï man2html ¥³¥Þ¥ó¥É¤òÁÛÄê.
23 #
24 if (@ARGV < 4) {die "$0 srcroot destroot man2html yaman2html\n"};
25
26 my $MANROOT = $ARGV[0];
27 unless (-d $MANROOT) {die "$MANROOT does not exist\n"};
28
29 my $WWWROOT = $ARGV[1];
30
31 my $MAN2HTML = $ARGV[2];
32 unless (-x $MAN2HTML) {die "$MAN2HTML does not executable\n"};
33
34 #
35 # man2html ¤À¤È¥Ð¥°¤Î½Ð¤ë¥Ú¡¼¥¸ÍѤÎÀ°·Á¥³¥Þ¥ó¥É
36 #
37 my $YAMAN2HTML = $ARGV[3];
38 unless (-x $YAMAN2HTML) {die "$YAMAN2HTML does not executable\n"};
39
40 #
41 # for debugging purpose:
42 #
43 #my $MANROOT = "/home/nakano/text/JM/imp/manual";
44 #my $WWWROOT = "/home/nakano/public_html/JMwww/html";
45 #my $MAN2HTML = "/home/nakano/bin/man2html";
46 #my $YAMAN2HTML = "/home/nakano/text/JM/head/admin/tools/yaman2html.perl";
47
48 #
49 # man2html ½ÐÎϤËÂФ·¤ÆÃÖ´¹¤¹¤ë³Æ¥ê¥ó¥¯ (·è¤áÂǤÁ(^^;)
50 #
51 my $MANWROOT='../../../manual';
52 my $MAIN='<A HREF="../../../index.html">JM Home Page</A>';
53 my $MAN2HTMLPAGE='<A HREF="../../man/man1/man2html.1.html">man2html</A>';
54 my $MLANG='<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">';
55 my $JMCSS='<LINK REL="stylesheet" TYPE="text/css" HREF="../../../jm.css">';
56 my $CONTCSS='<LINK REL="stylesheet" TYPE="text/css" HREF="../../../contrib.css">';
57 my $SELECT='0MultiFileIdx';
58
59 my (%roff_hash, %page_name, %link_hash, %cont_link);
60 #
61 # $MANROOT/$pkg/translation_list ¤Î scan.
62 #
63 print "scanning translation_list's...\n";
64 open RL,"find $MANROOT -name translation_list|";
65 while(<RL>){
66     print;
67     chomp;
68     my $tl = $_;
69     unless(/.*manual\/([^\/]*)\/translation_list/){next;}
70     my $pkg=$1;
71
72     open TL, $tl || die "cannot open $tl";
73     while (<TL>){
74         chomp;
75         my %ti = line2hash($_);
76         my $name = $ti{fname};
77         my $sec = $ti{sec};
78         my $page = "$pkg,$name,$sec";
79
80         if ($ti{kind} eq "link" && $ti{stat} eq "up2date"){
81             my $dst = "../man$ti{lsec}/$ti{lname}.$ti{lsec}.html";
82             $link_hash{"$page"} = $dst;
83             push @{$page_name{"$name,$sec"}}, "$page";
84             print "collect link        : $page => $dst\n";
85             next;
86         }
87
88         if ($ti{kind} eq "roff" && $ti{stat} =~ /^up/) {
89             my $src = "$pkg/release/man$sec/$name.$sec";
90             $roff_hash{"$page"} = $src;
91             push @{$page_name{"$name,$sec"}}, "$page";
92             print "collect roff        : $page <= $src\n";
93             next;
94         }
95
96         if ($ti{kind} eq "roff" && $ti{stat} =~ /^cnt/) {
97             my $src = "$pkg/contrib/man$sec/$name.$sec";
98             $roff_hash{"$page"} = $src;
99             push @{$page_name{"$name,$sec"}}, "$page";
100             $cont_link{$page} = <<EOM;
101 <DIV ALIGN="right">
102 ËÜ¥Ú¡¼¥¸¤Ï <A HREF="$ti{comment}">$ti{tname}</A>
103 ($ti{tmail}) ¤è¤ê´ó£¤¤¤¿¤À¤­¤Þ¤·¤¿¡£
104 </DIV>
105 EOM
106
107             print "collect contrib roff: <= $src\n";
108             next;
109         }
110     }
111     close TL;
112 }
113 close RL;
114
115 foreach my $key (sort keys %page_name){
116     my $num = $#{$page_name{$key}} + 1;
117     print "$key: $num\n";
118 }
119 #
120 # ÊÑ´¹³«»Ï¡£
121 #
122
123 #
124 # ½ÅÊ£¥Ú¡¼¥¸ÍѤΠindex.
125 #
126 print "creating index for pages with identical names...\n";
127 foreach my $fkey (sort keys %page_name){
128     if ($#{ $page_name{$fkey} } > 0){
129         my ($name,$sec) = split /,/, $fkey;
130
131         my $cand = $#{$page_name{$fkey}} + 1;
132         print "$name.$sec has $cand candidates...";
133
134         system("mkdir -p $WWWROOT/$SELECT/man$sec");
135         open WL, "| nkf -j > $WWWROOT/$SELECT/man$sec/$name.$sec.html";
136
137         my $header = $idx_header;
138         $header =~ s/_PAGENAME_/$name/ge;
139         print WL $header;
140
141         foreach my $i (0 .. $#{ $page_name{$fkey}}){
142             my ($mpkg, $mname, $msec);
143             ($mpkg,$mname,$msec)=split /,/, $page_name{$fkey}[$i];
144             my $anchor = "$mname.$msec in $mpkg";
145             my $link   = "../../$mpkg/man$msec/$mname.$msec.html";
146             print WL "<LI><A HREF=\"$link\">$anchor</A></LI>\n";
147         }
148         print WL $idx_footer;
149         close WL;
150         print "index created.\n";
151     }
152 }
153
154 #
155 # roff -> html
156 #
157 foreach my $fkey (sort keys %roff_hash){
158     my ($pkg, $name, $sec);
159     ($pkg,$name,$sec)=split /,/, $fkey;
160
161     my $hdir = "$WWWROOT/$pkg/man$sec";
162     my $hfile = "$hdir/$name.$sec.html";
163
164     system("mkdir -p $hdir");
165
166     print "converting $pkg/$name.$sec...";
167     my $roffpage = "$MANROOT/$roff_hash{$fkey}";
168
169     # man2html ¤Ï fetchmail.1 ¤Î .TS - .TE ¥Þ¥¯¥íÆâÉô¤ò
170     # Àµ¤·¤¯°·¤¨¤Ê¤¤¤Î¤Ç¡¢¤È¤ê¤¢¤¨¤º workaround.
171
172     if("$name.$sec" eq "fetchmail.1"){
173         system "$YAMAN2HTML $roffpage | nkf -j > $hfile";
174         next;
175     }
176
177     # roff page ¤Ø¤Î link.
178     my $ROFF = "<A HREF=\"$MANWROOT/$roff_hash{$fkey}\">roff page</A>";
179     my $NAVI = "$MAIN\n$ROFF";
180
181     my $START = "$MLANG\n";
182     if ($roffpage =~ /\/contrib\//){
183         $START .= "$CONTCSS\n</HEAD>\n<BODY>\n$cont_link{$fkey}\n";
184     } else {
185         $START .= "$JMCSS\n</HEAD>\n<BODY>\n";
186     }
187
188     open M2H, "$MAN2HTML $roffpage |";
189     open WL,"| nkf -j > $hfile";
190
191     while(<M2H>){
192         if($. < 2){next;};      
193
194 #       s/(\&\#([0-9]+)\;)/pack("C",$1)/ge;
195         s/\a//g;
196
197         s/<\/HEAD><BODY>/$START/ge;
198         s/<A HREF=\"http:\/\/localhost\/cgi-bin\/man\/man2html\">Return to Main Contents<\/A>/$NAVI/ge;
199         s/<A HREF=\"http:\/\/localhost\/cgi-bin\/man\/man2html\">man2html<\/A>/$MAN2HTMLPAGE/ge;
200
201         # ÊÌ¥Ú¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¥¢¥ó¥«¡¼¤Î½èÍý.
202         #
203         while (m/<A HREF=\"http:\/\/localhost\/cgi-bin\/man\/man2html\?([1-9])[a-zA-Z]?\+([^\"]+)/){
204             my $lpage = "$2,$1";
205
206             if ($#{$page_name{$lpage}} == -1){
207                 s/<A HREF=\"http:[^>]+>([^<]+)<\/A>/$1/;
208
209             } elsif ($#{$page_name{$lpage}} == 0){
210                 my $repl;
211                 my ($lpkg,$lname,$lsec) = split /,/, ${$page_name{$lpage}}[0];
212
213                 if ($pkg eq $lpkg) {
214                     $repl = "../man$lsec/$lname.$lsec.html";
215                 } else {
216                     $repl = "../../$lpkg/man$lsec/$lname.$lsec.html";
217                 }
218                 s/http:\/\/[^\"]+/$repl/;
219
220             } else {
221                 my $repl;
222                 my ($lpkg,$lname,$lsec) = split /,/, ${$page_name{$lpage}}[0];
223                 $repl = "../../$SELECT/man$lsec/$lname.$lsec.html";
224
225                 foreach my $j (0 .. $#{$page_name{$lpage}}){
226                     my ($lpkg,$lname,$lsec) = split /,/, ${$page_name{$lpage}}[$j];
227                     if ($lpkg eq $pkg) {
228                         $repl = "../man$lsec/$lname.$lsec.html";
229                     }
230                 }
231                 s/http:\/\/[^\"]+/$repl/;
232             }
233
234         } #end of while(m/../).
235         print WL;
236     }
237     close M2H;
238     close WL;
239     print "done.\n";
240 }
241
242 #
243 # make symlinks
244 #
245 foreach my $fkey (sort keys %link_hash){
246     my ($pkg, $name, $sec) = split /,/, $fkey;
247
248     my $hdir = "$WWWROOT/$pkg/man$sec";
249     my $hfile = "$hdir/$name.$sec.html";
250     my $dst = $link_hash{$fkey};
251
252     unless (-f "$hdir/$dst"){;
253         print "WARN: dest $hdir for symlink $pkg/$name.$sec lacks.\n";
254         next;
255     }
256
257     system("cd $hdir; ln -s $dst $name.$sec.html");
258
259     print "$pkg/man$sec/$name.$sec.html: create symlink to $dst\n";
260      next;
261 }
262
263 #
264 # ¥¤¥ó¥Ç¥Ã¥¯¥¹¥Ú¡¼¥¸¤Î¥Ø¥Ã¥À¡¦¥Õ¥Ã¥¿
265 #
266 BEGIN{
267    $idx_header = <<'EOM';
268 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
269   "http://www.w3.org/TR/REC-html40/loose.dtd">
270 <HTML LANG="ja" DIR="LTR">
271 <HEAD>
272  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
273  <TITLE>_PAGENAME_</TITLE>
274  <META NAME="author" LANG="en" CONTENT="JM Project Members">
275  <META NAME="copyright" CONTENT="(C) 1999 JM Project.">
276  <META NAME="DESCRIPTION" CONTENT="JM: JM Project.">
277  <META NAME="keywords" CONTENT="JM, Linux, Japanese, Manual">
278  <LINK REV="made" HREF="mailto:JM@linux.or.jp">
279  <LINK REL="stylesheet" TYPE="text/css" HREF="../../../jm.css">
280 </HEAD>
281 <BODY>
282  <H1>_PAGENAME_</H1>
283  <P>Ʊ̾¤Î¥Ú¡¼¥¸¤¬Ê£¿ô¤¢¤ê¤Þ¤¹¡£°Ê²¼¤Î¸õÊ䤫¤éÁª¤ó¤Ç¤¯¤À¤µ¤¤</P>
284  <UL>
285 EOM
286
287     $idx_footer = <<'EOM';
288  </UL>
289  <P>
290  <IMG SRC="../../../images/grey.png" WIDTH="14" HEIGHT="14" ALT="*">
291  <A HREF="../../../index.html">JM Project ¤Î¥á¥¤¥ó¥Ú¡¼¥¸¤ØÌá¤ë</A>
292  </P>
293 </BODY>
294 </HTML>
295 EOM
296 }
297