掲示板
#! /usr/local/bin/ruby require "kconv" require "cgi" #================================================ 設定 FILE = './dat/bbs.dat' # 書き込み保存ファイル MAX = 100 # 保存件数 VIEW = 10 # 1ページの表示件数 TEXTMAX = 1000 # 本文文字数制限(全角) NAMEMAX = 10 # 名前文字数制限(全角) TITLEMAX = 20 # 題名文字数制限(全角) PASSWORD = '1234' # 削除用パスワード #================================================ クラス定義 class BBS def initialize(file, max, view, time) @file = file @max = max @view = view @time = time end def read_log count = 0 log = [] open(@file, "r") do |fh| fh.flock(File::LOCK_SH) fh.each do |line| log[count] = line.chomp count += 1 end fh.flock(File::LOCK_UN) fh.close end log end def write_log(log) FORM.keys.each do |k| FORM.params[k][0] = FORM[k][0].tosjis FORM[k][0].gsub!(/&/, "&") FORM[k][0].gsub!(/</, "<") FORM[k][0].gsub!(/>/, ">") FORM[k][0].gsub!(/\x0D\x0A\s*/, "<br>") FORM[k][0].gsub!(/\s+/, " ") end tm = @time.strftime("%Y/%m/%d %H:%M") data = [tm, FORM['name'][0], FORM['title'][0], FORM['text'][0], ""].join("\t") log = [data] + log[0, @max - 1] open(@file, "w") do |fh| fh.flock(File::LOCK_EX) fh.write log.join("\n") fh.flock(File::LOCK_UN) fh.close end log end def delete_log(log) log.slice!(FORM['del'][0].to_i, 1) open(@file, "w") do |fh| fh.flock(File::LOCK_EX) fh.write log.join("\n") fh.flock(File::LOCK_UN) fh.close end log end def print_log(log) page = FORM['page'][0].to_i logsize = log.size start = 0 if page > 0 start = page * @view end stop = start + @view if stop > logsize stop = logsize end for i in start..(stop - 1) (tm, name, title, text) = log[i].split("\t") if name == "" name = "名無し" end if title == "" title = "無題" end printf "<input type=\"radio\" name=\"del\" value=\"%0d\">", i print "【#{title}】#{name}<br>" print "#{text}" print "<div align=\"right\">#{tm}</div>" print "<hr>\n" end print "<center>\n" if page > 0 printf "<a href=\"#{ENV['SCRIPT_NAME']}?page=%d\">≪前ページ</a>\n", page - 1 end if stop < logsize printf "<a href=\"#{ENV['SCRIPT_NAME']}?page=%d\">次ページ≫</a>\n", page + 1 end print "</center>\n" end end #================================================ メインプログラム FORM = CGI.new TIME = Time.new bbs = BBS.new(FILE, MAX, VIEW, TIME) log = bbs.read_log #サンプルにつき書き込み停止 #log = bbs.write_log(log) if # FORM['mode'][0] == "write" and # FORM['text'][0] != "" and # FORM['text'][0].size <= TEXTMAX * 2 and # FORM['name'][0].size <= NAMEMAX * 2 and # FORM['title'][0].size <= TITLEMAX * 2 #log = bbs.delete_log(log) if # FORM['mode'][0] == "delete" and # FORM['pass'][0] == PASSWORD print "Content-type: text/html; charset=Shift_JIS\n\n" print <<END <html> <head> <title>掲示板</title> </head> <body bgcolor="#eeeeff"> <h1 style="margin:2px;font-size:15px;letter-spacing:50px">掲示板</h1> <hr> <form action="#{ENV['SCRIPT_NAME']}" method="POST"> 名前:<input type="text" name="name" size="50" maxlength="#{NAMEMAX}" value="#{FORM['name'][0]}"><br> <br> 題名:<input type="text" name="title" size="50" maxlength="#{TITLEMAX}"><br> <br> 本文: <small>※全角#{TEXTMAX}文字以内</small><br> <textarea name="text" rows="10" cols="80"></textarea><br> <br> <input type="hidden" name="mode" value="write"> <input type="submit" value=" 書き込み "><br> </form> <form action="#{ENV['SCRIPT_NAME']}" method="POST"> <hr> END bbs.print_log(log) print <<END <div align="right"> <input type="password" name="pass" value="#{FORM['pass'][0]}" size="4"> <input type="hidden" name="mode" value="delete"> <input type="hidden" name="page" value="#{FORM['page'][0]}"> <input type="submit" value="削除"> </div> </form> </body> </html> END exit
〔 実行する 〕