ファイル名: j/page_1.cgi

#!/usr/local/bin/perl


# -----------------------------------------------------------------------------
# 文字の検索  (ファイル名: page_1cgi )
# -----------------------------------------------------------------------------

## ライブラリ
require './jcode.pl';        # jcode.plが同一ディレクトリにある場合


## 基本設定
$title = "ページ(1)";      # タイトル
$t_color = "#008080";        # タイトルの色
$t_face = "MS Pゴシック";    # タイトル文字のフォントタイプ
$backgif = "";            # 壁紙
$bgcolor = "#004444";        # 背景色
$text = "#BBBBBB";          # 文字色を指定
$link = "#0000FF";          # リンク色を指定(未リンク)
$vlink = "#800080";          # リンク色を指定(既リンク)
$alink = "#FF0000";          # リンク色を指定(リンク中)

$pagelog = 5;            # 1ページ当たりの記事表示数

#$start_year = 1998;          # スタートページ年

## 固有設定
$script = './page_1.cgi';      # スクリプトファイル名
$logfile = '../../rakugaki/rakugaki.txt';       # ログファイル名

## bodyタグを定義
$body = "<body bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>";


### --- メイン

&get_form;                          # GET FORM の取得
&form_deco;                          # GET FORM のデコード

#### ページ 目次による表示( FORM )

if ($FORM{'action'} eq "page_head" or $FORM{'action'} eq "") {

if ($FORM{'action'} eq ""){ $FORM{'page'} = 1;}

  &file_in;                    # 記事・年月データの読み込み

  $stop_k = @DATA;                # 総記事の数

  $disp_page = $FORM{'page'};            # 選択ページ数

  $start_k = ($disp_page-1)*$pagelog;        # スタート記事番号
  $end_k = ($disp_page)*$pagelog-1;        # エンド記事番号
  if ( $end_k > $stop_k ){ $end_k = $stop_k-1;}  # 最終ページ処理

  &header;
&page_head;

  @r_date = reverse(@r_date);

  &result_1;
  &disp_1;
  &footer;
  exit;

  }

### --- 年/月データの読み込み(ファイル) (SUB)

sub file_in {

    # ファイルを読み込み
    open(DB,"$logfile") || &error(bad_file);
    @DATA = <DB>;
    close(DB);

    # 日付データ取得
    foreach $line (@DATA) {
      ($date,$name,$email,$comment,$d1,$d2,$d3,$d4) = split(/\,/,$line);
        push(@r_date,$date);
    }

}


### --- フォームの取得 (SUB)
sub get_form {
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
    } else { $formdata = $ENV{'QUERY_STRING'}; }
}


### --- フォームのデータ処理 (SUB)
sub form_deco {
    @pairs = split(/&/,$QUERY_DATA);
    foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $value =~ s/</</g;
    $value =~ s/>/>/g;
    $value =~ s/\n//g;
    $value =~ s/\,//g;
    &jcode'convert(*value,'sjis');  
    $FORM{$name} = $value;
    }
}


### --- HTMLのヘッダー (SUB)
sub header{
  print "Content-type: text/html\n\n";
  print "<html>\n<head>\n";
  print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
  print "<title>$title</title></head>\n";
  print "$body\n";
}


### --- HTMLのフッター (SUB)
sub footer{
  print "</body></html>\n";
#  exit;
}



### --- 落書き表示ルーチン 1 (SUB)

sub disp_1 {

    
    @DATA = reverse(@DATA);

    # 保存されているデータがなくなるまで繰り返す。
    # ファイルから読み込んだデータの最後には改行文字がついているので除去
    foreach $line (@DATA[$start_k..$end_k]) {
    chop($line);

    # 1行のデータを各項目に分解します。
    # 日付、名前、メール、コメントの順に格納されます。それ以降の$d1〜$d4は将来
    # のバージョンアップのためダミーのデータにします。
    ($date,$name,$email,$comment,$d1,$d2,$d3,$d4) = split(/\,/,$line);

    # コメント変数の中の改行文字「\r」を「<br>」に変換して、訪問者が入力した通りに表示します。
    $comment =~ s/\r/<br>/g;
    print "<div align=center><center>\n";
    print "<table border=0 width=80% bgcolor=#FFFFFF>\n";
    print "<tr>\n";
    print "<td><font color=#000000>\n";
    
    # メールアドレスが入力されていればリンクを付けます。
    if ($email ne "") {
    print "<a href=mailto:$email><strong>$name</strong></a>\n";
    } else { print "<strong>$name</strong>\n"; }
    
    print "$date<br>\n";
    print "<blockquote>$comment</blockquote>\n";
    print "</font>\n";
    print "</td>\n";
    print "</tr>\n";
    print "</table>\n";
    print "<p>";
}
    print "</center></div>\n";

}



### --- エラー処理 (SUB)

sub error {

  $error = $_[0];

  if ($error eq "bad_file") { $msg = 'ファイルのオープン、入出力に失敗しました。'; }
  else { $msg = '原因不明のエラーで処理を継続できません。'; }

  # エラーメッセージ表示のHTMLドキュメントの生成

  print "<center><FONT color=\"#EE0000\"><hr width=90%><i>" . $msg . "</i></hr></FONT></center>\n";

}


### --- ページ 目次表示 (SUB)

sub page_head {

  &title;

  $file_num = @r_date;                  # 記事の総数
  $page_num = sprintf("%d", $file_num/$pagelog )+1;    # ページ総数
  $page_box_num = sprintf("%d", $page_num/10 )+1;      # 行数
  
    print "<CENTER>\n";

    print "<FORM method=\"POST\" action = \"$script\" >\n";

    print "<INPUT type=hidden name=action value= page_head >\n";
    print "<INPUT type=hidden name=year value= $pb_num >\n";


    print "<TABLE cellspacing=0 border=1 >\n";
    print "<TBODY>\n";

    # ページの表

    foreach $p_num (1..$page_num){

    $p_num = sprintf("%02d", $p_num);
      
      if ( $p_num % 10 == 1 ){ print "<TR>\n"; }      # 行送り

      if ( $p_num ==   $disp_page )
            { $b_color = ff0000; }          # セレクト行
         else { $b_color = 000000; }          # 非セレクト行

      print "<TD bgcolor= $b_color width=21 height=29><INPUT type= submit name=page value= $p_num ></TD>\n";

      if ( $p_num % 10 == 0 ){ print "</TR>\n"; }      # 行送り
  
    }

  print "</TBODY>\n";
  print "</TABLE>\n";
  print "</FORM>\n";
    print "</CENTER>\n";

  
}



### --- 表示結果1 (SUB)

sub result_1 {

print <<"HTML";

  <CENTER>
  <TABLE width=\"400\" height=\"50\" bgcolor=\"#225522\" cellpadding=\"5" cellspacing=\"0\" border=\"0\">
  <TBODY>
  <TR><TD>\表\示記事</TD><TD>:</TD><TD>@r_date[$start_k] から<TD></TR>
  <TR><TD> </TD><TD> </TD><TD>@r_date[$end_k] まで</TD></TR>
  </TBODY>
  </TABLE>
  </CENTER>
  <BR><BR>

HTML

}

### --- タイトル表示 (SUB)

sub title {

print <<"HTML";

  <CENTER>
  <hr width=80%>


  <FONT color="#99BBBB" size ="5" face="MS Pゴシック"><B>■ 落書き帳のページ\表\示(1) ■</B></FONT>

  <hr width=80%>
  </CENTER>
  <BR>

HTML

}