« ファイルを作って飛ばす | メイン | サブディレクトリ内も一覧(その2) »

サブディレクトリ内も一覧

自動的にサイトマップを作ってみたかった。

リンクをつけて、タイトルを書いて・・・。でも、位置関係がよくわからない。せめてディレクトリとファイルの区別はしてみたい。とりあえず「sort」という命令で配列をソートできるのはわかったけど、ディレクトリの内部をそのままソートすると、全部ごちゃごちゃになってしまった。ディレクトリかどうかは「-d」で検査できるので、配列の順序を並び替える事もできそうだ。

このディレクトリの探索方法は「とほほのWWW入門」の「検索フォーム設置法」で使われていたスクリプトを参考にした。だんだんわかってきているのか、プログラムが見えるようになってきた。これからが楽しみだ。

ここでの「HTMLファイル」は正規表現を使って取得している。「HTML-Lint」で使っていたのを見てみると「html?|[sp]ht(ml)?」となっていた。対象がわかっている正規表現を見ると理解が深まる。今までは「?」の使い方を勘違いしていたようだ。

ソースコード

#!/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 = "テスト13";
$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;
 
{
    &printHeader;
    
    print "<div class=test>\n";
    &Jprint("親ディレクトリ以下にあるファイルの一覧(HTMLファイルのみ)","\n");
    &dirlist($searchdir);
    print "</div>\n";
    
    &printFooter;
    
    exit;
}
 
sub dirlist{
    local($dir)=$_[0];
    local(@filelist, $file, $filename, $ftitle);
    opendir(DIR, $dir);
    @filelist = readdir(DIR);
    closedir(DIR);
    @filelist = sort @filelist;
    print "<ul>\n";
    
    foreach $file(@filelist){
        if($file eq "."){ next; }
        if($file eq ".."){ next; }
        $filename = "$dir/$file";
        if(-d $filename){
            print "<li><a href=\"$filename/\">$file</a>\n";
            &dirlist($filename);
        }elsif($filename =~ /\.$searchfile/){
            $ftitle = &getHTMLTitle($filename);
            &Jconv ("<li><a href=\"$filename\">$file(", $ftitle, ")</a>\n");
        }
    }
    print "</ul>\n";
}
 
sub getHTMLTitle{
    local($file)=$_[0];
    local($result);
    $result = "タイトル無し";
    if($file =~ /$htmlfile/){
        open(IN, $file);
        while(<IN>){
            if(/<title>/){
                if($' =~ /<\/title>/){
                    $result = $`;
                    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