« サブディレクトリ内も一覧 | メイン | 漢字コードの変換(その2) »

サブディレクトリ内も一覧(その2)

ディレクトリを後回しにする事に成功した。少しは見やすくなった・・・かもしれない。配列の扱いかたの勉強になった。

今回はタイトル文字列の取得を少し考えてみた。「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($_));
    }
}

カテゴリ:

トラックバック

このエントリーのトラックバックURL:

同一カテゴリの最新記事

最近のエントリー

Amazon.co.jp

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.
Powered by
Movable Type 3.36
Amazon.co.jp