#!/usr/bin/perl -w #----------------------------------------------------------------------------------------------------------------------- # Xie's Cards 1.23 by Lilia [2004-06-09] #----------------------------------------------------------------------------------------------------------------------- # 任意のディレクトリ内にある画像ファイルをアルバム風に一覧表示し # スライドショー風の閲覧も可能にするCGIスクリプト # the most recent version is available at: # http://nursery.s8.xrea.com/R=vindex use 5.004; # not sure... but use a modern perl use CGI::Carp qw(carpout fatalsToBrowser); use strict; use SelfLoader; my %ini = ( # ユーザー設定.. #----------------------------------------------------------------------------------------------------------------------- # 基本項目 Title => 'index', # ページのタイトル ImgDir => './img', # 画像ディレクトリのパス (カレントディレクトリなら '.') ImgExt => 'jpg|gif|png', # 画像とみなす拡張子 (大・小文字は区別しない) ViewSub => 0, # 下位ディレクトリにも対応する { 0:無効 / 1:有効 } # 表示関係 VMax => 4, # 横にならぶ画像の個数 HMax => 2, # 縦にならぶ画像の個数 (1ページあたりの最大列数) ImgWidth => 100, # 縮小表示時の画像の幅 ImgHeight => 75, # 縮小表示時の画像の高さ SortType => 2, # { 0:日付の古い順 / 1:新しい順 / 2:名前順 } にならべる # advanced Slideshow => 1, # スライドショー風の表示を可能にする { 0:無効 / 1:有効 / 2:画像が複数ある場合のみ } NoUserSort => 0, # 閲覧者によるファイルのソートを許可しない { 0:無効 / 1:有効 } NameWidth => 0, # ファイル名表示の長さ { n:n(>5)バイト / 0:自動 / -1:短縮せず } *長いファイル名は短縮される IgnoRE => qr/^$/, # 一覧から除外するファイルの正規表現 (とくに問題なければこのまま) * qr/^\./ は組込み済 RLastMod => 0, # ファイルの最終更新時刻をもとに Last-Modified や 304 等を返す { 0:無効 / 1:有効 } # *NPHスクリプトとしての実行を推奨 (ファイル名が 'nph-' で始まっていれば自動認識) # extra NoImgWin => 0, # 画像ファイル名のリンクを別のウィンドウで開かない { 0:無効 / 1:有効 } VaryMode => 0, # prev<->next の代わりに new<->old と表記する { 0:無効 / 1:有効 } # *更新日時または初期設定の順およびその逆順でソートされている場合のみ (NoUserSort 有効を推奨) #-- 以下はスタイルシートやリンク等の追加設定 (不要なら # でコメントアウト可) # body タグ Body => '
', # スタイルシート Style => '', # 設定しなければデフォルトのスタイル (スクリプト末尾の例から選択も可能) # # 記述例 (デフォルト) # Style => q` # body { background-color:#ffffff; color:#333333; font-family:Arial,Tahoma,Helvetica,Verdana,'MS PGothic',Osaka,sans-serif; } # small { font-size:80%; line-height:140%; } # .tall { line-height:200%; } # .note { background-color:transparent; color:#ff0000; } # a:link, a:visited { background-color:transparent; color:#666666; text-decoration:none; } # a:hover,a:active { background-color:transparent; color:#333333; text-decoration:underline; } # a.ex:link, a.ex:visited { background-color:transparent; color:#333333; text-decoration:none; } # a.ex:hover,a.ex:active { background-color:transparent; color:#333333; text-decoration:underline; } # table.index img { border:1px solid #cccccc; margin-bottom:5px; } # table.index img:hover { border-color:#999999; } # /* table.index em.dir:hover { border:1px solid #999999; padding:12px; } */ # `, # ナビゲーション用のタグ # Metas => q` # # `, # 掲示板等へのリンクをつけたければタグで指定 # GoLink => '<< back', # 特殊オプション - for XREA users XreaIns => 0, # XREA.com のバナーを挿入する { 0:無効 / 1:有効 } # ..ここまで #----------------------------------------------------------------------------------------------------------------------- # more advanced RelLink => 0, # 画像に関連するURIへのリンクを表示 { 0:無効 / 1:スライドショー表示時のみ / 2:一覧表示時のみ 3:1+2 } N2RLink => sub { # ファイル名から関連URIへのリンクを生成するサブルーチン (RelLink が有効な場合) my $uri = shift; # ファイル名を受取る my $short = shift; # この値は次のいずれか { 0:スライドショー表示時 / 1:一覧表示時 } my($f_path,$f_size,$f_mtime) = @_; # ファイルのパス, サイズ, 最終更新時刻 (後2者は (stat $f_path)[7,9] と等しい) # *不要ならコメントアウト可 my $text = !$short ? '~*rel?' : '~*'; # 'スライドショー表示時のアンカー文字列' : '一覧表示時のアンカー文字列' my $r = 0; # replaced or not #-- # 正規表現をつかった単純な方式の例 (わかりにくいかもしれないけど s/// を x修飾子つきで2行に分けているだけ) # a) 日記 - (s)YYYYMMDD_N.jpg → /diary/YYYYMMDD.html $r = $uri =~ s{^s?(\d\d\d\d)(\d\d)(\d\d).*$} {$text}ix; # or "/diary/?$1" # b) 画像掲示板 - {pre}{time}.jpg → bbs.cgi?date=YMD_HMS # require POSIX; # use POSIX qw(strftime); としてスクリプト冒頭に移してもいい # $r = $uri =~ s{^[^\d]*(\d+).*$} # or ^(?:pre)?(\d+).*$ # {'$text'}iex; # *参考: POSIX::strftime() の代わりにスクリプト後部に用意した _mytime2s() も自由に編集して利用できる … _mytime2s($1 + 9*60*60) 等 # その他の例 (RelLink > 1 の場合何度も呼び出されるのであまり重いのはNG) # a) 外部CGI # $uri = qq{$text}; # $r = 1; # b) 過去ログ検索 (ファイルの最終更新時刻を利用) # require POSIX; # $uri = '$text'; # $r = 1; #-- return $r ? $uri : ''; # 関連URIがあるならそれを、なければ空の値を返す }, # 日本語環境に依存しない NoJP => 0, # ISO-8859-1(en) で出力 (出力に日本語が含まれていないなら有効にしてもいい) # ファイル名の先頭に 'nph-' が付いていれば NPHスクリプトとして実行される NPH => ($0 =~ m|\bnph-[^/\\ ]+$|i) || 0, ); #----------------------------------------------------------------------------------------------------------------------- &xview(%ini); exit; #----------------------------------------------------------------------------------------------------------------------- # BEGIN { # maybe useful when you run this script as NPH # return unless($0 =~ m|\bnph-[^/\\ ]+$|i); # open(ERR, ">>error.log") or # die("Unable to open error.log: $!"); # carpout(\*ERR); # } use vars qw($VERSION %INF); use vars qw(%f_d %f_s %f_m); BEGIN { $VERSION = '1.23'; %INF = ( Script => q{Xie's Cards}, Sign => q{script by Lilia(*'-')~}, Dist => q{http://nursery.s8.xrea.com/}, # スクリプトが改造済みであることをごく控えめかつ手軽に主張したい人のための用意 # Plus => q{+}, # or + ); # make the path safe for the -T switch # $ENV{PATH} = '/bin:/usr/bin:/usr/local/bin'; # if ${^TAINT} } sub xview (;%) { # メイン処理 my %Ini = @_; # 設定の確認と調整 { my %_ini = ( # デフォルト値 Title => 'index', ImgDir => '.', ImgExt => 'jpg|gif|png', VMax => 4, HMax => 2, ImgWidth => 80, ImgHeight => 100, SortType => 2, Slideshow => 1, NameWidth => 0, ); foreach(qw/Title ImgDir ImgExt/) { $Ini{$_} = $_ini{$_} unless defined $Ini{$_}; } foreach(qw/VMax HMax ImgWidth ImgHeight SortType Slideshow NameWidth/) { $Ini{$_} = defined $Ini{$_} ? int $Ini{$_} : $_ini{$_}; } } $Ini{ImgDir} =~ s|(?!^)/$||; # 末尾に '/' が付いていたら消しておく $Ini{Body} ||= ''; foreach($INF{Plus},$Ini{Style},$Ini{Metas},$Ini{GoLink}) { $_ = '' unless defined; } $Ini{IgnoRE} = '(?-xism:^$)' if(!defined $Ini{IgnoRE} || $Ini{IgnoRE} eq '' || $Ini{IgnoRE} eq '(?-xism:)'); $Ini{RelLink} = 0 unless($Ini{RelLink}); $Ini{SortKey} = ($Ini{SortType} < 2) ? 'M' : 'N'; # SortType は実はわかりやすい形をとった簡易設定であって... $Ini{SortOrder} = ($Ini{SortType} == 1) ? 'D' : 'A'; # ...ここで本来の設定 SortKey と SortOrder に分解する my $time = time; my($myself) = $0 =~ m|([^/\\ ]+)$|; my($self_uri) = $ENV{REQUEST_URI} || $ENV{SCRIPT_NAME} || $myself; s/\?.*// foreach($myself,$self_uri); # lose any query part my $img_dir = $Ini{ImgDir}; my $title_max = ($Ini{NameWidth} - 3 > 2) ? ($Ini{NameWidth} - 3) : int($Ini{ImgWidth} / 5.5); # 3 for '...' my $target = $Ini{NoImgWin} ? '' : ' target="img"'; my $n2rlink = (!$Ini{RelLink} || !defined $Ini{N2RLink} || $Ini{N2RLink} eq '') ? sub { ''; } : $Ini{N2RLink}; my $sort_key = $Ini{SortKey}; my $sort_order = $Ini{SortOrder}; my $no_css = 0; my $page_nr = 1; my $req_dir = ''; my $s_file_nr = 0; my $srch_key = ''; my $no_cache = 0; my $get_dirinfo = 1; # 表示対象の下位ディレクトリを File::Find でサーチ (不具合があれば無効可) my @info; # HTTPヘッダ my($proto,$nl,$head_gen) = $Ini{NPH} ? ($ENV{SERVER_PROTOCOL},"\015\012",'Date: ' . time2rfcdate($time) . "\015\012Server: $ENV{SERVER_SOFTWARE}\015\012") : ('Status:', "\012", ''); my $status = '200 OK'; my $head_lm = ''; my($charset,$cont_opt,$lang) = !$Ini{NoJP} ? ('; charset=Shift_JIS', "Content-Language: ja$nl",' lang="ja"') : ('; charset=ISO-8859-1',"Content-Language: en$nl",' lang="en"'); # HTML断片 my $banner = ''; # 一覧表示時のバナー (ページ下部に挿入されるHTML断片) my $sbanner = ''; # スライドショー表示時のバナー my $post_head_s = ''; # の直後に挿入されるHTML断片 my $post_html_e = ''; # の直後に挿入されるHTML断片 (特殊) # XREA広告 (メイン画面だけの表示でいい) ($banner,$post_head_s) = ("\n" . <<"_XREA_", '') if($Ini{XreaIns} && $ENV{SERVER_NAME} && $ENV{SERVER_NAME} ne 'localhost'); _XREA_ # バナー消し (旧 参考) # $post_html_e = ($ENV{SERVER_NAME} && $ENV{SERVER_NAME} =~ /(?:virtualave|hypermart)\.net/i) ? "[DIR] $dir_title >> |
_DIR_
} else { # ファイル
my $img_info = size2s($f_s{$_});
my $img_title = $_;
$img_title =~ s/^(.{$title_max}).{4,}$/$1.../o unless($Ini{NameWidth} < 0); # LongName...
$img_info = "$_, $img_info" if($img_title ne $_); # ファイル名を短縮した場合はアンカータグの title でフル表示
my $img_src = "$img_dir/$_";
my $rel_anchor = ($Ini{RelLink} > 1) ? &$n2rlink($_,1,$img_src,$f_s{$_},$f_m{$_}) : '';
# $img_src =~ s|([^a-z0-9\-_./])|'%' . unpack('H2', $1)|ieg; # URIエスケープ
s/&/&/g, s/</g, s/>/>/g, s/"/"/g foreach($img_info,$img_title,$img_src);
my($img_link_s,$img_link_e) = $slide_link
? (qq``,'')
: ('','');
print <<"_IMG_";
$img_link_s$img_link_e $img_title$rel_anchor |
_IMG_
}
$file_nr++;
}
print "