OSDN Git Service

util-linux: blkid.8 to 2.35.2, lsblk.8 to 2.34.
[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 BEGIN{
9     $epath = `dirname $0`; chomp $epath;
10     unshift (@INC, $epath);
11 }
12 use JMtl ('line2hash', 'hash2line');
13 use strict 'vars';
14
15 my ($idx_header, $idx_footer);
16
17 #
18 # $MANROOT は CVS リポジトリの JM/manual,
19 # $WWWROOT は web の html コンテンツのトップ,
20 # $MAN2HTML は man2html コマンドを想定.
21 #
22 if (@ARGV < 3) {die "$0 srcroot destroot man2html\n"};
23
24 my $MANROOT = $ARGV[0];
25 unless (-d $MANROOT) {die "$MANROOT does not exist\n"};
26
27 my $WWWROOT = $ARGV[1];
28
29 my $MAN2HTML = $ARGV[2];
30 unless (-x $MAN2HTML) {die "$MAN2HTML does not executable\n"};
31
32 #
33 # for debugging purpose:
34 #
35 #my $MANROOT = "/home/nakano/text/JM/imp/manual";
36 #my $WWWROOT = "/home/nakano/public_html/JMwww/html";
37 #my $MAN2HTML = "/home/nakano/bin/man2html";
38
39 #
40 # man2html 出力に対して置換する各リンク (決め打ち(^^;)
41 #
42 my $MANWROOT='../../../manual';
43 my $MAIN='<A HREF="../../../index.html">JM Home Page</A>';
44 my $MAN2HTMLPAGE='<A HREF="../../man/man1/man2html.1.html">man2html</A>';
45 my $MLANG='<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">';
46 my $JMCSS='<LINK REL="stylesheet" TYPE="text/css" HREF="../../../jm.css">';
47 my $CONTCSS='<LINK REL="stylesheet" TYPE="text/css" HREF="../../../contrib.css">';
48 my $SELECT='0MultiFileIdx';
49
50 my (%roff_hash, %page_name, %link_hash, %cont_link);
51 #
52 # $MANROOT/$pkg/translation_list の scan.
53 #
54 print "scanning translation_list's...\n";
55 open RL,"find $MANROOT -name translation_list|";
56 while(<RL>){
57     print;
58     chomp;
59     my $tl = $_;
60     unless(m|.*manual/([^/]*)/translation_list|){next;}
61     my $pkg=$1;
62
63     open TL, $tl || die "cannot open $tl";
64     while (<TL>){
65         chomp;
66         my %ti = line2hash($_);
67         my $name = $ti{fname};
68         my $sec = $ti{sec};
69         my $page = "$pkg,$name,$sec";
70
71         if ($ti{kind} eq "link" && $ti{stat} eq "up2date"){
72             my $dst = "../man$ti{lsec}/$ti{lname}.$ti{lsec}.html";
73             $link_hash{"$page"} = $dst;
74             push @{$page_name{"$name,$sec"}}, "$page";
75             print "collect link        : $page => $dst\n";
76             next;
77         }
78
79         if ($ti{kind} eq "roff" && $ti{stat} =~ /^up/) {
80             my $src = "$pkg/release/man$sec/$name.$sec";
81             $roff_hash{"$page"} = $src;
82             push @{$page_name{"$name,$sec"}}, "$page";
83             print "collect roff        : $page <= $src\n";
84             next;
85         }
86
87         if ($ti{kind} eq "roff" && $ti{stat} =~ /^cnt/) {
88             my $src = "$pkg/contrib/man$sec/$name.$sec";
89             $roff_hash{"$page"} = $src;
90             push @{$page_name{"$name,$sec"}}, "$page";
91             $cont_link{$page} = <<EOM;
92 <DIV ALIGN="right">
93 本ページは <A HREF="$ti{comment}">$ti{tname}</A>
94 ($ti{tmail}) より寄贈いただきました。
95 </DIV>
96 EOM
97
98             print "collect contrib roff: <= $src\n";
99             next;
100         }
101     }
102     close TL;
103 }
104 close RL;
105
106 foreach my $key (sort keys %page_name){
107     my $num = $#{$page_name{$key}} + 1;
108     print "$key: $num\n";
109 }
110 #
111 # 変換開始。
112 #
113
114 #
115 # 重複ページ用の index.
116 #
117 print "creating index for pages with identical names...\n";
118 foreach my $fkey (sort keys %page_name){
119     if ($#{ $page_name{$fkey} } > 0){
120         my ($name,$sec) = split /,/, $fkey;
121
122         my $cand = $#{$page_name{$fkey}} + 1;
123         print "$name.$sec has $cand candidates...";
124
125         system("mkdir -p $WWWROOT/$SELECT/man$sec");
126         open WL, "| nkf -w > $WWWROOT/$SELECT/man$sec/$name.$sec.html";
127
128         my $header = $idx_header;
129         $header =~ s/_PAGENAME_/$name/ge;
130         print WL $header;
131
132         foreach my $i (0 .. $#{ $page_name{$fkey}}){
133             my ($mpkg, $mname, $msec);
134             ($mpkg,$mname,$msec)=split /,/, $page_name{$fkey}[$i];
135             my $anchor = "$mname.$msec in $mpkg";
136             my $link   = "../../$mpkg/man$msec/$mname.$msec.html";
137             print WL "<LI><A HREF=\"$link\">$anchor</A></LI>\n";
138         }
139         print WL $idx_footer;
140         close WL;
141         print "index created.\n";
142     }
143 }
144
145 #
146 # roff -> html
147 #
148 foreach my $fkey (sort keys %roff_hash){
149     my ($pkg, $name, $sec);
150     ($pkg,$name,$sec)=split /,/, $fkey;
151
152     my $hdir = "$WWWROOT/$pkg/man$sec";
153     my $hfile = "$hdir/$name.$sec.html";
154
155     system("mkdir -p $hdir");
156
157     print "converting $pkg/$name.$sec...";
158     my $roffpage = "$MANROOT/$roff_hash{$fkey}";
159
160     # roff page への link.
161     my $ROFF = "<A HREF=\"$MANWROOT/$roff_hash{$fkey}\">roff page</A>";
162     my $NAVI = "$MAIN\n$ROFF";
163
164     my $START = "$MLANG\n";
165     if ($roffpage =~ m|/contrib/|){
166         $START .= "$CONTCSS\n</HEAD>\n<BODY>\n$cont_link{$fkey}\n";
167     } else {
168         $START .= "$JMCSS\n</HEAD>\n<BODY>\n";
169     }
170
171     open M2H, "$MAN2HTML $roffpage |";
172     open WL,"| nkf -w > $hfile";
173
174     while(<M2H>){
175         if($. < 2){next;};      
176
177 #       s/(\&\#([0-9]+)\;)/pack("C",$1)/ge;
178         s/\a//g;
179
180         s|</HEAD><BODY>|$START|ge;
181         s|<A HREF=\"(http://localhost)?/cgi-bin/man/man2html\">Return to Main Contents</A>|$NAVI|ge;
182         s|<A HREF=\"(http://localhost)?/cgi-bin/man/man2html\">man2html</A>|$MAN2HTMLPAGE|ge;
183
184         # 別ページへのリンクアンカーの処理.
185         #
186         while (m|<A HREF=\"(http://localhost)?/cgi-bin/man/man2html\?([1-9])[a-zA-Z]?\+([^\"]+)|){
187             my $lpage = "$3,$2";
188             s|http://localhost/cgi-bin/|/cgi-bin/|;
189
190             if ($#{$page_name{$lpage}} == -1){
191                 s|<A HREF=\"/cgi-bin/man/man2html[^>]+>([^<]+)</A>|$1|;
192
193             } elsif ($#{$page_name{$lpage}} == 0){
194                 my $repl;
195                 my ($lpkg,$lname,$lsec) = split /,/, ${$page_name{$lpage}}[0];
196
197                 if ($pkg eq $lpkg) {
198                     $repl = "../man$lsec/$lname.$lsec.html";
199                 } else {
200                     $repl = "../../$lpkg/man$lsec/$lname.$lsec.html";
201                 }
202                 s|/cgi-bin/[^\"]+|$repl|;
203
204             } else {
205                 my $repl;
206                 my ($lpkg,$lname,$lsec) = split /,/, ${$page_name{$lpage}}[0];
207                 $repl = "../../$SELECT/man$lsec/$lname.$lsec.html";
208
209                 foreach my $j (0 .. $#{$page_name{$lpage}}){
210                     my ($lpkg,$lname,$lsec) = split /,/, ${$page_name{$lpage}}[$j];
211                     if ($lpkg eq $pkg) {
212                         $repl = "../man$lsec/$lname.$lsec.html";
213                     }
214                 }
215                 s|/cgi-bin/[^\"]+|$repl|;
216             }
217         } #end of while(m/../).
218         print WL;
219     }
220     close M2H;
221     close WL;
222     print "done.\n";
223 }
224
225 #
226 # make symlinks
227 #
228 foreach my $fkey (sort keys %link_hash){
229     my ($pkg, $name, $sec) = split /,/, $fkey;
230
231     my $hdir = "$WWWROOT/$pkg/man$sec";
232     my $hfile = "$hdir/$name.$sec.html";
233     my $dst = $link_hash{$fkey};
234
235     unless (-f "$hdir/$dst"){;
236         print "WARN: dest $hdir for symlink $pkg/$name.$sec lacks.\n";
237         next;
238     }
239
240     system("cd $hdir; ln -s $dst $name.$sec.html");
241
242     print "$pkg/man$sec/$name.$sec.html: create symlink to $dst\n";
243      next;
244 }
245
246 #
247 # インデックスページのヘッダ・フッタ
248 #
249 BEGIN{
250    $idx_header = <<'EOM';
251 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
252   "http://www.w3.org/TR/REC-html40/loose.dtd">
253 <HTML LANG="ja" DIR="LTR">
254 <HEAD>
255  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
256  <TITLE>_PAGENAME_</TITLE>
257  <META NAME="author" LANG="en" CONTENT="JM Project Members">
258  <META NAME="copyright" CONTENT="(C) 1999 JM Project.">
259  <META NAME="DESCRIPTION" CONTENT="JM: JM Project.">
260  <META NAME="keywords" CONTENT="JM, Linux, Japanese, Manual">
261  <LINK REV="made" HREF="mailto:linuxjm-discuss@lists.sourceforge.jp">
262  <LINK REL="stylesheet" TYPE="text/css" HREF="../../../jm.css">
263 </HEAD>
264 <BODY>
265  <H1>_PAGENAME_</H1>
266  <P>同名のページが複数あります。以下の候補から選んでください</P>
267  <UL>
268 EOM
269
270     $idx_footer = <<'EOM';
271  </UL>
272  <P>
273  <IMG SRC="../../../images/grey.png" WIDTH="14" HEIGHT="14" ALT="*">
274  <A HREF="../../../index.html">JM Project のメインページへ戻る</A>
275  </P>
276 </BODY>
277 </HTML>
278 EOM
279 }
280