OSDN Git Service

Update copyright year
[linuxjf/JF.git] / bin / mknewidx.pl
1 #! /usr/bin/perl
2
3 # JF ¤Î Berkeley DB ¥Õ¥¡¥¤¥ë¤òÆɤó¤Ç¡¢¥ê¥¹¥È¤ò½ÐÎϤ¹¤ë¤¿¤á¤Î
4 # ¥¹¥¯¥ê¥×¥È¡£
5 # Fujiwara ¤µ¤ó¤Î½ñ¤¤¤¿¥¹¥¯¥ê¥×¥È¤ò¥Ù¡¼¥¹¤Ë¤·¤Æ¤¤¤ë¡£
6 #
7 # -d: ·ë¹ç¤¹¤ë Berkeley DB file ¤Î̾Á°
8 # -t: output format type (HTML or TEXT)
9 # -c: ½ÐÎϤ¹¤ë¥«¥Æ¥´¥ê¡¼Ì¾ (¾Êά»þ¤Ï¤¹¤Ù¤Æ)
10 # -w: jf.css ¤ò»²¾È¤¹¤ë HTML ¤ò½ÐÎÏ (JF ¤Î Web Page ÍÑ INDEX ¤ò½ÐÎϤ¹¤ë¤È¤­)
11 # -k: ½ÐÎϤ·¤¿¤¤Ê¸½ñ¤Î KIND (¾Êά»þ¤Ï¤¹¤Ù¤Æ)
12 #
13 use strict;
14 use vars qw(%opts);
15 use DB_File;
16 use jfadmlib qw(:DEFAULT :LOCKS);
17 use Getopt::Std;
18 use Time::Local;
19
20 getopts('t:d:c:k:w', \%opts);
21
22 die unless $opts{'d'};
23 my $database = $opts{'d'};
24
25 my $type = 'TEXT';
26 $type = $opts{'t'} if $opts{'t'};
27
28 my @category = ("install",
29                 "faq",
30                 "guide",
31                 "hardware",
32                 "diskmanage",
33                 "filesystem",
34                 "network",
35                 "programming",
36                 "xfree",
37                 "dtp",
38                 "database",
39                 "tool",
40                 "kernel",
41                 "etc",
42                 "archived",
43 );
44 @category = $opts{'c'} if $opts{'c'};
45
46 my %contrib = (
47                'LILO-doc' => 1,
48                'LTGP'     => 1,
49 );
50
51 my $www = 0;
52 $www = 1 if $opts{'w'};  
53
54 my %kind_description = (
55                 "all"         => "JF¤Î¥É¥­¥å¥á¥ó¥È¥ê¥¹¥È",
56                 "LDP-TRANS"   => "LDP¤ÎËÝÌõʸ½ñ°ìÍ÷",
57                 "OTHER-TRANS" => "LDP°Ê³°¤ÎËÝÌõʸ½ñ°ìÍ÷",
58                 "ORIGINAL"    => "¥ª¥ê¥¸¥Ê¥ëʸ½ñ°ìÍ÷",
59 );
60
61 my $kind = "all";
62 $kind = $opts{'k'} if $opts{'k'};
63 die unless $kind_description{$kind};
64
65 my %description = (
66                 "install"  => "Linux¤Î¾Ò²ð¤È¥¤¥ó¥¹¥È¡¼¥ë",
67                 "faq"      => "FAQ",
68                 "guide"    => "¥¬¥¤¥É¤È¥Á¥å¡¼¥È¥ê¥¢¥ë",
69                 "hardware" => "¥Ï¡¼¥É¥¦¥§¥¢¤È¥É¥é¥¤¥Ð¡¼",
70                 "diskmanage" => "¥Ö¡¼¥È¤È¥Ç¥£¥¹¥¯´ÉÍý",
71                 "filesystem" => "¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à",
72                 "network"  => "¥Í¥Ã¥È¥ï¡¼¥¯",
73                 "programming" => "¥×¥í¥°¥é¥ß¥ó¥°",
74                 "xfree"    => "X Window System ¤ÎÀßÄê",
75                 "dtp"      => "ʸ½ñºîÀ®",
76                 "database" => "¥Ç¡¼¥¿¥Ù¡¼¥¹",
77                 "tool"     => "¥Ä¡¼¥ë¤Î²òÀâ",
78                 "kernel"   => "¥«¡¼¥Í¥ë´ØÏ¢",
79                 "etc"      => "¤½¤Î¾",
80                 "archived" => "¸Å¤¤Ê¸½ñ",
81 );
82
83 #
84 # get time data
85 #
86 my @t = get_timelist(time);
87
88 #
89 # tie database object to hash, and lock it.
90 #
91 my ($H, %index);
92 $H = tie(%index, 'DB_File', $database, O_RDONLY, 0644, $DB_BTREE) or die;
93
94 #
95 # output header
96 #
97 if (($type eq "HTML") and ($#category == 0)) {
98     print_html_header($www, $description{$category[0]});
99     print "<h2 id=\"JFLIST\">$kind_description{$kind}</h2>\n";
100 } elsif ($type eq "HTML") {
101     print_html_header($www, $kind_description{$kind});
102     print "<h2 id=\"JFLIST\">$kind_description{$kind}</h2>\n";
103 } else {
104     print "$kind_description{$kind}\n\n";
105 }
106
107 #
108 # output each datas.
109 #
110 foreach my $p (@category) {
111     if ($type eq "HTML") {
112         print "<h3 id=\"$p\">$description{$p}</h3>\n";
113         print "<dl>\n";
114     } else {
115         print "\n[$description{$p}]\n\n";
116     }
117
118     pickup($p, \%index, $H, $type);
119     print "</dl>\n" if $type eq "HTML";
120 }
121
122 print_html_footer($www,\@t) if $type eq "HTML";  
123
124 #
125 # untie index.
126 #
127 undef $H;
128 untie %index;
129 exit;
130 #
131 # end of main procedure
132 #
133
134 sub pickup
135 {
136     my ($category, $index, $H, $type) = @_;
137     my %jdat_hash;
138     my $i = 0;
139     foreach my $key (keys %$index) {
140         next unless $key =~ /\@\@ITEM$/;
141         next unless $index->{$key} =~ /^$category$/;
142         my ($name, $dummy) = split("\@\@", $key);
143
144         my $tmpjdat = get_ent($H, $name, "JDAT");
145         $tmpjdat = '0' unless $tmpjdat; # dummy
146         $tmpjdat .= $i++ if $jdat_hash{$tmpjdat}; # unique key
147         $jdat_hash{$tmpjdat} = $name;
148     }
149     foreach my $key (sort {$b cmp $a;} (keys %jdat_hash)) {
150         my $name = $jdat_hash{$key};
151         my $CONT = get_ent($H, $name, "CONT");
152         my $JDAT = get_ent($H, $name, "JDAT");
153         my $TITL = get_ent($H, $name, "TITL");
154         my $KIND = get_ent($H, $name, "KIND");
155         my (@AUT, @TRN);
156         $AUT[0]  = get_ent($H, $name, "AUTH");
157         $AUT[1]  = get_ent($H, $name, "AUT2");
158         $AUT[2]  = get_ent($H, $name, "AUT3");
159         $TRN[0]  = get_ent($H, $name, "TRNS");
160         $TRN[1]  = get_ent($H, $name, "TRN2");
161         $TRN[2]  = get_ent($H, $name, "TRN3");
162         foreach (@AUT, @TRN) {
163             s/<.*>//;
164             s/\s+$//;
165         }
166         $CONT = "unrecorded" unless $CONT;
167         next unless ($kind eq "all") or ($kind eq $KIND);
168
169         my $passed_time;
170         if ($JDAT) {
171             my $date = $JDAT;
172             if ($date =~ /^\d+$/) {
173                 $date = $date . '/01/01';
174             } elsif ($date =~ /^\d+\/\d+$/) {
175                 $date = $date . '/01';
176             }
177             $date =~ /(\d+)\/(\d+)\/(\d+)/;
178             my ($year, $month, $day) = ($1, $2, $3);
179             $year += 1900 if $year < 1900;
180             $month = 1 if $month == 0;
181             $day = 1 if $day == 0;
182             $passed_time = time - timelocal(0, 0, 0,
183                                             $day, $month-1, $year-1900);
184         } else {
185             $JDAT = "unrecorded";
186             $passed_time = 60*60*24*365; # dummy
187         }
188             
189         if ($type eq "HTML") {
190             print_html_data($name, $category, $CONT, $JDAT, $TITL, 
191                              $KIND, \@AUT, \@TRN, $passed_time);
192         } else {
193             print_text_data($name, $category, $CONT, $JDAT, $TITL, 
194                             $KIND, \@AUT, \@TRN);
195         }
196     }
197 }
198
199 sub print_html_data {
200     my ($name, $category, $CONT, $JDAT, $TITL, $KIND, $AUT, $TRN, 
201         $passed_time) = @_;
202
203     if ($www and $contrib{$KIND}) {
204         $name = "../contrib/$KIND/$name";
205     } elsif ($contrib{$KIND}) {
206         $name = "contrib/$KIND/$name";
207     }
208     $name = "archive/$name" if $category eq 'archived';
209
210     if (-f "$name.html") {
211         print "<dt><a href=\"$name.html\"><strong>$TITL</strong></a>\n";
212     } elsif (-d $name) {
213         print "<dt><a href=\"$name/\"><strong>$TITL</strong></a>\n";
214     } else {
215         print "<dt><strong>$TITL</strong>\n";
216     }
217
218     print "  <small>($JDAT)</small>";
219     if ($passed_time < 60*60*24*31 and $www) { 
220         print "\n  <span class=\"new\">new</span>";
221     }
222     print "</dt>\n";
223
224     print "  <dd>$CONT\n      <small>\n";
225     print "      [<a href=\"$name.txt\">¥Æ¥­¥¹¥ÈÈÇ</a>]\n" if (-f "$name.txt"); 
226     print "      <br>\n";
227     print "      Ãø¼Ô: $AUT->[0]\n" if $AUT->[0];
228     print "          , $AUT->[1]\n" if $AUT->[1];
229     print "          , $AUT->[2]\n" if $AUT->[2];
230     print "      ËÝÌõ: $TRN->[0]\n" if $TRN->[0];
231     print "          , $TRN->[1]\n" if $TRN->[1];
232     print "          , $TRN->[2]\n" if $TRN->[2];
233     print "      </small></dd>\n";
234 }
235
236
237 sub print_text_data {
238     my ($name, $category, $CONT, $JDAT, $TITL, $KIND, $AUT, $TRN) = @_;
239     $name = "contrib/$KIND/$name" if $contrib{$KIND};
240     $name = "archive/$name" if $category eq 'archived';
241     my $filename;
242     if (-f "$name.txt") {
243         $filename = $name . ".txt";
244     } elsif (-f "$name.xml") {
245         $filename = $name . ".xml";
246     } elsif (-f "$name.sgml") {
247         $filename = $name . ".sgml";
248     } elsif (-d $name) {
249         $filename = $name . "/";
250     }
251
252     format STDOUT =
253  Filename: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Updated: @<<<<<<<<<
254            $filename,                                               $JDAT
255  Title:    @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...
256            $TITL
257  Description: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...
258            $CONT
259 .
260
261     write;
262     print " Author:   $AUT->[0]"   if $AUT->[0];
263     print ", $AUT->[1]"            if $AUT->[1];
264     print ", $AUT->[2]"            if $AUT->[2];
265     print "\n"                     if $AUT->[0];
266     print " Translator: $TRN->[0]" if $TRN->[0];
267     print ", $TRN->[1]"            if $TRN->[1];
268     print ", $TRN->[2]"            if $TRN->[2];
269     print "\n"                     if $TRN->[0];
270     print "\n";
271 }
272
273
274 sub print_html_header {
275     my $www = $_[0];
276     my $title = $_[1];
277     print <<"-HEADER-ONE-";
278 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
279   "http://www.w3.org/TR/html4/loose.dtd">
280 <html lang="ja" dir="ltr">
281 <head>
282  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
283  <title>JF: Index: $title</title>
284  <meta name="author" lang="en" content="JF Project Members">
285  <meta name="copyright" content="(C) 1998-2014 JF Project.">
286  <meta name="description" content="Linux ¤Ë´Ø¤¹¤ë²òÀâʸ½ñ¡¦FAQ ¤Ê¤É¤òºîÀ®¡¦¼ý½¸¡¦ÇÛÉÛ¤¹¤ë JF Project ¤Îʸ½ñ°ìÍ÷¤Ç¤¹¡£">
287  <meta name="keywords" content="JF,Linux,Japanese,ʸ½ñ,¥É¥­¥å¥á¥ó¥È,ËÝÌõ,HOWTO,FAQ">
288  <link rev="made" href="mailto:jf\@listserv.linux.or.jp">
289 -HEADER-ONE-
290
291     print " <link rel=\"stylesheet\" type=\"text/css\" href=\"../jf.css\">\n"
292     if $www;
293     
294     print <<"-HEADER-TWO-";
295 </head>
296
297 <body>
298
299 -HEADER-TWO-
300
301     if ($www) {
302         print "<h1><a href=\"../index.html\">JF</a>: Index</h1>";
303     } else {
304         print "<h1>JF-INDEX</h1>";
305     }
306
307 }
308
309 sub print_html_footer {
310     my ($www, $t) = @_;
311     print <<"-FOOTER-ONE-";
312 <hr>
313  <address>
314   JF Project Á´È̤˴ؤï¤ë¤´°Õ¸«¤´Í×˾¤Ï
315   jf\@listserv.linux.or.jp ¤Þ¤Ç¤ª¤Í¤¬¤¤¤·¤Þ¤¹¡£
316  </address>
317 -FOOTER-ONE-
318
319     print <<"-FOOTER-WWW-" if $www;
320  <div class="copyright">
321   <a href="../index.html">JF Project ¥á¥¤¥ó¥Ú¡¼¥¸¤Ø</a><br>
322  </div>
323 -FOOTER-WWW-
324
325  print " <div class=\"copyright\">\n" if $www;
326  print "¥ê¥¹¥È¹¹¿·Æü»þ: $t->[0]/$t->[1]/$t->[2] $t->[4]:$t->[5]:$t->[6]<br>\n";
327  print " </div>\n" if $www;
328  print "\n</body>\n</html>\n";
329 }
330
331 sub get_timelist() {
332   my ($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst) = localtime($_[0]);
333   my @dow = ("Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat");
334   my $dow = $dow[$wday];
335   $month = $month + 1;
336   $month = 1 if $month == 13;
337   $month = "0" . $month if $month < 10;
338   $day   = "0" . $day   if $day   < 10;
339   $hour  = "0" . $hour  if $hour  < 10;
340   $min   = "0" . $min   if $min   < 10;
341   $sec   = "0" . $sec   if $sec   < 10;
342   $year += 1900;
343   return ($year, $month, $day, $dow, $hour, $min, $sec);
344 }