/[suikacvs]/okuchuu/piclist.ja.cgi
Suika

Contents of /okuchuu/piclist.ja.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download)
Fri Feb 25 17:08:30 2005 UTC (19 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.3: +222 -44 lines
Detail mode introduced

1 wakaba 1.2 #!/usr/local/bin/perl
2    
3 wakaba 1.4 use strict;
4 wakaba 1.2
5 wakaba 1.4 =head1 NAME
6 wakaba 1.2
7 wakaba 1.4 piclist - Making List of Pictures in a Directory
8 wakaba 1.2
9 wakaba 1.4 =cut
10 wakaba 1.2
11 wakaba 1.4 unless ($main::ENV{PATH_TRANSLATED}) {
12     die "BAD PATH_TRANSLATED";
13     }
14 wakaba 1.2
15 wakaba 1.4 my %Opt;
16 wakaba 1.2
17 wakaba 1.4 my $dir = $main::ENV{PATH_TRANSLATED};
18     if ($dir =~ s#/LIST$##) {
19     for (split /[&;]/, $ENV{QUERY_STRING}) {
20     my ($name, $val) = split /=/, $_, 2;
21     $Opt{$name} = defined $val ? $val : 1;
22     }
23     } else {
24     die "BAD PATH_TRANSLATED: $ENV{PATH_TRANSLATED}";
25     }
26 wakaba 1.2
27    
28 wakaba 1.4 sub escape ($) {
29     my $s = shift;
30     $s =~ s/&/&/g;
31     $s =~ s/</&lt;/g;
32     $s =~ s/>/&gt;/g;
33     $s =~ s/"/&quot;/g;
34     $s;
35     }
36 wakaba 1.2
37 wakaba 1.4 sub rfc3339date ($) {
38     my @gt = gmtime shift;
39     sprintf '%04d-%02d-%02dT%02d:%02d:%02dZ',
40     $gt[5] + 1900, $gt[4] + 1, @gt[3, 2, 1, 0];
41 wakaba 1.2 }
42    
43 wakaba 1.4 sub filesize ($) {
44     my $size = 0 + shift;
45     if ($size > 2048) {
46     $size /= 1024;
47     if ($size > 2048) {
48     $size /= 1024;
49     sprintf '%.1f メガオクテット', $size;
50     } else {
51     sprintf '%.1f キロオクテット', $size;
52     }
53     } else {
54     $size . ' オクテット';
55     }
56     }
57 wakaba 1.2
58 wakaba 1.4 opendir DIR, $dir or die "$dir: $!";
59     my @all_files = sort grep {not /^\./ and /^[A-Za-z0-9._-]+$/}
60     (readdir DIR)[0..1000];
61 wakaba 1.2 close DIR;
62 wakaba 1.4 my @files = grep {/\.(?:jpe?g|png|ico|gif|mng|xbm|JPE?G)(?:\.gz)?$/} @all_files;
63     my @dirs = grep {$_ ne 'CVS' and -d $dir.'/'.$_} @all_files;
64 wakaba 1.2
65 wakaba 1.4 sub has_file ($) {
66     my $name = shift;
67     my $namelen = 1 + length $name;
68     for (@all_files) {
69     if ($name.'.' eq substr $_, 0, $namelen) {
70     return 1;
71     }
72     }
73     return 0;
74 wakaba 1.2 }
75    
76 wakaba 1.3 my $title = '画像一覧';
77 wakaba 1.4 my $dirpath = escape $ENV{REQUEST_URI};
78     $dirpath =~ s/\?.*$//;
79     $dirpath =~ s#/LIST$##;
80     $dirpath ||= '/';
81 wakaba 1.2
82     print STDOUT "Content-Type: text/html; charset=euc-jp\n\n";
83    
84 wakaba 1.4 my $linkelement = '<link rel="stylesheet" href="/s/image-list" media="all" />';
85 wakaba 1.2
86     $| = '';
87     print <<EOH;
88 wakaba 1.4 <!DOCTYPE html SYSTEM>
89     <html lang="ja">
90 wakaba 1.2 <head>
91 wakaba 1.4 <title>$dirpath の${title}</title>
92 wakaba 1.2 ${linkelement}
93     </head>
94     <body>
95     <h1>${title}</h1>
96     EOH
97    
98 wakaba 1.4 if ($Opt{detail}) {
99     print q{<div class="pictures detail">};
100    
101     for my $file_name (@files) {
102     my $efile = escape $file_name;
103     my $uri = $efile;
104     $uri =~ s/\..+//g;
105     my @cls = split /\./, lc $file_name;
106     shift @cls;
107     print q{<div class="image-with-desc">};
108     print qq{<a href="$uri">};
109     print qq{<img src="$uri" alt="" class="@{[join ' ', @cls, 's']}"></a>};
110     print qq{<dl><dt>URI</dt><dd>};
111     print qq{<code class="uri">&lt;<a href="$uri">$uri</a>&gt;</code></dd>};
112     print qq{<dt>ファイル名</dt><dd>};
113     print qq{<code class="file"><a href="$efile">$efile</a></code></dd>};
114     print qq{<dt>日付</dt><dd>};
115     print rfc3339date ([stat $dir.'/'.$file_name]->[9]);
116     print qq{</dd>};
117     print qq{</dl>};
118     print q{</div>};
119     }
120 wakaba 1.2
121 wakaba 1.4 my @videos = grep {/\.(?:avi|mpe?g|mp3|wav|mid|swf)(?:\.gz)?$/i} @all_files;
122     for my $file_name (@videos) {
123     my $efile = escape $file_name;
124     my $uri = $efile;
125     $uri =~ s/\..+//g;
126     print q{<div class="image-with-desc">};
127     print qq{<a href="$uri"><img src="/~wakaba/archive/2005/movie-1" alt=""></a>};
128     print qq{<dl><dt>URI</dt><dd>};
129     print qq{<code class="uri">&lt;<a href="$uri">$uri</a>&gt;</code></dd>};
130     print qq{<dt>ファイル名</dt><dd>};
131     print qq{<code class="file"><a href="$efile">$efile</a></code></dd>};
132     print qq{<dt>日付</dt><dd>};
133     print rfc3339date ([stat $dir.'/'.$file_name]->[9]);
134     print qq{</dd>};
135     print qq{<dt>大きさ</dt><dd>};
136     print filesize ([stat $dir.'/'.$file_name]->[7]);
137     print qq{</dd>};
138     print qq{</dl>};
139     print q{</div>};
140     }
141    
142     for my $dir_name (@dirs) {
143     my $edir = escape $dir_name;
144     print q{<div class="dir dir-with-desc">};
145     if (-f $dir . '/' . $dir_name . '/favicon.png' or
146     -f $dir . '/' . $dir_name . '/favicon.ico') {
147     print qq{<img src="$edir/favicon" alt="" class="mini-icon">};
148     } else {
149     print qq{<img src="/icons/folder" alt="" class="mini-icon">};
150     }
151     print qq{<code class="file"><a href="$edir/LIST?detail">$edir/</a></code>};
152     print q{</div>};
153     }
154    
155     for (['cover', '表紙', 'start'],
156     ['introduction', 'はじめに', 'start'],
157     ['intro', 'はじめに', 'start'],
158     ['README', 'はじめに'],
159     ['contents', '目次', 'contents'],
160     ['list', '一覧', 'contents'],
161     ['description', '説明'],
162     ['index', '索引', 'index'],
163     ['latest', '最新版'],
164     ['current', '現行版']) {
165     if (has_file $_->[0]) {
166     print q{<div class="file file-with-desc">};
167     print q{<img src="/icons/layout" alt="" class="mini-icon">};
168     print qq{<a href="$_->[0]" rel="$_->[2]">$_->[1]</a>};
169     print q{</div>};
170     }
171     }
172    
173     print q{<div class="dir-up dir-with-desc">};
174     print q{<img src="/icons/forward" alt="" class="mini-icon">};
175     print q{<a href="../LIST?detail" rel="up">上の階層</a>};
176     print q{</div>};
177    
178     print q{</div>};
179     } else {
180    
181     print q{<div class="pictures">};
182     my $imgsattr = ' class="s"';
183    
184     for my $file_name (@files) {
185     my $uri = escape $file_name;
186     $uri =~ s/\..+$//g;
187     print '<a href="'.$uri.'">';
188     print '<img src="'.$uri.'" alt="'.$uri.'"'.$imgsattr.' />';
189 wakaba 1.2 print "</a>\n";
190     }
191 wakaba 1.4
192     print q{</div>};
193    
194     print q{<ul>};
195     for my $dir_name (@dirs) {
196     my $edir = escape $dir_name;
197     print q{<li class="dir">};
198     print qq{<code class="file"><a href="$edir/LIST">$edir/</a></code>};
199     print q{</li>};
200     }
201     print q{<li class="dir-up"><a href="../LIST" rel="up">上の階層</a></li></ul>};
202     }
203    
204     my $cvslink = '';
205     if (-d $dir . '/CVS') {
206     if (-f $dir . '/CVS/Root') {
207     open my $root, '<', $dir . '/CVS/Root';
208     if (<$root> =~ m#^(/home/cvs|/home/wakaba/pub/cvs)$#) {
209     my $rpath = $1;
210     if (-f $dir . '/CVS/Repository') {
211     open my $repo, '<', $dir . '/CVS/Repository';
212     my $reppath = escape <$repo>;
213     $reppath =~ tr/\x0A\x0D//d;
214     if ($reppath) {
215     $cvslink = qq{ <a href="/gate/cvs/$reppath/@{[
216     {q[/home/cvs] => '',
217     q[/home/wakaba/pub/cvs] => '?cvsroot=Wakaba'}->{$rpath}
218     ]}" rel="history">この階層の履歴</a>};
219     }
220     }
221     }
222     }
223 wakaba 1.2 }
224    
225     print <<EOH;
226 wakaba 1.4
227     <div class="footer">
228     <div class="navigation">
229     [<a href="/" rel="home">/</a>]
230     [<a href="." rel="contents">この階層</a>$cvslink]
231     [<a href="LIST" rel="alternate">画像一覧</a>
232     <a href="LIST?detail" rel="alternate">画像一覧 (詳細)</a>]
233     </div>
234 wakaba 1.2 </div>
235     </body>
236     </html>
237     EOH
238    
239     1;
240    
241 wakaba 1.4 __END__
242    
243    
244    
245     =head1 CHANGES
246    
247     2005-02-25 Wakaba <w@suika.fam.cx>
248    
249     - Use external style sheet.
250    
251     2001-06-25 Wakaba <wakaba@61.201.226.127>
252    
253     - In default, images are sized by stylesheet. When ?realsize=1,
254     images are not specified its size.
255     - Images are linked to itself.
256    
257     2001-05-17 Wakaba
258    
259     - New File.
260    
261     =head1 LICENSE
262    
263     Public Domain.
264    
265     =cut
266    
267     # $Date:$

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24