[2009-03-21-1] に手動更新でお茶を濁していた「最近追記された記事」で
すが、自動更新するようにしました。

「追記YYYYMMDD:」といったマークをつけて追記すると、左側の「最近追加
された記事」に自動的に表示されます。デフォルトの設定では 5 つ表示し
ます。“YYYYMMDD” は例えば “20090326” です。chalow を更新しないと、
(?日前) は更新されません。

[2009-03-22-3] の ChangeLogReader.rb で実装しようかなとも考えていま
したが、結局 chalow 本体を修正しました。Perl 初心者なので、変なこと
してたら教えてください。^^;

以下にオリジナル(chalow-1.0.tar.gz)の cl.conf と chalow へのパッチ
を貼り付けておきます。

追記(2009-04-05):
例えば 2009.4.5 に [2009-03-07-1][2009-03-26-1] に追記を行うと、
後者だけしか「最近追記された記事」の候補に上がらないので chalow へ
のパッチを差し替えました。
また、埋め込む URL を絶対パスから相対パスに変更しました。

追記(2011-07-06):
GitHub に push しました。

--- cl.conf.org	2007-10-19 21:38:22.000000000 +0900
+++ cl.conf	2009-03-26 23:40:41.000000000 +0900
@@ -109,6 +109,10 @@
 $latest_titles_num = 10;

 # --------------------------------------------------------------------
+# 最近追記された記事(追記YYYYMMDD:)一覧 (JavaScript ファイル) で出力する日数
+$latest_tuiki_num = 5;
+
+# --------------------------------------------------------------------
 # カテゴリページを作るか (0:NO, 1:YES)
 $output_cat_pages = 0;

@@ -161,6 +165,14 @@
 <p/>

 <div class="stdbox">
+<table>
+<tr><td>最近追記された記事</td></tr>
+<tr><td><TMPL_VAR name=latest_tuiki_list></td></tr>
+</table>
+</div>
+<p/>
+
+<div class="stdbox">
 <table><tr><td>リンク</td></tr><tr><td>
 - <a href="http://chalow.org/">chalow</a><br>
 - <a href="http://chalow.net/">たつをの ChangeLog</a><br>
--- chalow.org	2007-10-19 23:15:01.000000000 +0900
+++ chalow	2009-04-05 19:26:12.000000000 +0900
@@ -292,6 +292,8 @@
 my $output_itemlist = 1;
 # 見出し一覧 (JavaScript ファイル) で出力する日数
 my $latest_titles_num = 10;
+# 最近追記された記事(追記YYYYMMDD:)一覧 (JavaScript ファイル) で出力する日数
+my $latest_tuiki_num = 5;

 # 日ごとにページを作るか (0:NO, 1:YES) --- obsolete
 my $day_page_mode = 0;
@@ -375,6 +377,7 @@
 $stop_date =~ s/-//g;

 my $latest_item_list;
+my $latest_tuiki_list;
 my $category_list;

 my $clog_url_pref = $clog_url;
@@ -426,6 +429,7 @@
 write_rss_file() if ($output_rss); # RSS ファイルを作る
 write_itemlist_file() if ($output_itemlist); # 検索用ファイル(itemlist)を作る
 write_latest_item_list_file();	# 最近の話題一覧を作る
+write_latest_tuiki_list_file();	# 最近の追記一覧を作る。
 write_category_list_file();	# カテゴリ一覧を作る

 ### HTML 生成のためのループ
@@ -683,6 +687,7 @@
             $t->param(ym => $current_ym);
             $t->param(day_list => $current_day_list);
             $t->param(latest_item_list => $latest_item_list);
+            $t->param(latest_tuiki_list => $latest_tuiki_list);
             $t->param(category_list => $category_list);
 	    $t->param(rss_file => $rss_filename); # 050821
             $t->param(entries => [grep /^.+$/, @ents[$i*$n...($i+1)*$n-1]]);
@@ -769,6 +774,7 @@

 	    $t->param(month_page_list => $month_page_list);
 	    $t->param(latest_item_list => $latest_item_list);
+	    $t->param(latest_tuiki_list => $latest_tuiki_list);
 	    $t->param(category_list => $category_list);
 	    $t->param(back => $ymdi_before);
 	    $t->param(next => $ymdi_after);
@@ -825,6 +831,7 @@
 	$t->param(day_list => $day_list);
 	$t->param(month_page_list => $month_page_list);
 	$t->param(latest_item_list => $latest_item_list);
+	$t->param(latest_tuiki_list => $latest_tuiki_list);
 	$t->param(category_list => $category_list);
 	$t->param(rss_file => $rss_filename); # 050821
 	$t->param(back => $day_before);
@@ -876,6 +883,7 @@
 	$t->param(day_list => $day_list);
 	$t->param(month_page_list => $month_page_list);
 	$t->param(latest_item_list => $latest_item_list);
+	$t->param(latest_tuiki_list => $latest_tuiki_list);
 	$t->param(category_list => $category_list);
 	$t->param(rss_file => $rss_filename); # 050821
 	$t->param(back => $m_before);
@@ -922,6 +930,7 @@
     $t->param(day_list => $day_list);
     $t->param(month_page_list => $month_page_list);
     $t->param(latest_item_list => $latest_item_list);
+    $t->param(latest_tuiki_list => $latest_tuiki_list);
     $t->param(category_list => $category_list);
     $t->param(rss_file => $rss_filename); # 050821
     $t->param(entries => \@top_n_entries);
@@ -1168,6 +1177,61 @@
 }


+### JavaScript feed ファイルを出力する
+sub write_latest_tuiki_list_file {
+
+    ### 最近追記された記事
+    my @line_list;
+    my $now_s = time;
+    foreach my $ymd (sort {$b cmp $a} keys %{$cl->{all}}) {
+	my $e = $cl->{all}->{$ymd};
+	foreach my $i (sort {$b <=> $a} keys %$e) {
+	    next if ($i !~ /^\d/);
+
+	    ### 追記YYYYMMDD:
+	    while ($e->{$i}{co} =~ /追記(\d{4})(\d{2})(\d{2}):/g) {
+		my $t_y = $1;
+		my $t_m = $2;
+		my $t_d = $3;
+		my $tuiki_day = $t_y.$t_m.$t_d;
+		my $tuiki_day_s = timelocal(0, 0, 0, $t_d, $t_m - 1, $t_y - 1900);
+		my $before = int(($now_s - $tuiki_day_s) / 86400);
+		push @line_list, "- <a href=\"".
+		    datestr2url("$ymd-$i")."\">$ymd-$i</a> ($before日前)<br>";
+	    }
+	}
+    }
+
+    my @lines;
+    my $ctr = $latest_tuiki_num;
+    foreach my $line ( sort compare_for_latest_tuiki_list @line_list ) {
+#	print "$line\n";
+	push @lines, $line;
+	$ctr--;
+	last if ($ctr <= 0);
+    }
+
+    my $ostr = join("\n", map {s/\'/&\#x27;/g; "document.writeln('".$_."');"}
+    		    @lines);
+    output_to_file("$outputdir/tuiki.js", \$ostr);
+
+    $latest_tuiki_list = join("\n", @lines);
+
+}
+
+sub compare_for_latest_tuiki_list {
+    my $a2 = $a;
+    $a2 =~ s/.+\(//;
+    $a2 =~ s/日前\).+//;
+
+    my $b2 = $b;
+    $b2 =~ s/.+\(//;
+    $b2 =~ s/日前\).+//;
+
+    $a2 <=> $b2;
+}
+
+
 sub write_category_list_file {
     ### カテゴリ一覧
 #    return if ($output_cat_pages == 0 or $cat_page_cgi eq "");