/*
*
*/
//******************************************************************************
//ユーザ設定
//******************************************************************************
$max_entry_number = 222; // 表示最大件数 0:無制限 n:最大表示件数n
$max_entry_from_one_rss = 15; // 1つのRSSフィードから得る記事数 0:無制限 n:最大記事数
$max_contents_length = 50; // 記事の文字数制限
$rdf_log_file_path = './log.txt'; //RDFログファイルパス
$template_file_path = './temp.html'; //出力用テンプレートファイルパス
$output_html_path = './output.html'; //出力HTMLファイルパス
//******************************************************************************
//システム設定
//******************************************************************************
$output_character = 'utf-8'; //出力ファイル文字コード
$system_mode = 0;
$request = array( //入力制限
'display', //HTMLへの出力の有無
'encoding' //エンコーディング変更
);
$error_reporting = 0; //エラーレベル設定
$error_message_flg = false; //エラーログを取らない
$error_message_log = './error.log'; //エラーログファイルパス
$error_display = true;
error_reporting($error_reporting);
$output_html_mode = 0777; //出力HTMLファイル アクセスモード
//******************************************************************************
//モジュール設定
//******************************************************************************
ini_set('include_path', './include/pear::' .ini_get('include_path')); //モジュールディレクトリ
require_once("XML/RSS.php"); //RSSモジュール読み込み
require_once('include/clsTemplate.php'); //テンプレートモジュール
//******************************************************************************
//システム関数設定
//******************************************************************************
//エラー関数
function err($msg){
global $error_message_log,$error_display;
if( $error_display == true){
echo $msg;
}
if( $error_message_flg == false)
return;
$err_msg = date('Y/m/d H:m:s')." ".$msg."\n";
$fp = fopen($error_message_log,"a+");
fputs($fp,$err_msg);
fclose($fp);
}
//エンコーディング関数
function encode($msg){
global $output_character;
return mb_convert_encoding($msg,$output_character,"auto");
}
//入力のフィルタリング
foreach($request as $key ){
if( isset($_REQUEST[$key]) ){
//HTMLエンティティフィルタ
$_REQUEST[$key] = htmlentities($_REQUEST[$key]);
//空白削除
$_REQUEST[$key] = trim($_REQUEST[$key]);
}
}
if( isset($_REQUEST['encoding']) ){
$output_character = $_REQUEST['encoding'];
}
//******************************************************************************
//設定終了
//******************************************************************************
//******************************************************************************
//Controll
//******************************************************************************
//RDFログからURIの取得
$rssList = get_rssList($rdf_log_file_path);
//RSSリストからRSSデータを取得
$rss_data = array();
foreach( $rssList as $rss){
$rss_data = array_merge($rss_data,get_RSS($rss['rss']));
}
//RSSデータを時間でソート
usort($rss_data,"entry_sort");
//HTMLファイル保存
$text = make_template_from_rss($output_html_path,$template_file_path,convert_rss_data($rss_data));
if( $_REQUEST['display'] == 'yes' ){
echo $text;
}
//******************************************************************************
//Bussiness Model
//******************************************************************************
/*
* 関数名:rss_log_parse
* 概要 :<>で区切られた文字列を
* array(
* 'id'=>,
* 'rss'=> )
* 形式にして返す
*
*/
function rss_log_parse($_text){
list($id,$rss) = explode("<>",$_text);
//id,rssから前後の空白削除
$id = trim($id);
$rss= trim($rss);
return array('id'=>$id,'rss'=>$rss);
}
/*
* 関数名:get_rssList
* 概要 :RSSログファイルからパースした配列を返す
* ファイル読み込みに失敗したらエラー終了
* 結果配列
* array(
* array(
* 'id'=>,
* 'rss'=>
* )
* )
*
*/
function get_rssList($_file){
//ファイルの存在チェック
if( @file_exists($_file) == FALSE){
err("Error : Log file not exists!!\n");
exit;
}
//ログファイルから各行を配列に保存
//1行の長さは最大4096byteまで
$fp = @fopen($_file, "r");
if (!$fp){
err("Error : Log file Can\'t open!!\n");
exit;
}
while (!feof($fp)) {
$line_texts[] = fgets($fp, 4096);
}
fclose($fp);
//各行にそれぞれパース実行
foreach($line_texts as $text){
//空行はパースしない
$text = trim($text);
if( empty($text) )continue;
//パース実行。
$dat = rss_log_parse($text);
if( $dat === FALSE){
continue;
}
//結果をret配列に保存
$ret[] = $dat;
}
return $ret;
}
/*
* 関数名:rss_log_parse
* 概要 :<>で区切られた文字列を
* array(
* 'id'=>,
* 'rss'=> )
* 形式にして返す
*
*/
function get_RSS($_uri){
global $out_put_character,$max_contents_length,$max_entry_from_one_rss;
/**
* RSSファイルへのURIをコンストラクタの引数に渡す
*/
$rss =& new XML_RSS($_uri);
/**
* RSSファイルをパースする
*/
$rss->parse();
/**
* チャンネル情報の取得
*/
$channel = $rss->getChannelInfo();
$channel =array_map("encode",$channel);
/**
* 全item要素を取得
*/
$ret = array();
$cnv_item = array();
foreach ($rss->getItems() as $item) {
//エンコード変換
$cnv_item=array_map("encode",$item);
//記事の日時取得
if( isset($cnv_item['pubdate']) )
$time = parse_pubDate($cnv_item['pubdate']);
if( isset($cnv_item['dc:date']) )
$time = parse_w3cdtf($cnv_item['dc:date']);
//記事の文字数制限
$contents = mb_substr($cnv_item['description'],0,$max_contents_length,'SJIS');
//返すタグを設定
$entry = array();
$entry['title'] = '' .$cnv_item['title'] . '';
$entry['time'] = $time;
$entry['site'] = ''. $channel['title'] . "";
$entry['site_title'] = $channel['title'];
$entry['site_url'] = $channel['link'];
$entry['contents'] = $contents;
$entry['contents_url'] = $cnv_item['link'];
$entry['contents_title'] = $cnv_item['title'];
$ret[] = $entry;
}
usort($ret,"entry_sort");
//1つのRSSフィードからの記事数を制限
if( $max_entry_from_one_rss > 0){
$ary = array_chunk($ret ,$max_entry_from_one_rss);
$ret = $ary[0];
}
return $ret;
}
function entry_sort($a,$b){
if ($a['time']['timestamp'] == $b['time']['timestamp']) {
return 0;
}
return ($a['time']['timestamp'] > $b['time']['timestamp']) ? -1 : 1;
}
function parse_pubDate($pubDate)
{
$timestamp = strtotime($pubDate);
$dt = getdate($timestamp);
$result = array("year" => $dt['year'],
"month" => sprintf("%02d",$dt['mon']),
"day" => sprintf("%02d",$dt['mday']),
"hour" => sprintf("%02d",$dt['hours']),
"minute" => sprintf("%02d",$dt['minutes']),
"second" => sprintf("%02d",$$dt['seconds']),
"timestamp" => $timestamp);
return $result;
}
function parse_w3cdtf($datetime)
{
// Year
if(preg_match("/^(\d{4})$/", $datetime, $val)) {
$year = $val[1];
// Year and month
} elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])$/", $datetime, $val)) {
$year = $val[1];
$month = $val[2];
// Complete date
} elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $datetime, $val)) {
$year = $val[1];
$month = $val[2];
$day = $val[3];
// Complete date plus hours and minutes
} elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-5][0-9]):([0-5][0-9])(Z|(\+|-)[0-5][0-9]:[0-5][0-9])$/", $datetime, $val)) {
$year = $val[1];
$month = $val[2];
$day = $val[3];
$hour = $val[4];
$minute = $val[5];
$timezone = $val[6];
// Complete date plus hours, minutes and seconds
} elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(Z|(\+|-)[0-5][0-9]:[0-5][0-9])$/", $datetime, $val)) {
$year = $val[1];
$month = $val[2];
$day = $val[3];
$hour = $val[4];
$minute = $val[5];
$second = $val[6];
$timezone = $val[7];
// Complete date plus hours, minutes, seconds and a decimal fraction of a second
} elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-5][0-9]):([0-5][0-9]):([0-5][0-9]).([0-9]+)(Z|(\+|-)[0-5][0-9]:[0-5][0-9])$/", $datetime, $val)) {
$year = $val[1];
$month = $val[2];
$day = $val[3];
$hour = $val[4];
$minute = $val[5];
$second = $val[6];
$fraction = $val[7];
$timezone = $val[8];
// Not W3C-DTF
} else {
return false;
}
// Offset of Timezone for gmmktime()
if($timezone != "Z") {
$offset_sign = substr($timezone, 0, 1);
$offset_hour = substr($timezone, 1, 2);
$offset_minute = substr($timezone, 4, 2);
}
$timestamp = gmmktime($hour - ($offset_sign . $offset_hour), $minute - ($offset_sign . $offset_minute), $second, $month, $day, $year);
$result = array("year" => $year, "month" => $month, "day" => $day,
"hour" => $hour, "minute" => $minute, "second" => $second,
"fraction" => $fraction, "timezone" => $timezone, "timestamp" => $timestamp);
return $result;
}
function time_from_contents($contents){
$ptn = "/(\d{4}\/\d{2}\/\d{2}\(.*?\) \d{2}:\d{2}:\d{2})/";
preg_match($ptn,$contents,$match);
$result = $match[0];
return $result;
}
/*
* 関数名:convert_rss_data
* 概要 :RSSデータをテンプレートで使える形に整形
* 入力 $rss_data RSSデータ
* 出力 整形済みRSS配列
*/
function convert_rss_data($rss_data){
global $max_entry_number;
//rssデータの整形
$i=1;
foreach($rss_data as $key => $dat){
$data['entry'][] = array(
"NO" => $i,
"SITE" => $dat['site'],
"SITE_TITLE"=> $dat['site_title'],
"SITE_URL" => $dat['site_url'],
"TITLE" => $dat['title'],
"CONTENTS" => $dat['contents'],
"CONTENTS_TITLE" => $dat['contents_title'],
"CONTENTS_URL" => $dat['contents_url'],
"DATE" => $dat['time']['year']."/".$dat['time']['month']."/".$dat['time']['day']." ",
"TIME" => $dat['time']['hour'].":".$dat['time']['minute']
);
$date['time'][] = array(
"DATE" => $dat['time']['year']."/".$dat['time']['month']."/".$dat['time']['day']." "
);
if( $max_entry_number == $i)
break;
$i++;
}
return $data;
}
/*
* 関数名:make_template_from_rss
* 概要 :指定されたファイル名でテンプレートHTMLを作成
* 入力 $file_name 出力ファイル名
* $rss_data RSSデータ
*
*/
function make_template_from_rss($output_file,$template_file,$rss_data){
global $output_html_mode;
if( !file_exists($template_file) ){
err('テンプレートファイルが見つかりません。');
exit;
}
//テンプレートからHTMLテキスト取得
$template = new clsTemplate;
$html_text = $template->template($template_file,$rss_data);
//HTMLテキスト保存
$fp = fopen($output_file,"w");
fputs($fp,$html_text);
fclose($fp);
//chmod($output_file,$output_html_mode);
return $html_text;
}
?>