最終更新:2005-05-15 08:51:36
最近登場した新バージョン、0.61の改造をしたのでそのあたりを軽く解説します。
修正の概要
設定のデフォルト
設定ファイル(akiary.cfg)に新しい設定項目を増やしました。
- newline
- 標準は「<br>」で、改行をbrに変換したうえで本文を一行につなげます。「\n」とすると、何も変換をしません。「<br>\n」なら、br変換は有効で、改行もそのまま生かします。日記を書くときに直接htmlのブロック要素を書きたいときは、「\n」にしておくことにより、不正なbrを抑制します。
- charset
- エンコーディング(文字コード)を指定します。標準は、「Shift_JIS」。
改行の処理
「改行⇒br変換機能」の改造。設定項目「newline」を変えることによって、変換機能を無効にすることができます。
正規表現の最適化
一部の正規表現を最適化しました。具体的には不要なeオプションを削除しました。多少のパフォーマンスアップが見込めます。
HTTPレスポンスヘッダ
HTTPレスポンスヘッダーにcharsetを付加します。設定ファイルで切替えます。
didアンカー
didアンカーを実現します。PermalinkやRSS出力に必須の改造です。
Akiaryタグの追加
新しいAkiaryタグを追加
- <!--akiary_did-->
- didそのものの文字列
- <!--akiary_link-->
- Permalink用のURL文字列。使い方:<a href="<!--akiary_link-->"><!--akiary_title--></a>
- <!--akiary_title_2-->
- <!--akiary_title-->と同じ文字列に変換されます。ただし、こちらは複数回使えます。
- <!--akiary_w3cdtf-->
- YYYY-MM-DD形式の日付(実験的)
| 元位置 | 対象行数 | 修正後 | 対象行数 | 内容 |
|---|---|---|---|---|
| 18 | 6 | 18 | 8 | 設定のデフォルト(akiary.cfg) |
| 259 | 9 | 261 | 12 | 改行の処理 |
| 291 | 9 | 296 | 12 | 改行の処理 |
| 459 | 7 | 467 | 7 | 正規表現の最適化 |
| 640 | 8 | 648 | 10 | 改行の処理 |
| 779 | 7 | 789 | 7 | 正規表現の最適化 |
| 850 | 9 | 860 | 7 | HTTPレスポンスヘッダ |
| 962 | 7 | 970 | 7 | date2sdate()にno_tagオプションを追加 |
| 997 | 28 | 1005 | 29 | 正規表現の最適化、no_tagオプションの動作 |
| 1402 | 16 | 1411 | 28 | didアンカー、Akiaryタグの追加 |
| 1595 | 8 | 1616 | 8 | 正規表現の最適化 |
| 1685 | 15 | 1706 | 27 | didアンカー Akiaryタグの追加 |
| 1775 | 3 | 1808 | 9 | diary_dir_uri()の追加 |
パッチ
--- akiary061.cgi 2005-04-28 18:11:11.450040000 +0900
+++ akiary.cgi 2005-05-15 08:02:01.786945600 +0900
@@ -18,6 +18,8 @@
{
user_cfg_file=>{''=>'cfg/user.cfg'},
time_zone=>'+0900',
+ newline => '<br>',
+ charset => 'SHIFT_JIS',
};
&parse_cfg_file($akiary_cfg_file,$acfg);
@@ -259,9 +261,12 @@
$DATE{$dids[0]}=$date;
$TITLE{$dids[0]}=$FORM{'title'};
$BODY{$dids[0]}=$FORM{'body'};
- $BODY{$dids[0]}=~s/\x0D\x0A/<br>/g; # 改行コード変換(Win)
- $BODY{$dids[0]}=~s/\x0D/<br>/g; # 改行コード変換(Mac)
- $BODY{$dids[0]}=~s/\x0A/<br>/g; # 改行コード変換(UNIX)
+ $BODY{$dids[0]}=~s/\x0D\x0A/\n/g; # 改行コード変換(Win)
+ $BODY{$dids[0]}=~s/\x0D/\n/g; # 改行コード変換(Mac)
+ $BODY{$dids[0]}=~s/\x0A/\n/g; # 改行コード変換(UNIX)
+ $newline = $acfg->{newline};
+ $newline =~ s/\\n/\n/g;
+ $BODY{$dids[0]} =~ s/\n/$newline/g;
$file=&date2dfn($date);
@@ -291,9 +296,12 @@
$DATE{$dids[0]}=$date;
$TITLE{$dids[0]}=$FORM{'title'};
$BODY{$dids[0]}=$FORM{'body'};
- $BODY{$dids[0]}=~s/\x0D\x0A/<br>/g; # 改行コード変換(Win)
- $BODY{$dids[0]}=~s/\x0D/<br>/g; # 改行コード変換(Mac)
- $BODY{$dids[0]}=~s/\x0A/<br>/g; # 改行コード変換(UNIX)
+ $BODY{$dids[0]}=~s/\x0D\x0A/\n/g; # 改行コード変換(Win)
+ $BODY{$dids[0]}=~s/\x0D/\n/g; # 改行コード変換(Mac)
+ $BODY{$dids[0]}=~s/\x0A/\n/g; # 改行コード変換(UNIX)
+ $newline = $acfg->{newline};
+ $newline =~ s/\\n/\n/g;
+ $BODY{$dids[0]} =~ s/\n/$newline/g;
$file=&date2dfn($date);
@@ -459,7 +467,7 @@
$t=~s/<TMPL_IF NAME="(\w+)">(.*?)<\/TMPL_IF>/($p->{$1})?$2:''/egs;
# <TMPL_VAR NAME="name">
- $t=~s/<TMPL_VAR NAME="(\w+)">/$p->{$1}/eg;
+ $t=~s/<TMPL_VAR NAME="(\w+)">/$p->{$1}/g;
return($t);
}
@@ -640,8 +648,10 @@
($date,$title,$body)
=($date{$FORM{'did'}},$title{$FORM{'did'}},$body{$FORM{'did'}});
($syear,$smon,$smday)=($date=~/^(\d{4})(\d{2})(\d{2})/);
- $body=~tr/\x0D\x0A//d; # 改行コード削除
- $body=~s/<br>/\n/ig;
+ if ($acfg->{newline} eq '<br>') {
+ $body=~tr/\x0D\x0A//d; # 改行コード削除
+ $body=~s/<br>/\n/ig;
+ }
# ページ表示
$html=&HtmlHeader("修正");
@@ -779,7 +789,7 @@
'akiary.cgiでデフォルト値を設定して下さい。');
}
$v =~ s/"//g;
- $v =~ s/\$ENV\{'(\w+)'\}/$ENV{$1}/eg;
+ $v =~ s/\$ENV\{'(\w+)'\}/$ENV{$1}/g;
if ($ke =~ /\{"(\w*)"\}\{"(\w*)"\}/) {
${ $cfg->{$k} }{$1}{$2}=$v;
@@ -850,9 +860,7 @@
# Print HTTP
#
sub PrintHTTP{
- print "Content-Type: text/html\n";
- print "\n";
- print $_[0];
+ print "Content-Type:text/html;charset=", $acfg->{charset}, "\n\n", $_[0];
}
#
@@ -962,7 +970,7 @@
# デフォルトは"%Y0年%M0月%D0日(%W0)"
#
sub date2sdate{
- local($date,$format)=@_;
+ local($date,$format,$no_tag)=@_;
local($y0,$m0,$d0,$w);
local(@m2,@m3,@w0,@w1,@w2);
local($color,$class,$sdate);
@@ -997,28 +1005,29 @@
$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/%M2/$m2[$m0-1]/g; # 月(英語短縮)
+ $sdate=~s/%M3/$m3[$m0-1]/g; # 月(英語)
$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; # 曜日(英語)
+ $sdate=~s/%W0/$w0[$w]/g; # 曜日
+ $sdate=~s/%W1/$w1[$w]/g; # 曜日(英語短縮)
+ $sdate=~s/%W2/$w2[$w]/g; # 曜日(英語)
+
+ if ($no_tag) {
- if ($CFG{'date_color_tag'} eq 'font'){
+ } elsif ($CFG{'date_color_tag'} eq 'font') {
$color="#000000"; # 平日の色
$color="#DD0000" if ($w == 0); # 日曜日の色
$color="#3333FF" if ($w == 6); # 土曜日の色
$sdate="<font color=\"$color\">$sdate</font>";
- } else {
+ } elsif ($CFG{'date_color_tag'} eq 'span') {
$class="weekday"; # 平日の色
$class="sunday" if ($w == 0); # 日曜日の色
$class="saturday" if ($w == 6); # 土曜日の色
$sdate="<span class=\"$class\">$sdate</span>";
}
-
# リターン
- return("$sdate");
+ return $sdate;
}
#
@@ -1402,16 +1411,28 @@
# body部作成
foreach(@k){
- print FH "<a name=\"$bndate{$_}\"></a>\n";
+ print FH qq(<a name="$bndate{$_}"></a><a name="$_"></a>);
print FH "<!--akiary_diary did=$_ date=$bndate{$_}-->";
$tmp=$tmpbnbody;
# 日付
$dates=&date2sdate($bndate{$_});
- $tmp=~s/<!--\s*akiary_date\s*-->/$dates/;
+ $w3cdtf=&date2sdate($bndate{$_}, '%Y0-%M1-%D1', 1);
+ $tmp=~s/<!--\s*akiary_date\s*-->/$dates/g;
+ $tmp=~s/<!--\s*akiary_w3cdtf\s*-->/$w3cdtf/g;
# タイトル
$tmp=~s/<!--\s*akiary_title\s*-->/<!--akiary_title-->$bntitle{$_}<!--\/akiary_title-->/;
+ $tmp=~s/<!--\s*akiary_title_2\s*-->/$bntitle{$_}/g;
# 日記本文
$tmp=~s/<!--\s*akiary_body\s*-->/<!--akiary_body-->$bnbody{$_}<!--\/akiary_body-->/;
+ # 生did
+ $tmp =~ s/<!--\s*akiary_did\s*-->/$_/g;
+ # Permalink
+ $bn_file = $bndate{$_};
+ $bn_file =~ s/^(\d{6}).*/$1.html/;
+ $base_uri = diary_dir_uri();
+ $permalink = $base_uri . $bn_file . '#' . $_;
+ $tmp =~ s/<!--\s*akiary_link\s*-->/$permalink/g;
+
print FH "$tmp";
print FH "<!--/akiary_diary-->\n";
}
@@ -1595,8 +1616,8 @@
$tmp =~ s/%Y2/$y-1988/eg; # 元号
$tmp =~ s/%M0/sprintf("%d",$m)/eg; # 月
$tmp =~ s/%M1/sprintf("%02d",$m)/eg; # 月(0付き)
- $tmp =~ s/%M2/$m2[$m-1]/eg; # 月(英語短縮)
- $tmp =~ s/%M3/$m3[$m-1]/eg; # 月(英語)
+ $tmp =~ s/%M2/$m2[$m-1]/g; # 月(英語短縮)
+ $tmp =~ s/%M3/$m3[$m-1]/g; # 月(英語)
if (defined($index{$y})){
$index{$y} .= $CFG{'index_format_between_months'};
}
@@ -1685,15 +1706,27 @@
@k=splice(@k,-$latest_times,$latest_times);
@k=reverse(@k) if ($reverse==1);
foreach(@k){
- $ret.="<a name=\"$date{$_}\"></a>\n";
+ $ret .= qq(<a name="$date{$_}"></a><a name="$_"></a>);
$tmp=$match;
# 日付
$dates=&date2sdate($date{$_});
+ $w3cdtf=&date2sdate($date{$_}, '%Y0-%M1-%D1', 1);
$tmp=~s/<!--\s*akiary_date\s*-->/$dates/g;
+ $tmp=~s/<!--\s*akiary_w3cdtf\s*-->/$w3cdtf/g;
# タイトル
- $tmp=~s/<!--\s*akiary_title\s*-->/$title{$_}/g;
+ $tmp=~s/<!--\s*akiary_title\s*-->/$title{$_}/;
+ $tmp=~s/<!--\s*akiary_title_2\s*-->/$title{$_}/g;
# 日記本文
- $tmp=~s/<!--\s*akiary_body\s*-->/$body{$_}/g;
+ $tmp=~s/<!--\s*akiary_body\s*-->/$body{$_}/;
+ # 生did
+ $tmp =~ s/<!--\s*akiary_did\s*-->/$_/g;
+ # Permalink
+ $bn_file = $date{$_};
+ $bn_file =~ s/^(\d{6}).*/$1.html/;
+ $base_uri = diary_dir_uri();
+ $permalink = $base_uri . $bn_file . '#' . $_;
+ $tmp =~ s/<!--\s*akiary_link\s*-->/$permalink/g;
+
$ret.=$tmp;
}
@@ -1775,3 +1808,9 @@
}
return("$y${m}01.html");
}
+
+sub diary_dir_uri {
+ my $uri = $ENV{'SCRIPT_NAME'};
+ $uri =~ s!^(.*?)(?:[\./]+?)(?:\w+\.cgi|/)$!$1!;
+ return 'http://' . $ENV{'HTTP_HOST'} . $uri . '/' . (($dcfg->{'diary_dir'} eq './') ? '' : $dcfg->{'diary_dir'});
+}
いしだなおと it@isnot.jp