最終更新: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