#!/usr/bin/perl -w use strict; # スクリプト情報.. #------------------------------------------------------------------------------------------------------- our $Script = q[HT Log Maker LE]; # v0.02b2 - 2004/05/19 ('class="main"'が重複するバグの修正のみ) 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文書の体裁を優先したため従来の過去ログとは互換性がないことに注意 # (従来の過去ログと差し替えると検索が正常に行えなくなる) # # 従来の過去ログと同形式にするには「#-- 設定ここまで」の次行を下のように設定 # our $subjc = 'fffffe'; # 題名と投稿者名の色(16進表記:先頭に # は不要) # (リダイレクタ・画像展開表示・フッタ挿入・ValidっぽいHTML/CSS・記事リンク等 #  は無効になるが過去ログをそっくり復元したい場合には有用) # # 「投稿日」の「秒」の右にある「.」はその記事自身へのリンクになっているので # 当該記事にリンクを張りたい場合に便利な隠れ機能 # 設定.. #------------------------------------------------------------------------------------------------------- my $log = '../bbs.dat'; # データファイルのパス my $open = 1; # 実行後にログ一覧をブラウザで 1:開く / 0:開かない [for Win] my $cgi = 0; # サーバ上で実行する our $title = '@じょしあな'; # 掲示板のタイトル our $img_dir = '../data/'; # 画像ファイルのディレクトリ our $img_ins = '%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 = ''; # リダイレクタのパス our $img_ndx = '../data/'; # 画像ディレクトリ一覧表示のパス #-- 以下は自分の環境に合わせて # スクリプトのバージョン our $ver = "v3.04"; # bodyタグ〈必須〉 our $body = ''; # スタイルシート our $style = q` `; # バナー等〈例:XREA〉 our $banner = q`
xrea ad banner
`; #-- 設定ここまで our $subjc; # 処理.. #------------------------------------------------------------------------------------------------------- if($cgi) { use CGI::Carp qw(fatalsToBrowser); #エラーチェック用 print "Content-Type: text/html\n\n",qq`\n\n$Script\n\n$body\n
\n`;
}
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";
if($cgi) {
	print qq`
\n

\ngo to the index page\n\n\n`; } else { 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 { (my $xbody = $body) =~ s/>/ class="index">/; open(NDX, '>index.html'), print NDX <<"_XHEAD_"; $style $title - 過去ログ $xbody

 $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
* $Script  by $Copy 
for  あやしいわーるど@じょしあな + TeamMIZUIRO 
@{[$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 { open(OUT, ">$year$mon.html"); if($subjc) { print OUT <<"_HEAD_"; $title $body $title $year年$mon月過去ログ _HEAD_ } else { $body =~ s/(?: class="main")?>/ class="main">/; 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_" unless($subjc);

以上は、$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▲
あやしいわーるど@じょしあな + TeamMIZUIRO $ver 
@{[$insert ? $banner : '']} _FOOT_ close(OUT); $pcount++; print NDX qq( $year年$mon月  $aday〜@{[($year . $mon != $last_year . $last_mon) ? $zday : $eday]}日   @{[&commify($nr - $nrr)]} 件   @{[&commify(-s "$year$mon.html")]} bytes \n); $nrr = $nr; } # foot end sub rtcl { # ヌルコードまたは に変換記録した半角カンマを復帰させる tr/\x00/\,/, s//\,/g foreach(@_); my($date,$name,$mail,$text,$subj,$link,$img,$w,$h) = @_; if($subjc) { print OUT <<"_PRE_";
$subj 投稿者:@{[$mail ? qq'$name' : qq'$name']}  投稿日:$date

_PRE_

		# 画像は展開しない
		if($img) {
			($text =~ s|\Q$img_ins\E|upload画像:$img|)
			  or print OUT qq(upload画像:$img\n\n);
		}

		# 自動リンク
		$text =~ s||WWW画像:$1|ig;

		print OUT "$text\n

\n"; # URL欄のリンク if($link) { if($link =~ s#^(?!https?://)[\./a-z]*\?action=search1\&search=(.*)#参考:$1#i) { print OUT qq($link

\n); } else { print OUT qq($link

\n); } } print OUT "

\n"; $nr++; } else { print OUT <<"_PRE_";
$subj 投稿者:<@{[$mail ? qq'a href="mailto:$mail">$name$name  投稿日:$date.
_PRE_

		# 画像
		my $size = ($w && $h) ? qq( width="$w" height="$h") : '';
		if($img) {
			if($img_disp) {
				($text =~ s#\Q$img_ins\E#$img#)
				  or print OUT qq($img\n\n);
			} else {
				($text =~ s#\Q$img_ins\E#[ Upload画像:$img@{[(-e "$img_dir$img") ? sprintf(' (%s bytes)', &commify(-s _)) : '']} ]#)
				  or print OUT qq([ Upload画像:$img@{[(-e "$img_dir$img") ? sprintf(' (%s bytes)', &commify(-s _)) : '']} ]\n\n);
			}
		}

		# 引用部分
		my @temp = split(/\r/, $text);
		$text = '';
		foreach(@temp) { $_ = qq($_) if(/^(?:>|>)/); }
		$text = join("\n", @temp);

		# 自動リンクと画像展開表示の修正
		$text =~ s#[^<]+#$1#ig if($redir);
		if($img_disp) {
			$text =~ s##@{[&cut($1)]}#ig;
		} else {
			$text =~ s##[ WWW画像:$1 ]#ig;
		}
		print OUT "$text\n
\n"; # URL欄のリンク if($link) { if($link =~ s#^(?!https?://)[\./a-z]*\?action=search1\&search=(.*)#参考:$1#i) { my $anc = &nrize($1); my $page = substr($anc,0,6); print OUT qq($link
\n); } else { print OUT qq($link
\n); } } print OUT "
\n\n"; } } # rtcl end # Script END