###############################################################################
#
# RSSプラグイン
#
###############################################################################
package plugin::rss::RSSMaker;
use strict;
#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
	my $class = shift;
	my $self = {};
	return bless $self,$class;
}
#==============================================================================
# アクションハンドラメソッド
#==============================================================================
sub do_action {
	my $self = shift;
	my $wiki = shift;
	my $cgi  = $wiki->get_CGI();
	my $file = $wiki->config('log_dir')."/rss.cache";
	
	# キャッシュファイルがない場合は作成する
	unless(-e $file){
		&make_rss($wiki,$file);
	}
	
	# RSSをレスポンス
	print "Content-Type: text/xml\n\n";
	open(RSS,$file);
	binmode(RSS);
	while(<RSS>){
		print $_;
	}
	close(RSS);
	
	exit();
}

#==============================================================================
# フックメソッド
#==============================================================================
sub hook {
	my $self = shift;
	my $wiki = shift;
	my $hook = shift;
	
	if($hook eq "initialize"){
		$wiki->add_head_info("<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"".$wiki->create_url({action=>"RSS"})."\">");
	} else {
		&make_rss($wiki,$wiki->config('log_dir')."/rss.cache");
	}
}

#==============================================================================
# 日付をフォーマット
#==============================================================================
sub format_date {
	my $time = shift;
	my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime($time);
	return sprintf("%04d/%02d/%02d %02d:%02d:%02d",
	               $year+1900,$mon+1,$mday,$hour,$min,$sec);
}

#==============================================================================
# RSSファイルを作成する
#==============================================================================
sub make_rss {
	my $wiki = shift;
	my $file = shift;
	
	open(RSS,">$file") or die "RSSファイルの作成に失敗しました。";
	binmode(RSS);
	
	# 更新情報を収集
	my @list = $wiki->get_page_list;
	@list = sort {
		my $mod1 = $wiki->get_last_modified2($a);
		my $mod2 = $wiki->get_last_modified2($b);
		return $mod2 <=> $mod1;
	} @list;
	
	# URIを作成
	my $uri = $wiki->config('server_host');
	if($uri eq ""){
		$uri = $wiki->get_CGI()->url(-path_info => 1);
	} else {
		$uri = $uri . $wiki->get_CGI->url(-absolute => 1) . $wiki->get_CGI()->path_info();
	}
	
	# RSSをファイルに書き出す
#	print "Content-Type: text/xml\n\n";
	print RSS "<?xml version=\"1.0\" encoding=\"EUC-JP\"?>\n";
	print RSS "<!DOCTYPE rss PUBLIC \"-//Netscape Communications//DTD RSS 0.91//EN\"\n";
	print RSS "            \"http://my.netscape.com/publish/formats/rss-0.91.dtd\">\n";
	print RSS "<rss version=\"0.91\">\n";
	print RSS "  <channel>\n";
	print RSS "    <title>".$wiki->config('site_title')."</title>\n";
	print RSS "    <link>$uri?action=RSS</link>\n";
	print RSS "    <description>".$wiki->config('site_title')." RecentChanges</description>\n";
	print RSS "    <language>ja</language>\n";
	my $count = 0;
	foreach my $page (@list){
		
		# 公開されているページのみ
		next if($wiki->get_page_level($page)!=0);
		
		if($count==15){
			last;
		}
		print RSS "    <item>\n";
		print RSS "      <title>".Util::escapeHTML($page)."</title>\n";
		print RSS "      <link>$uri?page=".Util::url_encode($page)."</link>\n";
		print RSS "      <description>".&format_date($wiki->get_last_modified2($page))."</description>\n";
		print RSS "    </item>\n";
		$count++;
	}
	print RSS "  </channel>\n";
	print RSS "</rss>\n";
	
	close(RSS);
}

1;