#!/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`
xrea ad banner
`; #-- 設定ここまで # 処理.. #------------------------------------------------------------------------------------------------------- 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
* $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 { $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▲
あやしいわーるど@じょしあな + 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) = @_; print OUT <<"_PRE_";
$subj 投稿者:<@{[$mail ? 'a href="mailto:$mail"' : 'span class="name"']}>$name  投稿日:$date.
_PRE_

	# 画像
	my $size = ($w && $h) ? qq( width="$w" height="$h") : '';
	if($img) {
		if($img_disp) {
			($text =~ s#\Q$img_inst\E#$img#)
			  or print OUT qq($img\n\n);
		} else {
			($text =~ s#\Q$img_inst\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