更新日記 URL インデックス作成スクリプト

更新日記インデックスだけでは見通しが悪い部分があるので、まずはハイパーリンクを抽出し、リンクされている単語、あるいは文節等をキーにして、そのキーが存在する日記のタイトルとリンク先のURLを取得してリスト表示するPerlスクリプトを書いた。日記のタイトルにはタグが付いているので、飛べるようにハイパーリンクを張っている。無論URLそのものにもハイパーリンクを張っている。

更新日記インデックス作成スクリプトでは、DATAハンドルでスクリプトに書き込んだ更新日記ページのファイル名を読み込んで使用しているが、いちいち毎月スクリプトを書き直す必要があるので、読み込むファイル名は自動生成するように工夫した。更新日記の書式は途中から少し変わっている。以前は更新内容の表示は日付行の次にタイトルなしで続けて書いていた。この中のハイパーリンクの日記タイトルには日付を表示し、単にそのページに飛ぶようにしている。

辞書を作るか、構文解析をして、日記のマッチする部分にnameタグを書き込めば、もっといろいろと仕掛けができるなと思うこの頃である。人名インデックスとか、組織名インデックスとか地名インデックスとか、いろいろな切り口でインデックスを作ることができるだろう。

[created: 04/27/2003]


use LWP::Simple;
use Net::FTP;

# Setup your configuration.
$ftpsite = '';
$ftpaccount = '';
$ftppassword = '';
$yourdir = '/homepage';
$outfile = 'renewal_urlindex.html';
$url = "http://homepage1.nifty.com/kazuf/";

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
for($iy=2001;$iy<=$year+1900;$iy++){
    if($iy == 2001){
        $immin = 3;$immax = 12;
    }elsif($iy == $year+1900){
        $immin = 1;$immax = $mon;
    }else{
        $immin = 1;$immax = 12;
    }
    for($im=$immin;$im<=$immax;$im++){
        $im =~ s/^(\d)$/0$1/;
        push(@rnfiles, "renewal_${iy}_${im}.html");
    }
}
push(@rnfiles, "renewal.html");
foreach $rnfile (sort @rnfiles){
    print $rnfile,":\n";
    $htmlfile = $url.$rnfile;
    @content = split(/\n+/, (get $htmlfile));
    foreach $line (@content){
        if($line =~ /^<DT>(.+)<DD>(.*)$/i){
            $date = $1;
            if($2 ne ""){
                $name = "";
                $theme = $date;
            }
            print $date, ":\n";
        }elsif($line =~ /^<div class=.+<A NAME="([^"]+)">([^<]+)<\/A><\/div>/i){
            $name = "#".$1;$theme = $2;
        }elsif($line =~ /^<div class=.+<A NAME="([^"]+)">[^<]*<A HREF="[^"]+">([^<]+)<\/A>[^<]*<\/A><\/div>/i){
            $name = "#".$1;$theme = $2;
        }
        while($line =~ /<A HREF="(http:[^"#]+)">([^<]+)<\/A>/gi){
            $anchor{$2} .= $1."\t".$name."\t".$theme."\t".$date."\t".$rnfile."@@@";print $1."\t".$name."\t".$theme."\t".$date, "\n";
        }
    }
}

open(OUT, "> $outfile");
#print "Content-type: text/html\n\n"
print OUT <<HERE1;
<HTML>
<HEAD>
  <TITLE>更新日記URLインデックス</TITLE>
  <META HTTP-EQUIV="Content-Type" content="text/html; charset=SHIFT_JIS">
<style type="text/css">
<!--
BODY{background:#FFFFF0}
.item{font-size:12pt;color:blue;font-weight:bold;text-decoration:underline}
//-->
</style>
</HEAD>
<BODY>
<IMG SRC="http://homepage1.nifty.com/kazuf/png/tsnetworkc3.png" ALIGN=LEFT HSPACE=20 ALT="tsnetworkc3.png">更新日記URLインデックス
<HR>
HERE1

print OUT "<DL>\n";
foreach $key (sort keys(%anchor)){
    @list = split(/@@@/, $anchor{$key});
    print OUT "<DT>$key<DD>\n";
    foreach $data (@list){
        ($url, $name, $theme, $date, $rnfile) = split(/\t/,$data);
        print OUT "<A HREF=\"$rnfile$name\">$theme</A> <A HREF=\"$url\">$url</A> [$date]<BR>\n";
    }
    print OUT "<BR>\n";
}

print OUT <<HERE2;
</DL><BR>
<HR>
 <I><A HREF="http://homepage1.nifty.com/kazuf/index.html">TS Network ☆ミ</A></I> <FONT COLOR="BLUERED">>></FONT>
<ADDRESS><A HREF="mailto:kazuf@mars.dti.ne.jp"><kazuf@mars.dti.ne.jp></A></ADDRESS><BR>
</BODY>
</HTML>
HERE2
close(OUT);

$ftp = Net::FTP->new($ftpsite);
print "$ftpsiteに接続しました。\n";
$ftp->login($ftpaccount, $ftppassword);
print "loginしました。\n";
$ftp->cwd($yourdir);
print "$yourdirディレクトリに移動しました。\n";
$ftp->ascii();
print "asciiモードにします。\n";
$ftp->put($outfile, $outfile);
print "$outfileを転送しました。\n";
$ftp->quit();
print "FTPを終了しました。\n";
sleep(1);

TS Network ☆ミ >> (C)jscripter