#! /usr/local/bin/perl
#
# akiary - Y.Akira's Diary CGI - v.0.42 (2000/10/21)
# Copyright (C) 2000 by YAMAMOTO Akira
# mailto:yakira@hi-ho.ne.jp
# http://www.hi-ho.ne.jp/yakira/akiary/
#
#------------------------------------------
# 設定(ご自分の環境に応じて変更して下さい)
#------------------------------------------
# パスワード
$PASSWORD = "111111"; # ←←←← 必ず変更すること!!!!!
# 日記のディレクトリ(このスクリプトから見て)
$DIARYDIR = "./";
# $DIARYDIR = $ENV{'HOME'} . "/html/diary/"; # Hi-HOユーザー専用
# 日記のURL(http)
$DIARYHTMLDIR="./";
#$DIARYHTMLDIR = "http://www.hi-ho.ne.jp/yakira/diary/"; # for Hi-HO
# 目次のファイル名
$INDEXHTML = "index.html";
# 最新版日記のファイル名
$NEWHTML = "new.html";
# 最新n回分(latest n times)
$NEWDIARYDAYS = 7;
# 先月のバックナンバーがない場合のリンク先
$PREVMONTH = "";
# 来月のバックナンバーがない場合のリンク先
$NEXTMONTH = "";
# バックナンバー用テンプレートファイル
$TMPBNFILE = $DIARYDIR . "tmpbn.html";
# 目次用テンプレートファイル
$TMPINDEXFILE = $DIARYDIR . "tmpindex.html";
# 最新版用テンプレートファイル
$TMPNEWFILE = $DIARYDIR . "tmpnew.html";
# 日記入力時の題名の枠の長さ
$SIZE=40;
# 日記入力時の内容の枠の大きさ(列)
$COLS=80;
# 日記入力時の内容の枠の大きさ(行)
$ROWS=10;
# ロックファイルのディレクトリ
$LOCKDIR=$DIARYDIR;
# 日付表示フォーマット
$DATEFORMAT="%Y0年%M0月%D0日(%W0)"; # 「2000年10月20日(金)」形式
#$DATEFORMAT="%Y0.%M0.%D0 %W1."; # 「2000.10.20 Fri.」形式
# FTP転送ファイルによる更新(0:off,1:on)
$FTPFILEMODIFY=0;
#----------------
# 設定(変更不可)
#----------------
# このスクリプトのファイル名
$OWNFILE=$0; # 現在実行中のスクリプトファイル名
$OWNFILE=~s/.*[\\\/]//; # パスを除去
# バージョン(変更不可)
$VERSION = "0.42";
# 署名(変更不可)
$SIGNATURE = <<"_SIGNATURE_";
Akiary v.$VERSION
_SIGNATURE_
#--------
# メイン
#--------
#
# フォームデコード
#
&FormDecode;
#&debug;
#
# 実行する処理と表示するページを決める
#
# デフォルト
$ACTION=$FORM{'action'}; # FORMから
$PAGE=$FORM{'page'}; # FORMから
# FTP転送されたファイルがある場合
@FTPFILES=&GetFTPFiles if ($FTPFILEMODIFY==1);
if ($#FTPFILES >= 0){
$ACTION="fileappend"; # 転送ファイルから更新
$PAGE="fileappend"; # 転送ファイルから更新の結果表示
}
# パスワードが違う場合
if ($FORM{'password'} ne $PASSWORD){
$ACTION="noop"; # 何も処理せず、
$PAGE="password"; # パスワード入力ページ表示
}
#
# 処理実行
#
if ($ACTION eq "fileappend"){ # ファイルから更新
@fileappendfiles=&FileAppend;
} elsif ($ACTION eq "append"){ # 更新
&Append;
} elsif ($ACTION eq "modify"){ # 修正
&Modify;
} elsif ($ACTION eq "delete"){ # 削除
if (&Delete($FORM{'date'},$FORM{'did'}) == 0){
$PAGE="now"; # 削除でファイルがなくなったら表示ページ変更
}
}
#
# ページ表示
#
if ($PAGE eq "fileappend"){ # ファイルから更新の結果
&PageFileAppend(@fileappendfiles);
} elsif ($PAGE eq "now"){ # 最新版
&PageNow;
} elsif ($PAGE =~ /^bn/){ # バックナンバー
&PageBacknumber;
} elsif ($PAGE eq "modify"){ # 修正
&PageModify($FORM{'date'},$FORM{'did'});
} elsif ($PAGE eq "deleteYN"){ # 削除確認
&PageDeleteYN
} else { # パスワード入力
&PagePassword;
}
exit;
#----------
# 処理実行
#----------
#
# 転送ファイルから更新
# FTP転送されたファイル名は@FTPFILESに取得済
#
sub FileAppend{
local(@dids);
# ファイルから日記情報を解析する
foreach (@FTPFILES){
# DID(Diary ID)付与
$did = $_;
$did =~ s/^(\d\d\d\d\d\d\d\d)\.html$/$1_/;
$did .= time; # DIDは"日付_時間"
# Date
$DATE{$did} = $_;
$DATE{$did} =~ s/^(\d\d\d\d\d\d\d\d)\.html$/$1/;
# Title & Body
($TITLE{$did}, $BODY{$did})=&FTPFile2TitleBody($_);
}
# 更新すべきファイル名とDID
foreach(keys %DATE){
$DATE{$_} =~ /^(\d\d\d\d\d\d)/;
$append_dids{"$1.html"}.="$_ "; # $_ はDID
}
# 日記を更新する
foreach(keys %append_dids){
@dids=split(' ',$append_dids{$_});
&MakeBNDiary($DIARYDIR,$_,*DATE,*TITLE,*BODY,*dids);
}
# FTP転送ファイルを削除
foreach (@FTPFILES){
unlink("$DIARYDIR/$_");
}
# 最新版日記ファイルを作成
&MakeNewDiary;
# 日記目次ファイルを作成
&MakeIndex;
# 更新したファイル名を返す
return(keys %append_dids);
}
#
# 更新
#
sub Append{
local($date,@dids);
# 更新実行
$date=sprintf("%04d%02d%02d",$FORM{'year'},$FORM{'mon'},$FORM{'mday'});
$dids[0]=$date."_".time;
$DATE{$dids[0]}=$date;
$TITLE{$dids[0]}=$FORM{'title'};
$BODY{$dids[0]}=$FORM{'body'};
$BODY{$dids[0]}=~s/\x0D\x0A/
/g; # 改行コード変換(Win)
$BODY{$dids[0]}=~s/\x0D/
/g; # 改行コード変換(Mac)
$BODY{$dids[0]}=~s/\x0A/
/g; # 改行コード変換(UNIX)
$file=$date;
$file=~s/^(\d\d\d\d\d\d).*/$1.html/;
&MakeBNDiary($DIARYDIR,$file,*DATE,*TITLE,*BODY,*dids);
# 最新版日記ファイルを作成
&MakeNewDiary;
# 日記目次ファイルを作成
&MakeIndex;
}
#
# 修正
#
sub Modify{
local($date,@dids,$file,$fileref);
# 更新実行
$dids[0]=$FORM{'did'};
$date=sprintf("%04d%02d%02d",$FORM{'year'},$FORM{'mon'},$FORM{'mday'});
$DATE{$dids[0]}=$date;
$TITLE{$dids[0]}=$FORM{'title'};
$BODY{$dids[0]}=$FORM{'body'};
$BODY{$dids[0]}=~s/\x0D\x0A/
/g; # 改行コード変換(Win)
$BODY{$dids[0]}=~s/\x0D/
/g; # 改行コード変換(Mac)
$BODY{$dids[0]}=~s/\x0A/
/g; # 改行コード変換(UNIX)
$file=$date;
$file=~s/^(\d\d\d\d\d\d).*/$1.html/;
&MakeBNDiary($DIARYDIR,$file,*DATE,*TITLE,*BODY,*dids);
# バックナンバー間移動した場合は前のファイルから消す
# (例)2000年1月1日のを1999年12月31日に修正した場合、200001.htmlから消す
$fileref=$FORM{'date'};
$fileref=~s/^(\d\d\d\d\d\d).*/$1.html/;
if ($file ne $fileref){
&MakeBNDiary($DIARYDIR,$fileref,'','','',*dids);
}
# 最新版日記ファイルを作成
&MakeNewDiary;
# 日記目次ファイルを作成
&MakeIndex;
# 修正画面のために日付変更
$FORM{'date'}=$date;
}
#
# 削除
#
sub Delete{
local($date,$dids[0])=@_;
local($file);
# バックナンバーファイル
$file=$date;
$file=~s/^(\d\d\d\d\d\d).*/$1.html/;
# 削除
&MakeBNDiary($DIARYDIR,$file,'','','',*dids);
# 最新版ファイルを作成
&MakeNewDiary;
# 目次ファイルを作成
&MakeIndex;
# バックナンバーファイル自体が削除されたら0を返す
(-e "$DIARYDIR/$file")?1:0;
}
#------------
# ページ表示
#------------
#
# パスワード入力
#
sub PagePassword{
local($msg);
$msg="パスワードが違います。
" if defined($FORM{'password'});
print &HtmlHeader("パスワード入力");
print <<"_HTML_";
$msg
_HTML_
print &HtmlFooter;
}
#
# 転送ファイルからの更新結果
#
sub PageFileAppend{
local(@fileappendfiles)=@_;
local($escpw)=&escapeHTML($FORM{"password"});
# HTML表示
print &HtmlHeader("FTP転送ファイルによる更新の結果");
print "
\n";
print "FTP転送ファイル ".join(" 、",@FTPFILES)." がありました。
\n";
print "";
foreach(sort @fileappendfiles){
print "$_ 、";
print "";
print "${NEWHTML} 、";
print "";
print "${INDEXHTML} を更新しました。
\n";
}
print "FTP転送ファイル ".join(" 、",@FTPFILES)." を削除しました。
\n";
print "
\n";
print "\n";
print "\n";
print "\n";
print &HtmlFooter;
}
#
# 更新/修正/削除画面表示
#
sub PageNow{
local(@files,$file,$contents);
local(*date,*title,*body);
local(%tmp,$days);
local($syear,$smon,$smday)=&GetTodaysDate;
local($escpw)=&escapeHTML($FORM{'password'});
# 日記ファイル名取得
opendir(DIR,$DIARYDIR) || &error("$DIARYDIR がありません。");
@files=readdir(DIR);
closedir(DIR);
@files=grep(/^\d\d\d\d\d\d\.html$/, @files);
# 日記ファイルを読む
if ($#files>=0){
foreach $file (reverse sort @files){
open(FILE,"$DIARYDIR/$file") || &error("$file がありません。");
$contents=join("",);
close(FILE);
# 日記部を切り出し、DID、DATE、TITLE、BODY抽出
&Contents2DTB($contents,*date,*title,*body);
last if (scalar(keys %date)>=$NEWDIARYDAYS);
}
}
#
# 表示
#
print &HtmlHeader("更新/修正/削除");
print "
\n";
# 更新/修正/削除
print "\n";
# 修正/削除
if (scalar(keys %date)>=0){
print "
\n";
$days=0;
foreach(reverse &SortedDID(*date)){
last if (++$days>$NEWDIARYDAYS);
$date=$date{$_};
$title=&escapeHTML($title{$_});
$sdate=&date2sdate($date);
print "\n";
}
}
# ファイル選択
if ($#files >= 0){
print "
\n";
print "\n";
}
print &HtmlFooter;
}
#
# バックナンバー表示
#
sub PageBacknumber{
local($file,$contents);
local(*date,*title,*body);
local($escpw)=&escapeHTML($FORM{'password'});
# ファイル名に変換(bnyyyymm->yyyymm.html)
$file=$FORM{'page'};
$file=~s/\D*(\d\d\d\d\d\d).*/$1.html/;
# ファイル読み込み
open(FH,"$DIARYDIR/$file") || &error("$DIARYDIR/$file がありません。");
$contents=join("",);
close(FH);
# 日記ファイル解析
&Contents2DTB($contents,*date,*title,*body);
# ページ表示
print &HtmlHeader("修正/削除");
# バックナンバー一覧
print "
\n";
foreach(&SortedDID(*date)){
$date=$date{$_};
$title=&escapeHTML($title{$_});
$sdate=&date2sdate($date{$_});
print "\n";
}
# 更新/修正/削除へ
print "
\n";
print "\n";
print "\n";
print "\n";
print &HtmlFooter;
}
#
# 修正表示
#
sub PageModify{
local(*date,*title,*body);
local($date,$did)=@_;
local($file,$contents);
local(%tmp);
local($escpw)=&escapeHTML($FORM{'password'});
# ファイル読み込み
$file=$date;
$file=~s/^(\d\d\d\d\d\d).*/$1.html/;
open(FILE,"$DIARYDIR/$file") || &error("$file がありません。");
$contents=join("",);
close(FILE);
# 日記ファイル解析
&Contents2DTB($contents,*date,*title,*body);
# 更新/削除
($date,$title,$body)=($date{$did},$title{$did},$body{$did});
($syear,$smon,$smday)=($date=~/^(\d\d\d\d)(\d\d)(\d\d)/);
$retpage=$FORM{'retpage'};
$body=~tr/\x0D\x0A//d; # 改行コード削除
$body=~s/
/\n/ig;
# ページ表示
print &HtmlHeader("修正");
print "
\n";
print "\n";
# 更新/修正/削除へ
print "
\n";
print "\n";
print "\n";
print "\n";
print &HtmlFooter;
}
#
# 削除確認表示
#
sub PageDeleteYN{
local(*date,*title,*body);
local($did)=($FORM{'did'});
local($sdate);
local($retpage)=$FORM{'retpage'};
local($file,$contents);
local($escpw)=&escapeHTML($FORM{'password'});
$date=$FORM{'date'};
$sdate=&date2sdate($date);
# ファイル読み込み
$file=$date;
$file=~s/^(\d\d\d\d\d\d).*/$1.html/;
open(FILE,"$DIARYDIR/$file") || &error("$file がありません。");
$contents=join("",);
close(FILE);
# 日記ファイル解析
&Contents2DTB($contents,*date,*title,*body);
$title=&escapeHTML($title{$did});
$body=$body{$did};
$body=&escapeHTML($body);
$body=~s/<br>/
/ig;
# 表示
print &HtmlHeader("削除確認");
print <<"_HTML_";
削除してもよろしいですか?
日付 |
$sdate |
題名 |
$title |
内容 |
$body |
_HTML_
print &HtmlFooter;
}
#----------------
# サブルーチン群
#----------------
#
# フォームデコード
#
sub FormDecode{
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$buffer,$ENV{CONTENT_LENGTH});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/,$buffer);
foreach $pair (@pairs){
($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$FORM{$name} = $value;
}
# akiaryタグの除去
$FORM{'title'}=~s/<(!--\/?akiary[^>]*)>/<$1>/ig;
$FORM{'body'}=~s/<(!--\/?akiary[^>]*)>/<$1>/ig;
}
#
# FTPで転送された更新ファイル名を取得
#
sub GetFTPFiles{
opendir(DIR,$DIARYDIR) || &error("$DIARYDIR がありません。");
@files = readdir(DIR);
closedir(DIR);
return(grep(/^\d\d\d\d\d\d\d\d\.html$/, @files));
}
#
# HTMLのヘッダー部
#
sub HtmlHeader{
return <<"_HTML_";
Content-Type: text/html
akiary
[日記]
@_
_HTML_
}
#
# HTMLのフッター部
#
sub HtmlFooter{
return <<"_HTML_";
$SIGNATURE
_HTML_
}
#
# FTP転送ファイルからタイトルと日記本文を抽出する
#
sub FTPFile2TitleBody{
local($file)=@_;
local($tmp,$title,$body);
# ファイル読み込み
open(FILE,"$DIARYDIR/$file") || &error("$file がありません。");
$tmp=join("",);
close(FILE);
# タイトルと本文を抽出
($title)=($tmp=~/([\000-\377]*)/);
($body)=($tmp=~/([\000-\377]*)/);
# akiaryタグの除去
$title=~s/<(!--\/?akiary[^>]*)>/<$1>/ig;
$body=~s/<(!--\/?akiary[^>]*)>/<$1>/ig;
return($title,$body);
}
#
# MakeNewDiary -- 最新版日記ファイル作成関数 --
#
# 動作:
# (1)日記ファイルを読む
# (2)テンプレートファイルを読む
# (3)最新版日記ファイルを作成する
#
sub MakeNewDiary{
local($template_head,$template_body,$template_foot);
local($file,@files,$contents,$days);
local(*date,*title,*body);
local($did);
local(@k,$reverse);
local($lastmonth);
#
# (1)日記ファイルを読む
#
opendir(DIR,$DIARYDIR) || &error("$DIARYDIR がありません。");
@files = readdir(DIR);
closedir(DIR);
@files=grep(/^\d\d\d\d\d\d\.html$/, @files);
@files=sort @files;
$lastmonth=$files[$#files];
foreach $file (reverse @files){
open(FILE,"$DIARYDIR/$file") || &error("$file がありません。");
$contents = join("", );
close(FILE);
# 日記部を切り出し、DID、DATE、TITLE、BODY抽出
&Contents2DTB($contents,*date,*title,*body);
last if ($days >= $NEWDIARYDAYS);
}
#
# (2)テンプレートファイルを読む
#
# 読み込み
open(FILE,$TMPNEWFILE) || &error("$TMPNEWFILE がありません。");
$file=join("",);
close(FILE);
#
$file=~s///g;
$file=~s//<\/a>/g;
# 解析
$file=~//;
$template_head=$`; # 日記ヘッド部
$file=$';
$reverse=1 if ($1=~/reverse/);
$file=~//;
$template_body=$`; # 日記ボディ部
$template_foot=$'; # 日記フット部
$template_foot=~s/<\/body>/$SIGNATURE\n<\/body>/ig; # 署名挿入
#
# (3)最新版日記ファイルを作成する
#
open(FILE,">$DIARYDIR/$NEWHTML");
print FILE $template_head;
@k=&SortedDID(*date);
$n=($NEWDIARYDAYS > $#k)? $#k+1: $NEWDIARYDAYS;
@k=splice(@k,-$n,$n);
@k=reverse(@k) if ($reverse==1);
foreach(@k){
print FILE "\n";
print FILE "";
$tmp=$template_body;
# 日付
$dates=&date2sdate($date{$_});
$tmp=~s//$dates/;
# タイトル
$tmp=~s//$title{$_}/;
# 日記本文
$tmp=~s//$body{$_}/;
print FILE "$tmp";
print FILE "\n";
}
print FILE $template_foot;
close(FILE);
}
#
# MakeIndex -- 過去の日記の目次ファイル作成 --
#
# 動作:
# (1)日記ディレクトリを探索する
# (2)テンプレートファイルを読む
# (3)目次ファイルを作成する
#
sub MakeIndex{
local(@files,$contents,$index);
local($did);
#
# (1)日記ディレクトリを探索する
#
opendir(DIR,$DIARYDIR) || &error("$DIARYDIR がありません。");
@files = readdir(DIR);
closedir(DIR);
@files = grep(/^\d\d\d\d\d\d\.html$/,@files);
foreach(sort @files){
($year,$mon)=(/^(\d\d\d\d)(\d\d)/);
$index.="$year年$mon月
\n";
}
#
# (2)テンプレートファイルを読む
#
open(FILE,$TMPINDEXFILE) || &error("$TMPINDEXFILE がありません。");
$contents = join("",);
close(FILE);
#
# (3)目次ファイルを作成する
#
$contents=~s//$index/;
$contents=~s/<\/body>/$SIGNATURE\n<\/body>/ig; # 署名挿入
open(FILE,">${DIARYDIR}/${INDEXHTML}");
print FILE $contents;
close(FILE);
}
#
# 日付を数字から文字列に変換
# (例) 20001020 → 2000年10月20日(金)
# 【引数】
# $date : 数字の日付
# $format: フォーマット
# %Y0 1900-9999
# %Y1 00-99
# %Y2 1-12(平成元号)
# %M0 1-12
# %M1 01-12
# %M2 Jan-Dec
# %M3 January-December
# %D0 1-31
# %D1 01-31
# %W0 日-土
# %W1 Sun-Sat
# %W2 Sunday-Saturday
# デフォルトは"%Y0年%M0月%D0日(%W0)"
#
sub date2sdate{
local($date,$format)=@_;
local($y0,$m0,$d0,$w);
local(@m2,@m3,@w0,@w1,@w2);
local($color,$sdate);
$format=$DATEFORMAT if ($format eq "");
# 年月日
($y0,$m0,$d0)=($date=~/(\d\d\d\d)(\d\d)(\d\d)/);
$y0=1900 if ($y0 < 1900);
$m0=1 if ($m0 < 1);
$m0=12 if ($m0 > 12);
$d0=1 if ($d0 < 1);
$d0=31 if ($d0 > 31);
# 曜日
$w=&GetWdayZeller($y0,$m0,$d0);
$color="#000000"; # 平日の色
$color="#DD0000" if ($w == 0); # 日曜日の色
$color="#3333FF" if ($w == 6); # 土曜日の色
# 文字列変換の準備
@m2=('Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec');
@m3=('January','February','March','April','May','June',
'July','August','September','October','November','December');
@w0=('日','月','火','水','木','金','土');
@w1=('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
@w2=('Sunday','Monday','Tuesday','Wednesday',
'Thursday','Friday','Saturday');
# 文字列日付
$sdate=$format;
$sdate=~s/%Y0/$y0/g; # 4桁西暦
$sdate=~s/%Y1/sprintf("%02d",$y0%100)/eg; # 2桁西暦
$sdate=~s/%Y2/$y0-1988/eg; # 元号
$sdate=~s/%M0/sprintf("%d",$m0)/eg; # 月
$sdate=~s/%M1/sprintf("%02d",$m0)/eg; # 月(0付き)
$sdate=~s/%M2/$m2[$m0-1]/eg; # 月(英語短縮)
$sdate=~s/%M3/$m3[$m0-1]/eg; # 月(英語)
$sdate=~s/%D0/sprintf("%d",$d0)/eg; # 日
$sdate=~s/%D1/sprintf("%02d",$d0)/eg; # 日(0付き)
$sdate=~s/%W0/$w0[$w]/eg; # 曜日
$sdate=~s/%W1/$w1[$w]/eg; # 曜日(英語短縮)
$sdate=~s/%W2/$w2[$w]/eg; # 曜日(英語)
# リターン
return("$sdate");
}
#
# エラー
#
sub error{
print &HtmlHeader("エラー");
print "
\n@_
\n";
print &HtmlFooter;
exit;
}
#
# デバグ用
#
sub debug{
print &HtmlHeader("デバグ");
print "
\n";
foreach(sort keys %FORM){
print "$_ -> ",$FORM{$_},"
\n";
}
print &HtmlFooter;
}
#
# 今日の年月日を得る
#
sub GetTodaysDate{
local($mday,$mon,$year)=(localtime(time))[3..5];
$year+=1900;
$mon++;
return($year,$mon,$mday);
}
#
# 日記ファイルの中身から、日付とタイトルと本文を抽出する
#
sub Contents2DTB{
local($contents,*date,*title,*body)=@_;
local($did,$tb,$d,$t,$b);
# Perl4では?で最短一致させられないため以下のように処理
while($contents=~//){
($did,$d)=($1,$2);
$contents=$'; # マッチした文字列より後の部分
$contents=~//;
$contents=$';
$tb=$`; # からまで
($t)=($tb=~/([\000-\377]*)/);
($b)=($tb=~/([\000-\377]*)/);
$date{$did}=$d;
$title{$did}=$t;
$body{$did}=$b;
}
}
#
# zellerの公式による曜日算出関数
# http://wdic.asuka.net/?title=Zeller%A4%CE%B8%F8%BC%B0
#
sub GetWdayZeller{
local($year,$mon,$mday)=@_;
if (($mon==1) || ($mon==2)){
$year--;
$mon+=12;
}
($year + int($year/4) - int($year/100) + int($year/400)
+ int((13 * $mon + 8)/5) + $mday) % 7;
}
#
# バックナンバー用テンプレートファイルを解析する
#
sub AnalyzeTmpbn{
local(*contents,*head,*opt,*body,*foot)=@_;
if ($contents=~/([\000-\377]*)/i){
$head=$`; # ヘッダ部
$opt=$1; # akiary_diaryのオプション
$body=$2; # akiary_diaryの本文
$foot=$'; # フッタ部
# (1)本文中にakiary_diaryタグがない
# (2)本文中にakiary_titleタグはひとつのみ
# (3)本文中にakiary_bodyタグはひとつのみ
if ($body !~ //i &&
$body !~ //i &&
($body =~ s//$&/ig) == 1 &&
($body =~ s//$&/ig) == 1) {
return(1); # 解析成功すれば1を返す
}
}
}
#
# バックナンバー用テンプレートファイルのエラー
#
sub ErrorTmpbn{
print &HtmlHeader("バックナンバー用テンプレートファイルのエラー");
print <
エラーの原因は以下の6点のいずれかです。
- 「<!--akiary_diary-->」か「<!--/akiary_diary-->」がありません。
- 「<!--akiary_diary-->」か「<!--/akiary_diary-->」が2つ以上あります。
- 「<!--akiary_diary-->」と「<!--/akiary_diary-->」の間に「<!--akiary_title-->」がありません。
- 「<!--akiary_diary-->」と「<!--/akiary_diary-->」の間に「<!--akiary_title-->」が2つ以上あります。
- 「<!--akiary_diary-->」と「<!--/akiary_diary-->」の間に「<!--akiary_body-->」がありません。
- 「<!--akiary_diary-->」と「<!--/akiary_diary-->」の間に「<!--akiary_body-->」が2つ以上あります。
END_OF_TEXT
print &HtmlFooter;
exit;
}
#
# 日記入力テーブル表示
#
# 【引数】
# $opt{"year"} : デフォルト選択の年
# $opt{"mon"} : デフォルト選択の月
# $opt{"mday"} : デフォルト選択の日
# $opt{"size"} : 題名の長さ
# $opt{"cols"} : 内容の列数
# $opt{"rows"} : 内容の行数
# $opt{"title"} : 題名
# $opt{"body"} : 内容
# $opt{"submit"}: submitボタン
# 【返値】
# 日記入力テーブル(まで)
#
sub DiaryInputTable{
local(*opt)=@_;
local($option0112,$option0131);
local($title)=&escapeHTML($opt{"title"});
local($body)=&escapeHTML($opt{"body"});
# 月選択
foreach(1..12){
if ($_ == $opt{"mon"}){
$option0112.="