自動的にサイトマップを作ってみたかった。
リンクをつけて、タイトルを書いて・・・。でも、位置関係がよくわからない。せめてディレクトリとファイルの区別はしてみたい。とりあえず「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($_));
}
}
