#!/usr/local/bin/perl # This file is described by Shift-JIS. # yogo version 0.0.6 / 用語集 # copyright (c) 2000 by Masahiko Tokita # e-mail : BQB04357@nifty.ne.jp # 配布元 : http://www.users.yun.co.jp/~tokita/ # # [利用規定] # このプログラムはGNU GPL Ver.2に基づいて配布します。 # 著作権は放棄していませんが、配布・転載・改造は自由です。 # 転載・再配布をされる場合も、必ずコピーライトを明記して下さい。 # このプログラムを使用した結果について、製作者は一切の責任を負いません。 # 構成 ( )は設定するパーミッション値 # # ※ディレクトリの構成は環境よってことなります。 # # /任意のディレクトリ # | # |- jcode.pl (604) # |- yogo.cgi (705) CGI本体(このファイル) # | # |- /data/ (707) データ用ディレクトリ # | # |-- dic.dat (707) データファイル。 # | 初期導入時に自動で作成します。 # |-- ここに排他制御のためのファイルや一次ファイルが作られます。 # # # [注意] # このファイルは Shift-JIS で書かれています。出力するコードも Shift-JIS です。 # そのため windows の notepad などで編集できます。 # サーバにアップロードするときは、 ASCII でコードは無変換で行ってください。 # 更新履歴 # 2001/01/08 # 検索画面から編集を押したときエラーとなる不具合を修正。 # 0.0.5 → 0.0.6 # 2000/09/03 # 削除時に指定以外の用語が削除されてしまう不具合を修正。 # 用語へのリンクの表示の不具合を修正。 # 0.0.4 → 0.0.5 # 2000/07/09 # 検索機能を追加した # 0.0.3 → 0.0.4 # 2000/05/15 # ロック処理を変更。ロックファイルが残ってしまった場合の対応 # 2000/02/04 # ロック処理について改善 # ソース整理たくさん 0.0.1 → 0.0.2 # 2000/01/25 # typo を修正。key さん、thanks! # 2000/01/04 # version 0.0.1 完成 # 1999/12/31 # 登録、表示、修正、削除ができるようになった # 1999/12/27 # とりあえず製作に着手 ########################################################### # # 定義いろいろ # ############################# # # 色、デザイン # 必要に応じて変更してください # タイトル。ブラウザのタイトルバーに出る名前です。 $title = '用語集'; # メインタイトル。いちばん上に表示するタイトルです。 $maintitle = '用語集'; # トップページなど戻り先の URL $ret_url = '../index.html'; # 戻り先の名前 $ret_name = 'トップページへ'; # HTML の body タグ。用語一覧と用語登録画面で使います。 $body = '
'; # 各用語へのリンクの表示列数 $yoko = 3; # 各用語へのリンクの表示行数 $tate = 10; ############################# # # プログラムの動作の定義 # 必要に応じて変更してください # 登録または修正があったときに管理者にメールを送信する。 # この機能はサーバーが UNIX な OS であり、CGI から sendmail を # 実行できるときに使えます。 # 0 : メールを送信しない(デフォルト) # 1 : メールを送信する $use_mail = 0; # sendmail のパス。通常は /usr/bin/sendmail か /usr/lib/sendmail # /usr/sbin/sendmail です。 $sendmail = '/usr/lib/sendmail'; # 管理者のメールアドレス。※必ず変更してください #$admin_address = 'foo@bar.com'; # gzip で圧縮して送信 # この機能を使うにはサーバ側で gzip がインストールされている必要が # あります。 # 0 : 圧縮しない(デフォルト) # 1 : 圧縮する $usegzip = 0; # gzip のパス $gzippath = '/bin/gzip'; ############################# # # プログラムに必要な初期定義 # 変更しないでください # version number $version = '0.0.6'; # このファイルの名前 $thisfile = 'yogo.cgi'; # データを格納するディレクトリの名前 $datadir = 'data'; # ロックファイルの名前 $lockfile = "$datadir/lockfile"; # データファイルの名前 $dicfile = "$datadir/dic.dat"; # 作業用ファイルの名前 $tmpfile = "$datadir/tmp.dat"; # 文字コード変換ライブラリ $jcodepl = 'jcode.pl'; # include jcode.pl if ( ! -f $jcodepl ) { &putHeader; &HTMLMsg( "$jcodepl が見つかりません。", "$jcodepl をアップロードしてください。" ); exit; } require $jcodepl; # crypt に必要な塩 :) $salt = '12'; # メールアドレスにマッチする正規表現 :p $mail_regex = q{(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\} . q{\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][} . q{^\\\x80-\xff\n\015"]*)*")(?:\.(?:[^(\040)<>@,;:".\\\[\]\000-\037\x} . q{80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\\} . q{xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*"))*@(?:[^(\0} . q{40)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000} . q{-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])} . q{(?:\.(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;} . q{:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x} . q{80-\xff])*\]))*}; # URL にマッチする正規表現 $http_URL_regex = q{s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+}; ########################################################### # # メイン処理 # &main; exit; sub main { local( $buf, $key, $value, @pairs ); # データを読み込む if ( $ENV{'REQUEST_METHOD'} eq 'POST' ) { # POST の場合 read( STDIN, $buf, $ENV{'CONTENT_LENGTH'} ); } else { # GET の場合 $buf = $ENV{'QUERY_STRING'}; } # データが送られてきていないとき if ( $buf eq '' ) { # 通常表示 &putHeader; &showDic; } # データが送られてきたとき else { # データ解析 @pairs = split( /&/, $buf ); foreach ( @pairs ) { ($key, $value) = split( /=/, $_ ); &decodeData( *key ); &decodeData( *value ); $postdata{ $key } = $value; } # 用語登録画面を表示 if ( $postdata{ 'action' } eq 'form' ) { &putHeader; &showForm; } # 新しい用語を登録 elsif ( $postdata{ 'action' } eq 'regist' ) { ®ist; &putHeader; &showDic; } # 用語編集画面を表示 elsif ( $postdata{ 'action' } eq 'edit' ) { &putHeader; &edit; } # 用語修正 elsif ( $postdata{ 'action' } eq 'update' ) { &update; &putHeader; &showDic; } # 用語削除 elsif ( $postdata{ 'action' } eq 'delete' ) { &putHeader; &delete; &showDic; } # 管理者パスワード初期設定フォームを表示 elsif ( $postdata{ 'action' } eq 'showKeyRegistForm' ) { &putHeader; &showKeyRegistForm(); } # 管理者パスワード変更フォーム表示 elsif ( $postdata{ 'action' } eq 'admin' ) { &putHeader; &admin; } # 管理者パスワード変更 elsif ( $postdata{ 'action' } eq 'passwd' ) { &putHeader; &passwd; &showDic; } # 検索用フォーム表示 elsif ( $postdata{ 'action' } eq 'findform' ) { &putHeader; &showFindForm; } # 検索用フォーム表示 elsif ( $postdata{ 'action' } eq 'find' ) { &putHeader; &find; } } } ############################# # 用語一覧表示 sub showDic { local( $header, @foo, $i, $yoko_count ); if ( open( DIC, $dicfile ) == 0 ) { ✓ # エラーの原因を自己診断する。 exit; } $header =HTML # 各用語へのリンクを表示 print "\n"; print "\n"; print "
\n"; print " \n"; for ( $i=0, $yoko_count=0; $_= ; $i++ ) { @foo = split( /\t/, $_ ); print "$foo[ 1 ]
\n"; if ( $tate-1 == $i % $tate) { $yoko_count++; if ( $yoko == $yoko_count ) { print "\n"; print " \n"; $yoko_count = 0; next; } print " \n"; } } print "
■このフォームから用語を登録します。
■投稿者名は省略可能\です。