BugTrack/2176
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* #showrss の文字コード判定が正しくない、他 [#a8595d9f]
- ページ: [[BugTrack]]
- 投稿者: [[matsuo]]
- 優先順位: 普通
- 状態: 完了
- カテゴリー: プラグイン
- 投稿日: 2006-04-29 (土) 21:03:31
- バージョン: 1.4.7
- リリース予定バージョン: 1.5.2
#contents
** メッセージ [#s9666085]
[[official:質問箱3/378]]
天気予報を表示しようとしたのですが
◆天気 愛知 西部(名古屋)
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
↑表示されない。(06/04/06)
◆天気 愛知 東部(豊橋)
#showrss(http://weather.goo.ne.jp/area/5120.rdf,,0,1)
#showrss(http://weather.goo.ne.jp/area/5120.rdf,,0,1)
↑こちらはうまく表示される。
他のrssリーダではうまく表示されていたので#showrssに原因が...
***回答 [#f75079e5]
- mb_detect_encoding() が EUCのところをUTF-8と誤検出する...
--- showrss.inc.php.org
+++ showrss.inc.php
@@ -52,9 +51,13 @@
if (! class_exists($class)) $class = 'ShowRSS_ht...
list($rss, $time) = plugin_showrss_get_rss($rssu...
+
if ($rss === FALSE)
return '<p>showrss: cannot get rss from ...
+ if (is_string($rss))
+ return "<p>showrss: error ${rss}\n";
+
$obj = new $class($rss);
$timestamp = '';
@@ -210,12 +213,20 @@
$this->is_item = FALSE;
$this->tag = '';
- // Detect encoding
- $this->encoding = mb_detect_encoding($bu...
+ /* Detect encoding ex. <?xml version="...
+ $lines = split(">", $buf, 1);
+ if (preg_match( "/encoding=\"(.+)\"/i", ...
+ $this->encoding = $encoding[1];
+ } else {
+ $this->encoding = mb_detect_enco...
+ }
+
+ // Convert to utf-8
if (! in_array(strtolower($this->encodin...
$buf = mb_convert_encoding($buf,...
$this->encoding = 'utf-8';
}
+
$xml_parser = xml_parser_create($this->e...
xml_set_element_handler($xml_parser, arr...
xml_set_character_data_handler($xml_pars...
- なるほど、rss自身が申告しているエンコーディングがあるな...
- ふむ、例示されたshowrssの例は、引数の判定を厳密にすると...
こうすると
#showrss(http://weather.goo.ne.jp/area/5110.rdf,0,1)
こうなる
#showrss: Template not found: 0
-- 恐らくはテンプレートの部分 (default等) を省略される意...
本来のusageはこのようだ
#showrss(URI-to-RSS[,default|menubar|recent[,Cache-lifet...
こうされたいのかな?
#showrss(http://weather.goo.ne.jp/area/5110.rdf,default,1)
officialサイトを読む例 (templateはmenubar)
#showrss(http://pukiwiki.sourceforge.jp/?cmd=rss10,menub...
- 当方ではshowrss.inc.php (1.18以前)にて上記天気予報 2例...
#showrss(http://weather.goo.ne.jp/area/5110.rdf,0,1)
#showrss(http://weather.goo.ne.jp/area/5120.rdf,0,1)
showrss.inc.php (1.19)ではTemplate not found・・です。 --...
-- 第2引数を書くか、カンマで区切れば良いのですね。引数の...
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
-- [[hirokasa]]さん、CVS版のコードの確認ありがとうござい...
-- 第二引数を省いた場合、default表示の「Last-Modified:200...
--- showrss.inc.php (1.18 以前) では、テンプレートが存在...
--- commit:55f96efe2a (CVS: showrss.inc.php 1.18→1.19) で...
- 上記パッチ(を少々直して)cvsに投入しました。変更点として...
-- [[cvs:plugin/showrss.inc.php]] (r1.18-r1.21)
- 「Last-Modified:1970/01/01 18:00:00」と表示されますが・...
-- 前後の状況を詳しく -- &new{2006-05-11 (木) 23:39:02};
-- あ、上の例か。 -- &new{2006-05-11 (木) 23:39:19};
-- plugin_showrss_convertのget_date('Y/m/d H:i:s', $time)...
-- 1.4.7ではshowrss.inc.php(65)にて
$time = '';
としちゃだめだと思います。
ここでいう$timeとは plugin_showrss_get_rssから返された$ti...
get_date('Y/m/d H:i:s', NULL) だと「現時点の時間」になっ...
--- $time = ''; でget_date('Y/m/d H:i:s', $time); で...
//#comment
**r1.21 で気がついたことをいくつか (2009-10-18 (日) 17:48...
特に説明もなく上の回答のところのパッチに書かれているので...
簡易で書いた差分は、[[cvs:plugin/showrss.inc.php]] (r1.21...
***plugin_showrss_get_rss() の返り値について [#l5a95492]
list($rss, $time) = plugin_showrss_get_rss($uri, $cache...
で$rss に返ってくる値は、FALSE と配列だけではなく、文字列...
そこで、
list($rss, $time) = plugin_showrss_get_rss($uri, $cach...
if ($rss === FALSE) return '#showrss: Failed fetching ...
+ if (! is_array($rss)) return '#showrss: ' . htmlspecia...
のように追加すれば、とりあえず後ろの作業でforeach に文字...
表示されるエラーメッセージが妥当かは別の話で
- この対応を追加しました ( commit:a04c9be0cc ) -- [[umori...
***クリーンアップで発生したバグ(Show-timestamp オプショ...
[[showrss.inc.php>cvs:plugin/showrss.inc.php?view=diff&r1...
$time → $time
$timestamp → $time
$usetimestamp → $timestamp
としてしまったため、Show-timestamp オプションを有効とした...
上で「Last-Modified:1970/01/01 18:00:00」と(常に)表示さ...
- list($rss, $time) = plugin_showrss_get_rss($uri, $cach...
+ list($rss, $rss_time) = plugin_showrss_get_rss($uri, $...
if ($rss === FALSE) return '#showrss: Failed fetching ...
$time = '';
if ($timestamp > 0) {
$time = '<p style="font-size:10px; font-weight:bold">...
- get_date('Y/m/d H:i:s', $time) . '</p>';
+ get_date('Y/m/d H:i:s', $rss_time) . '</p>';
}
- 表示用の変数を $time_display に変更しました ( commit:a0...
***%%わざと%% 間違ってバイナリファイルを指定した場合など...
一応、どんなurl でも指定できるようになっているので、mbstr...
// Normalize to UTF-8 / ASCII
if (! in_array(strtolower($this->encoding), array('us...
- $buf = mb_convert_encoding($buf, 'utf-8', $this->enc...
+ $buf = @mb_convert_encoding($buf, 'utf-8', $this->en...
$this->encoding = 'utf-8';
}
また変換に成功していても、想定外の文字キャラクタをxml_par...
// Parsing
$xml_parser = xml_parser_create($this->encoding);
xml_set_element_handler($xml_parser, array(& $this, '...
xml_set_character_data_handler($xml_parser, array(& $...
- if (! xml_parse($xml_parser, $buf, 1)) {
+ if (! @xml_parse($xml_parser, $buf, 1)) {
return(sprintf('XML error: %s at line %d in %s',
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser), $buf));
}
xml_parser_free($xml_parser);
ちなみに、sprintf() で作られるエラーメッセージですが、相...
- 先頭の500文字のみ表示するようにしました ( commit:a04c9b...
***クリーンアップで発生したバグ(plugin_showrss_get_times...
1970-01-01T18:00:00 のようにマッチの結果$matches[3] がセ...
ついでに、PHP 5.1.0 以降の[[strtotime()>PHP関数:strtotime...
if (preg_match('/(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2...
$time = strtotime($matches[1] . ' ' . $matches[2]);
- if ($time == -1) {
+ if ($time == -1 || $time === FALSE) {
$time = UTIME;
- } else if ($matches[3]) {
+ } else if (isset($matches[3])) {
$diff = ($matches[5] * 60 + $matches[6]) * 60;
$time += ($matches[4] == '-' ? $diff : -$diff);
}
return $time;
} else {
$time = strtotime($str);
- return ($time == -1) ? UTIME : $time - LOCALZONE;
+ return ($time == -1 || $time === FALSE) ? UTIME : $ti...
}
- この対応(isset)を追加しました。 strtotime() は[[BugTrac...
***キャッシュを使っている場合でも、feed を読み取るときに...
$time = strtotime($str);
return ($time == -1) ? UTIME : $time - LOCALZONE;
のように読み取りに失敗した時に現在の時刻(UTIME)を使って...
- キャッシュ利用時にはファイルの変更日時を使うようにしま...
***[[Atom]] feed を読み込めない [#p0c8799f]
(内容を [[BugTrack/2444]] に移動しました)
***キャッシュを有効にした場合、必ずファイルチェックが入る...
現状では、1つのページに設置した複数showrss プラグイン全て...
なので、未チェックであるか、これまでよりも短い時間を設定...
// Remove cache if expired limit exeed
function plugin_showrss_cache_expire($cachehour)
{
+ static $check = NULL;
+
+ if ($check !== NULL && $check <= $cachehour) return;
+ $check = $cachehour;
+
$expire = $cachehour * 60 * 60; // Hour
$dh = dir(CACHE_DIR);
- キャッシュ利用対象のファイルのみ、有効期限チェック(古...
***XML 宣言でUTF-8 以外のエンコーディングを宣言した場合に...
2009-10-20 (火) 01:48:07 にこの内容を追加
<?xml version="1.0" encoding="EUC-JP" ?>
のようにUTF-8 以外のエンコーディングを宣言した場合、xml_p...
そこで、encoding="エンコード名" の部分を消す事で、この部...
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
の例で、中身が表示されない原因がコレみたいです)
// Detect encoding
$matches = array();
if(preg_match('/<\?xml [^>]*\bencoding="([a-z0-9-_]+)...
$this->encoding = $matches[1];
+ $buf = preg_replace('/<\?xml ([^>]*)\bencoding="[a-z...
} else {
$this->encoding = mb_detect_encoding($buf);
}
- この対応を入れました ( commit:a04c9be0cc ) -- [[umorigu...
----
- 『r1.21 で気がついたことをいくつか (2009-10-18 (日) 17:...
- タイトルを変更しました: 「#showrss の不具合??」→「#sh...
#comment
終了行:
* #showrss の文字コード判定が正しくない、他 [#a8595d9f]
- ページ: [[BugTrack]]
- 投稿者: [[matsuo]]
- 優先順位: 普通
- 状態: 完了
- カテゴリー: プラグイン
- 投稿日: 2006-04-29 (土) 21:03:31
- バージョン: 1.4.7
- リリース予定バージョン: 1.5.2
#contents
** メッセージ [#s9666085]
[[official:質問箱3/378]]
天気予報を表示しようとしたのですが
◆天気 愛知 西部(名古屋)
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
↑表示されない。(06/04/06)
◆天気 愛知 東部(豊橋)
#showrss(http://weather.goo.ne.jp/area/5120.rdf,,0,1)
#showrss(http://weather.goo.ne.jp/area/5120.rdf,,0,1)
↑こちらはうまく表示される。
他のrssリーダではうまく表示されていたので#showrssに原因が...
***回答 [#f75079e5]
- mb_detect_encoding() が EUCのところをUTF-8と誤検出する...
--- showrss.inc.php.org
+++ showrss.inc.php
@@ -52,9 +51,13 @@
if (! class_exists($class)) $class = 'ShowRSS_ht...
list($rss, $time) = plugin_showrss_get_rss($rssu...
+
if ($rss === FALSE)
return '<p>showrss: cannot get rss from ...
+ if (is_string($rss))
+ return "<p>showrss: error ${rss}\n";
+
$obj = new $class($rss);
$timestamp = '';
@@ -210,12 +213,20 @@
$this->is_item = FALSE;
$this->tag = '';
- // Detect encoding
- $this->encoding = mb_detect_encoding($bu...
+ /* Detect encoding ex. <?xml version="...
+ $lines = split(">", $buf, 1);
+ if (preg_match( "/encoding=\"(.+)\"/i", ...
+ $this->encoding = $encoding[1];
+ } else {
+ $this->encoding = mb_detect_enco...
+ }
+
+ // Convert to utf-8
if (! in_array(strtolower($this->encodin...
$buf = mb_convert_encoding($buf,...
$this->encoding = 'utf-8';
}
+
$xml_parser = xml_parser_create($this->e...
xml_set_element_handler($xml_parser, arr...
xml_set_character_data_handler($xml_pars...
- なるほど、rss自身が申告しているエンコーディングがあるな...
- ふむ、例示されたshowrssの例は、引数の判定を厳密にすると...
こうすると
#showrss(http://weather.goo.ne.jp/area/5110.rdf,0,1)
こうなる
#showrss: Template not found: 0
-- 恐らくはテンプレートの部分 (default等) を省略される意...
本来のusageはこのようだ
#showrss(URI-to-RSS[,default|menubar|recent[,Cache-lifet...
こうされたいのかな?
#showrss(http://weather.goo.ne.jp/area/5110.rdf,default,1)
officialサイトを読む例 (templateはmenubar)
#showrss(http://pukiwiki.sourceforge.jp/?cmd=rss10,menub...
- 当方ではshowrss.inc.php (1.18以前)にて上記天気予報 2例...
#showrss(http://weather.goo.ne.jp/area/5110.rdf,0,1)
#showrss(http://weather.goo.ne.jp/area/5120.rdf,0,1)
showrss.inc.php (1.19)ではTemplate not found・・です。 --...
-- 第2引数を書くか、カンマで区切れば良いのですね。引数の...
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
-- [[hirokasa]]さん、CVS版のコードの確認ありがとうござい...
-- 第二引数を省いた場合、default表示の「Last-Modified:200...
--- showrss.inc.php (1.18 以前) では、テンプレートが存在...
--- commit:55f96efe2a (CVS: showrss.inc.php 1.18→1.19) で...
- 上記パッチ(を少々直して)cvsに投入しました。変更点として...
-- [[cvs:plugin/showrss.inc.php]] (r1.18-r1.21)
- 「Last-Modified:1970/01/01 18:00:00」と表示されますが・...
-- 前後の状況を詳しく -- &new{2006-05-11 (木) 23:39:02};
-- あ、上の例か。 -- &new{2006-05-11 (木) 23:39:19};
-- plugin_showrss_convertのget_date('Y/m/d H:i:s', $time)...
-- 1.4.7ではshowrss.inc.php(65)にて
$time = '';
としちゃだめだと思います。
ここでいう$timeとは plugin_showrss_get_rssから返された$ti...
get_date('Y/m/d H:i:s', NULL) だと「現時点の時間」になっ...
--- $time = ''; でget_date('Y/m/d H:i:s', $time); で...
//#comment
**r1.21 で気がついたことをいくつか (2009-10-18 (日) 17:48...
特に説明もなく上の回答のところのパッチに書かれているので...
簡易で書いた差分は、[[cvs:plugin/showrss.inc.php]] (r1.21...
***plugin_showrss_get_rss() の返り値について [#l5a95492]
list($rss, $time) = plugin_showrss_get_rss($uri, $cache...
で$rss に返ってくる値は、FALSE と配列だけではなく、文字列...
そこで、
list($rss, $time) = plugin_showrss_get_rss($uri, $cach...
if ($rss === FALSE) return '#showrss: Failed fetching ...
+ if (! is_array($rss)) return '#showrss: ' . htmlspecia...
のように追加すれば、とりあえず後ろの作業でforeach に文字...
表示されるエラーメッセージが妥当かは別の話で
- この対応を追加しました ( commit:a04c9be0cc ) -- [[umori...
***クリーンアップで発生したバグ(Show-timestamp オプショ...
[[showrss.inc.php>cvs:plugin/showrss.inc.php?view=diff&r1...
$time → $time
$timestamp → $time
$usetimestamp → $timestamp
としてしまったため、Show-timestamp オプションを有効とした...
上で「Last-Modified:1970/01/01 18:00:00」と(常に)表示さ...
- list($rss, $time) = plugin_showrss_get_rss($uri, $cach...
+ list($rss, $rss_time) = plugin_showrss_get_rss($uri, $...
if ($rss === FALSE) return '#showrss: Failed fetching ...
$time = '';
if ($timestamp > 0) {
$time = '<p style="font-size:10px; font-weight:bold">...
- get_date('Y/m/d H:i:s', $time) . '</p>';
+ get_date('Y/m/d H:i:s', $rss_time) . '</p>';
}
- 表示用の変数を $time_display に変更しました ( commit:a0...
***%%わざと%% 間違ってバイナリファイルを指定した場合など...
一応、どんなurl でも指定できるようになっているので、mbstr...
// Normalize to UTF-8 / ASCII
if (! in_array(strtolower($this->encoding), array('us...
- $buf = mb_convert_encoding($buf, 'utf-8', $this->enc...
+ $buf = @mb_convert_encoding($buf, 'utf-8', $this->en...
$this->encoding = 'utf-8';
}
また変換に成功していても、想定外の文字キャラクタをxml_par...
// Parsing
$xml_parser = xml_parser_create($this->encoding);
xml_set_element_handler($xml_parser, array(& $this, '...
xml_set_character_data_handler($xml_parser, array(& $...
- if (! xml_parse($xml_parser, $buf, 1)) {
+ if (! @xml_parse($xml_parser, $buf, 1)) {
return(sprintf('XML error: %s at line %d in %s',
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser), $buf));
}
xml_parser_free($xml_parser);
ちなみに、sprintf() で作られるエラーメッセージですが、相...
- 先頭の500文字のみ表示するようにしました ( commit:a04c9b...
***クリーンアップで発生したバグ(plugin_showrss_get_times...
1970-01-01T18:00:00 のようにマッチの結果$matches[3] がセ...
ついでに、PHP 5.1.0 以降の[[strtotime()>PHP関数:strtotime...
if (preg_match('/(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2...
$time = strtotime($matches[1] . ' ' . $matches[2]);
- if ($time == -1) {
+ if ($time == -1 || $time === FALSE) {
$time = UTIME;
- } else if ($matches[3]) {
+ } else if (isset($matches[3])) {
$diff = ($matches[5] * 60 + $matches[6]) * 60;
$time += ($matches[4] == '-' ? $diff : -$diff);
}
return $time;
} else {
$time = strtotime($str);
- return ($time == -1) ? UTIME : $time - LOCALZONE;
+ return ($time == -1 || $time === FALSE) ? UTIME : $ti...
}
- この対応(isset)を追加しました。 strtotime() は[[BugTrac...
***キャッシュを使っている場合でも、feed を読み取るときに...
$time = strtotime($str);
return ($time == -1) ? UTIME : $time - LOCALZONE;
のように読み取りに失敗した時に現在の時刻(UTIME)を使って...
- キャッシュ利用時にはファイルの変更日時を使うようにしま...
***[[Atom]] feed を読み込めない [#p0c8799f]
(内容を [[BugTrack/2444]] に移動しました)
***キャッシュを有効にした場合、必ずファイルチェックが入る...
現状では、1つのページに設置した複数showrss プラグイン全て...
なので、未チェックであるか、これまでよりも短い時間を設定...
// Remove cache if expired limit exeed
function plugin_showrss_cache_expire($cachehour)
{
+ static $check = NULL;
+
+ if ($check !== NULL && $check <= $cachehour) return;
+ $check = $cachehour;
+
$expire = $cachehour * 60 * 60; // Hour
$dh = dir(CACHE_DIR);
- キャッシュ利用対象のファイルのみ、有効期限チェック(古...
***XML 宣言でUTF-8 以外のエンコーディングを宣言した場合に...
2009-10-20 (火) 01:48:07 にこの内容を追加
<?xml version="1.0" encoding="EUC-JP" ?>
のようにUTF-8 以外のエンコーディングを宣言した場合、xml_p...
そこで、encoding="エンコード名" の部分を消す事で、この部...
#showrss(http://weather.goo.ne.jp/area/5110.rdf,,0,1)
の例で、中身が表示されない原因がコレみたいです)
// Detect encoding
$matches = array();
if(preg_match('/<\?xml [^>]*\bencoding="([a-z0-9-_]+)...
$this->encoding = $matches[1];
+ $buf = preg_replace('/<\?xml ([^>]*)\bencoding="[a-z...
} else {
$this->encoding = mb_detect_encoding($buf);
}
- この対応を入れました ( commit:a04c9be0cc ) -- [[umorigu...
----
- 『r1.21 で気がついたことをいくつか (2009-10-18 (日) 17:...
- タイトルを変更しました: 「#showrss の不具合??」→「#sh...
#comment
ページ名: