#!/usr/local/bin/perl #!D:/Perl/bin/perl.exe # 過去ログのhtmlファイル作成 2002.11.29 作成:鷹の巣 # URL:http://sakaguch.com 電子メール:http://sakaguch.com/cgi/postmail/ より送信して下さい。 # ファイル名:PastList.pl # # 改版記録: # 2002.09.28 Rev.0.000 初版 # 2002.10.11 Rev.0.100 HTML 4.01 strictのhtmlファイルの文法に変更。 # 2002.11.08 Rev.0.101 XHTML 1.0 strictのhtmlファイルの文法に対応。 # 2002.11.21 Rev.0.102 XHTML 1.1のhtmlファイルの文法に対応。 # 2002.11.26 Rev.1.000 11月25日にKENT WEBさんより再配布の許可を得て、公開。 # 2002.11.29 Rev.1.001 スタイルシートのbodyから、font-size:12ptの指定を消去。 # 2002.02.26 Rev.1.002 スタイルシートのbodyの背景色を白に、行間を1.4emに変更。 $ver = 'Web Forum v3.3 - http://www.kent-web.com/ PastList.pl Rev.1.002(改造:鷹の巣)'; # # 1.用途 # # このPerlスクリプトは、KENT WEBさんの掲示板WEB FORUMの過去ログから、 # HTML 4.01 strict、XHTML 1.0 strict、XHTML 1.1用のhtmlファイルを生成するものです。 # ご投稿者によるご投稿内容のURIの書式が正しければ、 # Another HTML-lint gateway:http://openlab.ring.gr.jp/k16/htmllint/htmllint.html # で、100点満点が取れることを確認しています。 # 但し、HTMLの文法を忠実に守った為、過去ログの約12Kバイトからは、約1Mバイト以上の # HTMLファイルが生成されますので、ご注意願います。 # 従って、Webファイルの容量の制限のない自宅サーバー用と言えます。 # # 2.作成したhtmlファイルの表示例と特徴 # # 作成されるhtmlファイルの表示例は、以下のサイトに設置しています。 # http://sakaguch.com/PastBBS/0008/B004933.html # ブラウザを利用して、htmlファイルのタグも是非、ご覧願います。 # # ○利点:HTMLファイルの為、サーバーへの負荷が小さい。 #     検索エンジンに収集させることも出来る。 # ○欠点:過去ログのファイル容量が100倍以上に巨大化する。 # # 3.ご注意事項 # # このスクリプトに対するご質問や不具合がございましたら、電子メールで、 # webmaster@sakaguch.com まで、お寄せ下さい。 # また、「鷹の巣」の自宅サーバー掲示板 # http://sakaguch.com/cgi/bbs/ # にご投稿して頂いても結構です。 # ☆★☆KENT WEBさんとは、全く無関係ですから、KENT WEBさんへは、絶対にご質問しないで下さい。☆★☆ # # 4.著作権 # # このスクリプトで、鷹の巣が改造した箇所の著作権は、放棄していますが、 # このファイルは、下記のKENT WEBさんの掲示板WEB FORUM v3.3 (2002/08/01) #┌───────────────────────────────── #│ WEB FORUM v3.3 (2002/08/01) #│ Copyright(C) KENT WEB 2002 #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── # のソースコードを流用していますので、再配布にあたります。 # 従って、KENT WEBさんのCGIスクリプト利用規定 # http://www.kent-web.com/pubc/kitei.html # に従って、再配布するものです。ご利用に当たっては、ご留意願います。 # # 5.設置例 # # かっこ内はパーミッション ※bbs以下のディレクトリの構成は、厳守すること。 # # public_html / index.html (ホームページ) # | # +-- bbs / wforum.cgi [755] 未使用。 # | PastList.pl [755] ※このスクリプトファイル自身。 # | wf_log.cgi [666] 未使用。 # | wf_admin.cgi [755] 未使用。 # | jcode.pl [644] 未使用。 # | fold.pl [644] ※このスクリプトファイルが使用。 # | pastno.dat [666] 未使用。 ... (過去ログ用) # | # +-- past [777] / 0001.cgi [666] ... (過去ログ)   ※このスクリプトファイルが使用。 # | | styleL.css[644] ... (過去ログ用スタイルシート)※このスクリプトファイルより生成 # | | 0001.html[644] .............. (過去ログ目次用)※このスクリプトファイルより生成 # | +---------- 0001[644] / Bxxxxx.html [644] ... (過去ログ用)※このスクリプトファイルより生成 # | # +-- lock [777] /    未使用。 # # # 6.起動方法 # # PastList.plのあるディレクトリに移動し、コマンドラインから、perl PastList.plを実行します。 # プロバイダでは、CGIの実行パス下にhtmlファイルを作成出来ない場合が多いです。 # (作成出来ても、それをWebサーバーから、利用出来ない場合が多いです。) # 従って、ブラウザから、Webサーバーを通しての実行方法は、取り扱わないこととさせて頂きます。 # #============# # 基本設定 # #============# # 実行時のみ、コメント行にします。通常は、起動しない(されない)様にすること。!!! #exit; # htmlファイルを作成する過去ログの開始位置を設定 $start_count = "0001"; # 管理者名とメールアドレス $webmaster = '管理者名'; $mailaddress = 'webmaster@example.com'; # 掲示板へのリンク用URI # Webサーバーのドキュメントルートからのパスを指定することを推奨します。 $URIkeijiban = '/cgi/bbs/'; # タイトル/本文の文字タイプ $t_face = 'MS P Gothic'; # 本文の文字大きさ(ポイント数:スタイルシート) $pt = '1em'; $bgcolor = "#EEEEEE"; # 背景色 $text = "#004080"; # 文字色 #$text = "black"; # 文字色 # 引用部色変更 # 1) ここに色指定を行うと「引用部」を色変更します # 2) この機能を使用しない場合は何も記述しないで下さい ($refcolor="";) $refcolor = "#804000"; # リストに表示する「記事タイトル」の最大長(文字数:半角文字換算) $sub_length = 128; # URL自動リンク (0=no 1=yes) $autolink = 1; # ツリー部分の出力 (0=no 1=yes) $treeOut = 1; # 作成するHTMLファイルの書式バージョンの設定 #  わからなければ、HTML 4.01 strict用を選択すること。 #$HTMLver = "XHTML 1.1"; # XHTML 1.1用 #$HTMLver = "XHTML 1.0 strict"; # XHTML 1.0 strict用 $HTMLver = "HTML 4.01 strict"; # HTML 4.01 strict用 # 作成するHTMLファイル上部に挿入するリンクやバナー #  先頭付近に必ず、適当な文字というリンクを必ず入れること!!! #  の等の非推奨タグを使用したり、タグを大文字で書くと、 #  Another HTML-lint gatewayの減点対象となりますので、ご注意願います。 #  (あらかじめ、上記のサイトで$banner1部分のタグを試験されることを推奨します。) $banner1 = <<'SUB_MSG';

目次更新履歴ご訪問客帳掲示板

SUB_MSG #============# # 設定完了 # #============# # スタイルシートのファイル名 $stylefilename = "styleL.css"; # 過去ログのディレクトリ(最後は / で閉じる) $pastdir = './past/'; # ライブラリ取込み require './fold.pl'; #---------------------------------- # 主回路 #---------------------------------- # 著作権の表示 print "$ver $HTMLver\n"; # スタイルシートの作成 &make_style ("$pastdir$stylefilename"); # 上部に挿入するリンクやバナーのHTMLタグの置換 $banner1 = &TagRep ($banner1); if ($HTMLver eq "XHTML 1.1") { $banner1 =~ s/(|)//g; } else { $banner1 =~ s/(|)//g; } # 過去ログのHTML化 for ($past_count=$start_count ; $past_count<1000 ; $past_count++) { $count = sprintf("%04d",$past_count); $logfile = "$pastdir$count\.cgi"; if (!(-e "$logfile")) { last; } # $logfileファイルが存在しなければ、処理を中止する。 print "$logfile\n"; &main_loop ($count); } exit; #---------------------------------- # 過去ログ単位のHTMLファイルの出力 #---------------------------------- sub main_loop { $count = $_[0]; mkdir ("$pastdir$count","777"); # 後で、ディレクトリのパーミッションは、644に変更すること。 # ツリー単位のHTMLファイル名の検出 @oya = (); $logfile = "$pastdir$count\.cgi"; open(IN,"$logfile") || &error("Open Error : $logfile"); while () { ($no,$reno,$lx,$sub,$email,$url,$name, $dat,$msg,$t,$h,$pw,$wrap,$oya) = split(/<>/); if ($reno eq "no") { $sub =~ s|||g; $sub =~ s|||g; $htmlfile = "$count/B" . sprintf("%07d", $no) . "\.html"; $title = "No.$no"." ".$sub; push (@oya , "$no<>$htmlfile<>$title<>$t<>"); } } close(IN); # 目次HTMLファイルの出力 ($oyaNo,$htmlfile,$title,$t) = split(/<>/,$oya[0]); $sakusei = &get_time($t,"sakusei"); $OUTfile = "$pastdir$count\.html"; open(OUT,">$OUTfile") || &error("Open Error : $OUTfile"); $title = "過去に質問された内容$count目次"; $prev = "/index.html"; $stylefile="./$stylefilename"; &header ($count, $stylefile, $mailaddress, $prev, $title, $banner1, $sakusei); foreach $oyaData (@oya) { ($oyaNo,$htmlfile,$title,$t) = split(/<>/,$oyaData); print OUT"$title"; if ($HTMLver eq "HTML 4.01 strict") { print OUT"
\n"; # HTML 4.01 strict用 } else { print OUT"
\n"; # XHTML 1.0 strictとXHTML 1.1用 } } &footer; close(OUT); # ツリー単位のHTMLファイルの出力 foreach $oyaData (@oya) { &allread; } } #---------------------------------- # ツリー単位のHTMLファイルの出力 #---------------------------------- sub allread { ($oyaNo,$htmlfile,$title,$t) = split(/<>/,$oyaData); # HTMLファイルのオープン open (OUT,">$pastdir$htmlfile") || &error("Open Error : $htmlfile"); # HTMLのヘッダを出力 $prev = "../$count.html"; $sakusei = &get_time($t,"sakusei"); $stylefile = "../$stylefilename"; &header ($count, $stylefile, $mailaddress, $prev, $title, $banner1, $sakusei); @new = (); # ツリー部分を出力 if ($treeOut) { $x = 0; print OUT "\n"; $x--; } if (($flagFirst) && ($x == $lx)) { print OUT "\n"; } while ($x < $lx) { print OUT "\n"; $x--; } print OUT "\n"; if ($HTMLver eq "HTML 4.01 strict") { print OUT"
\n"; # HTML 4.01 strict用 } else { print OUT"
\n"; # XHTML 1.0 strictとXHTML 1.1用 } } # 本文を出力 foreach (@new) { ($no,$reno,$lx,$sub,$email,$url,$name, $dat,$msg,$t,$ho,$pw,$wrap,$oya,$smail,$res) = split(/<>/); if ($pw eq 'DEL') { next; } # 自動リンク if ($autolink) { &auto_link($msg); } if ($url) { $url="http://$url"; } if ($email) { $email="$email"; } # 引用部色変更 if ($refcolor) { $msg =~ s/([\>]|^)(>[^<]*)/$1$2<\/span>/g; } # 図表モード if ($wrap eq 'pre') { $msg =~ s/(
|
)/\n/g; $msg = "
$msg
"; } # ツリー内の表題部分を出力 $date = &get_time($t); # if ($smail ne "on") { $m = "Eメール:$email
"; } else { $m = ""; } if ($HTMLver eq "XHTML 1.1") { # XHTML 1.1用 print OUT "No.$no"; } else { # HTML 4.01 strict用とXHTML 1.0strict用 print OUT "No.$no"; } # 本文の出力 $body_msg = <<"EOM";  投稿時間:$date 投稿者名:$name URL:$url
タイトル:$sub

$msg


EOM $body_msg = &TagRep ($body_msg); print OUT "$body_msg\n"; } &footer; close(OUT); } #------------------# # HTMLのヘッダー # #------------------# sub header { my ($count, $stylefile, $mailaddress, $prev, $hedtitle, $banner, $sakusei) = @_; $head_flag = 1; $hedtitle = $title; $hedtitle =~ s|||g; $hedtitle =~ s|||g; if ($HTMLver eq "HTML 4.01 strict") { # HTML 4.01 strict用 print OUT <<"EOM"; EOM } elsif ($HTMLver eq "XHTML 1.0 strict") { # XHTML 1.0 strict用 print OUT <<"EOM"; EOM } else { # XHTML 1.1用 print OUT <<"EOM"; EOM } $hed = <<"EOM"; $hedtitle
$banner
$sakusei 作成:$webmaster
掲示板で過去に質問された内容です。

$title

EOM $hed = &TagRep ($hed); print OUT "$hed\n"; } #------------------# # HTMLのフッター # #------------------# sub footer { $foot = <<"EOM";
掲示板▲頁先頭

EOM $foot = &TagRep ($foot); print OUT "$foot\n"; } #------------------# # HTMLタグの置換 # #------------------# sub TagRep { my $HTMLtag = $_[0]; if ($HTMLver eq "HTML 4.01 strict") { $HTMLtag =~ s|\s/>|>|g; } else { $HTMLtag =~ s|
|
|g; $HTMLtag =~ s|
|
|g; } return $HTMLtag; } #--------------# # エラー処理 # #--------------# sub error { print "ERROR !($_[0])\n"; exit; } #----------------------# # 記事タイトル長調整 # #----------------------# sub cut_subject { # 制限長に満たないものは戻す if (length($_[0]) <= $sub_length) { return $_[0]; } # カット処理 ($_[0], $folded) = &fold($_[0], $sub_length); $_[0] .= '..'; return $_[0]; } #--------------# # 自動リンク # #--------------# sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+]+)/$1$2<\/a>/g; } #--------------# # 時間の取得 # #--------------# sub get_time { local($time, $log) = @_; if (!$time) { $time = time }; ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime($time); if ($log eq "sakusei") { $date = "作成日:" . sprintf("%04d年%02d月%02d日",$year+1900,$mon+1,$day); return $date; } else { @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date = sprintf("%04d年%02d月%02d日(%s) %02d:%02d", $year+1900,$mon+1,$day,$week[$wday],$hour,$min); return $date; } } #------------------------# # スタイルシートの作成 # #------------------------# sub make_style { $stylefile = $_[0]; open(OUT,">$stylefile") || &error("Open Error : $stylefile"); print OUT <<"EOM"; a:link {font-weight:normal; color:blue; text-decoration:underline;} a:active {font-weight:normal; color:red; text-decoration:underline;} a:visited {font-weight:normal; color:green; text-decoration:underline;} a:hover {font-weight:normal; color:black; background-color:aqua; text-decoration:underline;} body {background-color:white; text-align:left; color:#004080; line-height:1.4em} .center {text-align:center;} .red {color:red;} .maroon {color:maroon;} big { font-size: large;} small { font-size: small;} .s {text-decoration:line-through;} .PL20 {position:relative; left:20px;} .tt {font-family:monospace;} EOM close(OUT); }