以下のperlのコードは前回の最後に紹介したBingAIのソースコードをベースに作成したものです。
#!/usr/bin/perl
use strict;
use warnings;
my $filename = './award/cafe/admin/data/page.dat';
my $filename1 = './award/linkv/data/log.cgi';
open (FILE, $filename) or die "Can't open $filename";
my @buffers = ;
my $lines = @buffers;
close FILE;
open(IN, "<$filename") or die "Could not open file '$filename'";
open(OUT, ">$filename1") or die "Could not open file '$filename1'";
my $head = 0;
while (my $row = ) {
# 入力データを一行読み込む
chomp $row;
# タブで分割する
my @fields = split /\t/, $row;
# 番号0, 日時A, タイトルを取り出す
my ($num, $date_a, $title) = @fields[0, 1, 3];
# 日時Aを年.月.日の形式から年月日の形式に変換する
my $date_b = $date_a;
$date_b =~ s/\.//g;
# 日時Aを年.月.日の形式から年,月,日の形式に変換する
my $date_c = $date_a;
$date_c =~ s/\./,/g;
# 変換後のデータを出力する
if ($head == 0) {
print OUT "$num<>admin<>$lines\n";
# print "$num<>admin<>$lines\n";
$head = 1;
}
print OUT "$num<>0<>$title<>http://mimizukobo.atwebpages.com/archives/day/$date_b-1.html<>$date_a<><><><>$date_c<>\n";
# print "$num<>0<>$title<>http://mimizukobo.atwebpages.com/archives/day/$date_b-1.html<>$date_a<><><><>$date_c<>\n";
}
close(IN);
close(OUT);
コメント行を入れて40行弱。ヘッダー部分の編集はもっと手抜きできますので、20行強のプログラムを走らせれば、LinkViewを使ってCafelogにタイトル一覧表示させることが出来ます。
プログラムはCafeLogの出力するpage.datを読み込み、その内容を編集し、ListViewerがタイトル一覧を編集出力するためのデータファイル(log.cgi)自動的に作成しています。
Perlを使えば、編集そのものは数行で済みますので、楽ですね。
テンプレートファイルを編集すると、こんな感じでタイトル一覧が表示されます。
このプログラム、次のような指示書によりBingAIが出力したものです。
perlを使い、
番号0\t日時A\t時刻\tタイトル\t数字\tカテゴリ数字\t数字\t数字\t\nとなっているデータを一行単位に読み取り、
番号<>0<>タイトル<>http://mimizukobo.atwebpages.com/archives/day/日時B-1.html<>日時A<><><><>日時C<>\n
という具合に変換し、印字するプログラムを作成して下さい。
日時Aは年.月.日
日時Bは年月日(20230101という具合に年月日の数字をくっつけて、区切りの/は無し)
日時Cは年,月,日
とします。
また、先頭には読み取った一行を使い
番号0<>admin<>番号0\n
という行を追加して下さい。
この位に丁寧な説明だと、BingAIでもperlプログラミングしてくれます。perlに慣れている人だと「自分でプログラミングした方が速いよ」といわれそうですね。また、前回書いたように完全なコードではありません。上記例のようにWhileループを補ってやる必要があります。
僕の場合はPerlには慣れていないので、インタネットでサンプル捜しし、適当に修正する手間が省けるので、助かりました。
データファイル(log.cgi)のhtml(listv.html)出力はadmin.cgiを使い、行います。
admin.cgiを起動すると次のような画面が表示されます。
最新の記事を選び、プルダウンメニューで「修正」を選び、実行(送信する)。
修正用の画面が表示されますので、そのまま「送信する」させます。
これで最新のタイトル一覧画面用のHTMLが生成され、表示できるようになります。
この方法はListViewer側のCGIの変更は不要で、上記のperlスクリプトをWindows環境で実行させるだけです。簡単でいいのですが、サイトで更新されたpage.datをダウンロードし、スクリプトが変換したlog.cgiをサイトにアップロードする必要があるなど多少手間がかかります。
という訳で、admin.cgiに上記のコードを追加すれば、楽を出来そうなので、やってみることにしました。「実行」というプルダウンメニューを用意し、クリックすればHTMLが生成されるという方式にしました。
このため、admin.cgiに手を入れた内容です。
最初の関数 sub admin_mode の判定分岐部分の最後に以下を追加。
# 実行
} elsif ($in{job} eq "exec") {
my $filename = 'page.dat';
open(IN,"<../admin/data/$filename") or &error("open err: '$filename'");
open(DAT,"> $cf{logfile}") or &error("open err: $cf{logfile}");
my $headerkey = 0;
while (my $row = ) {
chomp $row;
my @fields = split("\t", $row);
my $dateA = $fields[1];
my $dateB = $dateA;
$dateB =~ s/\.//g;
my $dateC = $dateA;
$dateC =~ s/\./,/g;
my $url = "http://mimizukobo.atwebpages.com/archives/day/$dateB-1.html";
my $cate = 7 - $fields[5];
if ($headerkey == 0) {
my $num = $fields[0];
my $new_row1 = "$num<>admin<>$num\n";
print DAT "$new_row1";
$headerkey = 1;
}
my $num1 = 7 - $fields[5];
my $new_row = "$fields[0]<>$num1<>$fields[3]<>$url<>$dateA<><><><>$dateC<>\n";
print DAT "$new_row";
}
close(IN);
close(DAT);
# 日付取得
my ($date,$time,$mark) = &get_time;
# データ読み込み
my (@data,%data,%cate);
open(DAT,"+< $cf{logfile}") or &error("open err: $cf{logfile}");
eval "flock(DAT, 2);";
my $top = ;
while() {
chomp;
my ($no,$cate,$sub,$url,$com,$date,$time,$host,$mk) = split(/<>/);
$mk ||= '2000,01,01';
push(@data,"$_\n");
$data{$cate} .= "$sub<>$url<>$com<>$mk\t";
# カテゴリデータ認識
$cate{$cate}++;
}
chomp($top);
my ($num, $ip, $all) = split(/<>/, $top);
my $all = @data;
# マスタデータ更新
unshift(@data,"$num<>$ip<>$all<>\n");
seek(DAT, 0, 0);
print DAT @data;
truncate(DAT, tell(DAT));
close(DAT);
# HTML更新
&renew_html(\%data,\%cate,$all,$date);
}
前半部分は最初に紹介したスクリプトを簡略化したもの。後半部分はHTML更新を行うための関数を呼び出すためのデータを生成しています(こちらは削除処理のコードをほとんどそのまま流用)。
直後の管理画面のプルダウンメニューを次の通り変更します。
if (!$cf{reg_type}) {
print qq|<option value="exec">実行\n|;
print qq|<option value="add">新規\n|;
}
print <<EOM;
<option value="edit">修正
<option value="dele">削除
あと、これ以外にJcodeを呼び出す部分(4箇所)をコメントアウトしています。修正機能を使わなければ不要ですが、一応対応しました。
実はこの日本語コードの問題が今回の対応で一番手こずりました。詳しくは次回に。