ディレクトリを後回しにする事に成功した。少しは見やすくなった・・・かもしれない。配列の扱いかたの勉強になった。
今回はタイトル文字列の取得を少し考えてみた。「titleタグ」があって、その中身が無いときにも、そのまま表示していたようだ。とりあえず「全角空白」だけのタイトルは除いて取得しない(?)ようにした。「全角空白」は「EUC」の落とし穴らしいのでとりあえずは無視。「Unicode」なら大丈夫なのだろうか?やってみよう。
改行については、とりあえずは無視。ファイルの読み込みは1行ずつ行われるようなので、ループに工夫が必要だ。フラグ1個でなんとかなるかな・・・?
あと、「インデックス」になるページは表示しないで、ディレクトリにそのタイトルを表示する事にした。でも、いい方法が浮かばなくて、結局「インデックス」を探すためだけにサブルーチンを作ってしまった・・・。二度手間だ。しかも、正規表現がよくわからない。「HTML-Lint」では「index\\.($HTMLEXT)」になっていた($HTMLEXTはhtmlの正規表現)けど、どう解釈していいのかわからない。「\\」は「\」を示すし、「\.」は「.」を示す。では「\\.」は何を示すのか?しかも「htmlの正規表現」が「()」で囲まれている。とりあえず消えてはいるけど・・・。大文字小文字を区別するのかと思ったら違うし、「\」は(少なくともWindowsでは)ファイル名に使えないし・・・。難しい。
・・・と思っていたけど、謎が解けた。この正規表現は、変数に格納されていたから、実際の文字列としては「index\.(html?|[sp]ht(ml)?)」になるんだ。あぁ・・・おバカさんだ・・・。そういうことだったのか。
それに気づいてから、変数文字列を変数に格納してみた。でも、それは文字列として解釈されるのか、思ったとおりにはならなかった。チョット残念。それに「\.」をそのまま変数に格納していたのもあった。変数の中身を考えると混乱する・・・。
ついでなので、インデックス以外にHTMLファイルが無い場合は「
- タグ」を書かないようにした。チョットだけこだわり。
あと、大量に「print」していると、時々書いてないはずの文字が表示される事がある。見た感じでは最後の部分に発生するようだ。何故なのかな?
ソースコード
#!/usr/bin/perl
# 初期設定
# require Jcode;
# *Jgetcode = \&Jcode::getcode;
# *Jconvert = \&Jcode::convert;
require "../../../cgi-bin/jcode.pl";
*Jgetcode = \&jcode::getcode;
*Jconvert = sub { &jcode::to($_[1], $_[0], $_[2]); };
@g_styles = ("../../ipp.css","../test.css");
$g_title = "テスト14";
$my_code = &Jgetcode("漢字");
$cut_code = "jis";
$htmlfile = "html?|[ps]ht(ml)?";
$scrname = $ENV{'SCRIPT_NAME'};
$scrname =~ s/_1|_u// ;
if($scrname =~ /ts[0-9]{4}\.cgi$/){
$linkfile = $& ;
$linkfile =~ s/\.cgi/\.htm/ ;
}
# 固有設定
$searchdir = "..";
$searchfile = "\\.$htmlfile";
$indexfile = "index\\.($htmlfile)";
{
&printHeader;
print "<div class=test>\n";
&Jprint("親ディレクトリ以下にあるファイルの一覧(HTMLファイルのみ)","\n");
print "<ul>\n";
&Jconv ("<li><a href=\"$searchdir\">", &indexSearch($searchdir), "</a>\n");
&dirlist($searchdir);
print "</ul>\n";
print "</div>\n";
&printFooter;
exit;
}
sub indexSearch{
local($dir) = $_[0];
local($result, @filelist);
opendir(DIR, $dir);
@filelist = readdir(DIR);
closedir(DIR);
@filelist = sort @filelist;
$result = "インデックス無し";
foreach(@filelist){
if(/$indexfile/){
$result = &getHTMLTitle("$dir/$&");
last;
}
}
return $result;
}
sub dirlist{
local($dir)=$_[0];
local(@filelist,@dirs, $file, $filename, $ftitle, $fileflg);
@dirs = ();
$fileflg = 1;
opendir(DIR, $dir);
@filelist = readdir(DIR);
closedir(DIR);
@filelist = sort @filelist;
foreach $file(@filelist){
if($file eq "."){ next; }
if($file eq ".."){ next; }
$filename = "$dir/$file";
if(-d $filename){
push(@dirs, $filename);
}elsif($filename =~ /$searchfile/){
if($filename !~ /$indexfile/){
if($fileflg){
print "<ul>\n";
$fileflg = 0;
}
$ftitle = &getHTMLTitle($filename);
&Jconv ("<li><a href=\"$filename\">$file(", $ftitle, ")</a>\n");
}
}
}
foreach $filename (@dirs){
if($filename =~ /[\w\-]+$/){
$file = $&;
}
$ftitle = &indexSearch($filename);
&Jconv ("<li><a href=\"$filename/\">$file(", $ftitle, ")</a>\n");
&dirlist($filename);
}
if(!$fileflg){print "</ul>\n";}
}
sub getHTMLTitle{
local($file)=$_[0];
local($ttl, $result);
$result = "タイトル無し";
if($file =~ /$htmlfile/){
open(IN, $file);
while(<IN>){
if(/<title>/){
if($' =~ /<\/title>/){
$ttl = $`;
if($ttl =~ /\S/){$result = $ttl;}
last;
}
}
}
close(IN);
}
return $result;
}
sub printHeader{
print "Content-type: text/html\n\n";
&Jprint ("<html lang=ja><head><title>$g_title</title>\n");
foreach (@g_styles){
print "<link rel=\"stylesheet\" type=\"text/css\" href=\"$_\">\n";
}
print "</head><body>\n";
print "<div class=head>\n";
&Jprint ("<h1>$g_title</h1><hr>\n");
&printlinks;
print "<hr></div>\n";
}
sub printFooter{
print "<div class=foot><hr>\n";
&printlinks;
print "<hr>\n";
open(IN, "../../sig.txt");
while (<IN>){
print;
}
close(IN);
print "</div>\n";
print "</body></html>\n";
}
sub printlinks{
print "<a href=\"../../../index.htm\">Home</a>\n";
print "/\n<a href=\"../../\">Perl</a>\n";
print "/\n<a href=\"../\">TestCGI Index</a>\n";
if($linkfile){
&Jprint ("/\n<a href=\"../$linkfile\">$g_titleの解説</a>\n");
}
}
sub Jprint{
foreach (@_) {
print &Jconvert($_, $cut_code, $my_code);
}
}
sub Jconv{
foreach (@_) {
print &Jconvert($_, $cut_code, &Jgetcode($_));
}
}
