#!/usr/bin/perl -w
use strict;
# スクリプト情報..
#-------------------------------------------------------------------------------------------------------
our $Script = q[HT Log Maker LE]; # v0.01b - 2002/07/07
our $Copy = q[Lilia];
our $Dist = q[http://nursery.s8.xrea.com/];
#-------------------------------------------------------------------------------------------------------
# @じょしあな + TeamMIZUIRO 掲示板の記事データファイルから
# 月ごとのHTMLログ及びそのリストを生成するスクリプト(試作)
# * ローカル実行専用・完全無保証
# メモ..
#-------------------------------------------------------------------------------------------------------
# こんなときにおすすめ
# ・手元にはデータファイルしかないけどHTMLで読みたい
# ・従来の過去ログでは画像が展開表示されないのが不満
# ・掲示板閉鎖後にHTMLログのみアップロードしたい
# etc.
#
# データファイルのあるディレクトリ内に新しくログ用のディレクトリを作成して
# そのなかでこのスクリプトを実行すると安全かも
# ・生成されるファイル: N箇月分の YYYYMM.html + index.html
# ・必要なファイル : 掲示板の記事データファイル (bbs.dat)
#
# 〜例〜
# cgi-bin/
# |--bbs.dat ..記事データファイル
# |--data/ ..画像ファイルのディレクトリ(なくても可)
# |--bbslog/ ..ログ生成用ディレクトリ
# |--dat2html.perl ..このスクリプト
# ↓ 実行後
# cgi-bin/
# |--bbs.dat
# |--data/
# |--bbslog/
# |--dat2html.perl
# |--index.html ..ログ一覧
# |--200105.html ..最初の月のHTMLログ
# | :
# |--200301.html ..最後の月のHTMLログ
#
# HTML文書の正当さを優先したためオリジナルの過去ログとは互換性がないことに注意
#
# 「投稿日」の「秒」の右にある「.」はその記事自身へのリンクになっているので
# 当該記事にリンクを張りたい場合に便利な隠れ機能
# 設定..
#-------------------------------------------------------------------------------------------------------
my $log = '../bbs.dat'; # データファイルのパス(ローカル)
my $open = 1; # 実行後にログ一覧をブラウザで 1:開く / 0:開かない [for Win]
our $title = '@じょしあな'; # 掲示板のタイトル
our $img_dir = '../data/'; # 画像ファイルのディレクトリ
our $img_inst = '%image'; # 画像挿入キー
our $img_disp = 1; # 画像表示 1:ON / 0:OFF
our $insert = 0; # 下部にバナー等を挿入する(必要な場合のみ)
#-- 以下はあれば設定、存在しないか設定する必要がなければ空欄
our $bbs_url = 'http://foo.bar.com/~user/cgi-bin/bbs.cgi';
# 掲示板本体のURL
our $redir = '../r.cgi'; # リダイレクタのパス
our $img_ndx = '../data/'; # 画像ディレクトリ一覧表示のパス
#-- 以下は自分の環境に合わせて
# スクリプトのバージョン
our $ver = "v3.04";
# bodyタグ〈必須〉
our $body = '
';
# スタイルシート
our $style = q`
`;
# バナー等〈例:XREA〉
our $banner = q`
`;
#-- 設定ここまで
# 処理..
#-------------------------------------------------------------------------------------------------------
print "now processing...\n\n";
open(DB, $log) || die("Can't open $log: $!\n");
our @logs = reverse ;
close(DB);
our($strt_year,$strt_mon,$sday) = $logs[0] =~ /^(\d{4})年(\d{2})月(\d{2})日/;
our($last_year,$last_mon,$eday) = $logs[$#logs] =~ /^(\d{4})年(\d{2})月(\d{2})日/;
our($year,$mon,$nr,$nrr,$pcount,$aday,$zday) = ($strt_year,$strt_mon,0,0,0,$sday);
our($next_year,$next_mon,$prev_year,$prev_mon) = &next($year,$mon);
&xopen; # ログ一覧ファイル
&head; # 最初の月のヘッダ
&trunk foreach @logs;
&foot; # 最後の月のフッタ
&xclose;
print "done!\n";
eval { system('start index.html') } if($open && ($ENV{PATH} =~ /WINDOWS/i)); # Win環境以外は知らない
exit;
# サブルーチン..
#-------------------------------------------------------------------------------------------------------
sub prev {
my($year,$mon) = @_;
return !($mon - 1) ? ($year - 1,12) : ($year,sprintf('%02d', $mon - 1));
} # prev end
sub next {
my($year,$mon) = @_;
return ($mon + 1 == 13) ? ($year + 1,'01') : ($year,sprintf('%02d', $mon + 1));
} # next end
sub nrize {
(my $date = shift) =~ tr/0-9//cd;
return $date;
} # nrize end
sub chpn {
($prev_year,$prev_mon) = &prev($year,$mon) if($year . $mon > $strt_year . $strt_mon);
($next_year,$next_mon) = &next($year,$mon) if($year . $mon < $last_year . $last_mon);
} # chpn end
sub commify {
my $number = shift;
1 while($number =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/g);
return $number;
} # commify end
sub cut {
(my $uri = shift) =~ s|.*?([^/]+)$|$1|;
return $uri;
} # cut end
sub xopen {
$body =~ s/>/ class="index">/;
open(NDX, '>index.html'), print NDX <<"_XHEAD_";
$style
$title - 過去ログ
$body
$title - 過去ログ
$strt_year/$strt_mon 〜 $last_year/$last_mon
_XHEAD_
} # xopen end
sub xclose {
my $extra = ($bbs_url || $img_ndx) ? qq(
\n\n) : '';
$extra.= $bbs_url ? qq( ⇒掲示板本体) : '';
$extra.= $img_ndx ? qq( \n ⇒Upload画像一覧) : '';
$extra.= $extra ? "\n" : '';
print NDX <<"_XFOOT_";
以上、全 $pcount箇月 / @{[&commify($nr)]}件 の記事が登録されています。
$extra
@{[$insert ? $banner : '']}
_XFOOT_
close(NDX);
} # xclose end
sub trunk {
my($this_year,$this_mon,$this_day) = /^(\d{4})年(\d{2})月(\d{2})日/;
# 新しい月:フッタとヘッダ
if($this_year . $this_mon != $year . $mon) {
&chpn, &foot;
$aday = $this_day;
($year,$mon) = ($this_year,$this_mon);
&chpn, &head;
}
$zday = $this_day;
# 記事表示
&rtcl(split /\,/);
} # trunk end
sub head {
$body =~ s/class="index">/class="main">/;
open(OUT, ">$year$mon.html"), print OUT <<"_HEAD_";
$style
$title - $year年$mon月
$body
$title
$year/$mon
@{[($year . $mon > $strt_year . $strt_mon) ? qq(前月.. ) : qq()]}
@{[($year . $mon < $last_year . $last_mon) ? qq(..次月 ) : qq()]}
ログ一覧
DOWN▼
_HEAD_
} # head end
sub foot {
print OUT <<"_FOOT_";
以上は、$year年$mon月に投稿された記事です。@{[($year . $mon == $strt_year . $strt_mon) ? 'これ以前の記事はありません。' : ($year . $mon == $last_year . $last_mon) ? 'これ以後の記事はありません。' : '']}
@{[($year . $mon > $strt_year . $strt_mon) ? qq(前月← ) : qq()]}
@{[($year . $mon < $last_year . $last_mon) ? qq(→次月 ) : qq()]}
ログ一覧
UP▲
@{[$insert ? $banner : '']}