BugTrack/2120
の編集
Top
/
BugTrack
/
2120
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
RIGHT:&size(12){Category:[[:Plugin]]}; * PHP-5.1 以降で、new プラグインが正常動作しない。 [#p13d2475] - 元タイトル:php-5.1.0RC1でnewプラグインが正常動作しない。 - ページ: BugTrack - 投稿者: [[よっちい]] - 優先順位: 低 - 状態: 完了 - カテゴリー: プラグイン - 投稿日: 2005-11-02 (水) 11:29:20 - バージョン: 1.4.6 - リリース予定バージョン: 1.5.1 ** メッセージ [#t8fd9373] php-5.1.0RC1を用いてPukiWikiを運用すると、newプラグインにおいて「New!」表示の対象であってもそのように表示されません。 php-5.0.5では「New!」表示が出ます。 -------- - %%php-5.0.5以前(?)とphp-5.1.0RC1では時間の書式が異なる%% &new{2005-11-02 12:03:50 (水)}; <- php-5.1.0b1のcomment pluginの入力結果 &new{2005-11-02 (水) 12:03:50}; <- php-5.1.0RC1のcomment pluginの入力結果 %%ようです。%% COLOR(crimson){php-5.0.5とphp-5.1.0RC1は同じでした。}php-5.1.0RC1ではどちらも「New!」表示がされませが、php-5.0.5ではどちらも「New!」表示されます。 -- [[よっちい]] &new{2005-11-02 (水) 12:05:13}; - PHP5.1 で strtotime の関数の挙動が変更されたのが原因のようです。 -- [[kawai]] &new{2005-11-05 (土) 21:45:14}; -- see: http:// www.php.net/strtotime -- [[kawai]] &new{2005-11-05 (土) 21:45:57}; -- それから、pukiwiki 側での該当行は、plugin/new.inc.php の 37 行目です。 -- [[kawai]] &new{2005-11-05 (土) 22:09:30}; - この修正は結構根が深いですね…。とりあえず次のパッチで動くようになるようです。 -- [[kawai]] &new{2005-11-05 (土) 22:24:37}; Index: new.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/new.inc.php,v retrieving revision 1.9 diff -u -r1.9 new.inc.php --- new.inc.php 16 Jun 2005 15:04:08 -0000 1.9 +++ new.inc.php 5 Nov 2005 14:34:15 -0000 @@ -34,8 +34,12 @@ // Show 'New!' message by the time of the $date string if (func_num_args() > 2) return '&new([nodate]){date};'; - $timestamp = strtotime($date); - if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + $timestamp = strtotime(preg_replace('/\([^\x00-\x7F]+\)/','',$date)); + if(version_compare(phpversion(),'5.1')<0){ + if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + }else{ + if ($timestamp === FALSE) return '&new([nodate]){date}: Invalid date string;'; + } $timestamp -= ZONETIME; $retval = in_array('nodate', $args) ? '' : htmlspecialchars($date); -- 本当は strptime を使ってパースしたかったのですけれども、date のフォーマット文字列と strftime のフォーマット文字列は違うので上手なコード方法が思いつきませんでした。とりあえず「strtotime でなんとなくパースする」という方針のもと、動作を妨げている非 ASCII 文字を除去しました。 -- [[kawai]] &new{2005-11-05 (土) 23:38:08}; - なるほど、 - strtotime()が非ASCII文字を厳密に扱うようになった(?) - エラーの戻り値の変更によりエラーハンドリングができていない という2つの問題があったわけですね。とりあえず上記修正にて「New!」表示されるようになりました(RC4で確認)。 -- [[よっちい]] &new{2005-11-07 (月) 09:45:51}; - 英語モードでは関係ないと思うので、このように --- new.inc.php.orig Tue Nov 8 09:17:37 2005 +++ new.inc.php Tue Nov 8 09:19:47 2005 @@ -34,8 +34,12 @@ // Show 'New!' message by the time of the $date string if (func_num_args() > 2) return '&new([nodate]){date};'; - $timestamp = strtotime($date); - if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + if(LANG == 'ja'){ + $timestamp = strtotime(preg_replace('/\([^\x00-\x7f]+\)/','',$date)); + } else { + $timestamp = strtotime($date); + } + if ($timestamp === -1 || $timestamp === FALSE) return '&new([nodate]){date}: Invalid date string;'; $timestamp -= ZONETIME; $retval = in_array('nodate', $args) ? '' : htmlspecialchars($date); してみました。 -- [[よっちい]] &new{2005-11-08 (火) 12:54:07}; - [[BugTrack/2141]] -- &new{2005-12-17 (土) 09:07:28}; - PHP5.1.4でも状況は変わりませんでした。なので上記パッチを取り込んでいただけないでしょうか?((自分のところは上記パッチを適用済み)) -- [[okkez]] &new{2006-09-25 (月) 00:32:05}; - $weeklabelsを積極的に使うようにすれば、 --- new.inc.php.orig Fri Jun 17 00:04:08 2005 +++ new.inc.php Fri Nov 3 16:41:26 2006 @@ -24,7 +24,7 @@ function plugin_new_inline() { - global $vars, $_plugin_new_elapses; + global $vars, $_plugin_new_elapses, $weeklabels; $retval = ''; $args = func_get_args(); @@ -34,8 +34,8 @@ // Show 'New!' message by the time of the $date string if (func_num_args() > 2) return '&new([nodate]){date};'; - $timestamp = strtotime($date); - if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + $timestamp = strtotime(str_replace($weeklabels,'',$date)); + if ($timestamp === -1 || $timestamp === FALSE) return '&new([nodate]){date}: Invalid date string;'; $timestamp -= ZONETIME; $retval = in_array('nodate', $args) ? '' : htmlspecialchars($date); 言語に依存しない書き方ができそうですが、カッコ''()''が残るのでこれでも動作しません。lngファイルをいじれば --- ja.lng.php.orig Tue Apr 11 02:36:56 2006 +++ ja.lng.php Fri Nov 3 15:01:08 2006 @@ -52,7 +52,7 @@ $_msg_symbol = '記号'; $_msg_other = '日本語'; $_msg_help = 'テキスト整形のルールを表示する'; -$_msg_week = array('日','月','火','水','木','金','土'); +$_msg_week = array('日','月','火','水','木','金','土','(',')'); $_msg_content_back_to_top = '<div class="jumpmenu"><a href="#navigator">↑</a></div>'; $_msg_word = 'これらのキーワードがハイライトされています:'; イケそうですが、ちょっとイマイチ感があります。 -- [[よっちい]] &new{2006-11-03 (金) 16:45:44}; - イマイチかもしれませんが、単純にこのようにしてはどうでしょうか。 -- [[teanan]] &new{2006-12-07 (木) 15:40:16}; $_date = str_replace($weeklabels, '', $date); $_date = str_replace('()', '', $_date); $timestamp = strtotime($_date); -- あ、それはわたしも考えました。2回書くの嫌だな、と思っただけです。preg_replace()よりはコスト的にいいんでしょうね。しかし、本質的にはformat_date()で生成する文字列をplugin以下でゴニョゴニョするのはいかがかなぁと思ってます。 -- [[よっちい]] &new{2006-12-09 (土) 15:11:12}; - 掘り起こしありがとうございます :) どうやるかはともかく、私も上手にparseできるならそれがいいと思います。 -- [[henoheno]] &new{2006-12-07 (木) 23:28:53}; // BugTrack2/301 を削除して移動 - SourceForge.jp がPHP 5.2 になったので、なるべく早く解決することを希望します。 -- &new{2008-03-21 (金) 19:06:21}; -- とはいえ、上の方法だと $date_format = 'Y年m月d日'; のように設定して、''&new{2008年03月21日 (金) 19:00:00};'' として使っている場合はダメなんですよね・・・ -- &new{2008-03-21 (金) 19:06:21}; -- これphp4で動作してましたか? ''この関数はUS英文形式の日付を含む文字列が指定されることを期待しており....''とありますから正常動作する気がしないのですけど。 -- [[よっちい]] &new{2008-03-22 (土) 08:55:41}; -- あ、曜日の件も含めて2バイト文字をハイフンに変換してみるのがいいのかな.... -- [[よっちい]] &new{2008-03-22 (土) 08:58:09}; -- わざわざ、すみません。実際には上のようにして使ってはいないのですが、全面解決させるのなら$date_format や$time_format がデフォルトでない時のことも考えた方がいいのかな、と提示しただけです。 -- &new{2008-03-22 (土) 12:02:10}; -- ちなみに、PHP-4.4.8 で試したら動いてました。それどころか、''&new{2008-03-21- --- 19:00:00};'' みたいな日時表示としてはアウトだろ、というのでも動いてます。どちらも、ここ(PHP-5.2)では動かないんですけどね。 -- &new{2008-03-22 (土) 12:20:17}; - この問題まだ解決していませんね -- [[umorigu]] &new{2016-01-17 (日) 18:53:53}; - 日付はnewプラグインの引数から数字部分を抜き出してISO8601形式に整形するようにしました [[php.net:manual/ja/function.strtotime.php]] -- [[umorigu]] &new{2016-01-17 (日) 21:59:38}; if (preg_match('/^\D*(\d{4})\D+(\d{1,2})\D+(\d{1,2})\D+(\d{1,2}:\d{2}:\d{2})\D*$/', $date, $dm)) { $iso8601_date = $dm[1] . '-' . substr('0' . $dm[2], -2) . '-' . substr('0' . $dm[3], -2) . ' ' . $dm[4]; $timestamp = strtotime($iso8601_date); } - 完了にします。数値部分しか見てないので ''&new{2016年01月17日 21:26:07};'' みたいなのでも認識します。年月日の順番が変わるとアウトですが、PukiWiki自体がほぼ日本でしか使われてないので許容範囲かなと -- [[umorigu]] &new{2016-01-17 (日) 22:13:35}; - 上記の対応内容: [[commit:30594c96900ce1a6d46d20d7a9cce7fadc3bff85]] -- &new{2017-01-22 (日) 00:36:56}; - 一部修正: [[BugTrack/2410]] -- &new{2017-01-22 (日) 00:36:56}; //#comment
タイムスタンプを変更しない
RIGHT:&size(12){Category:[[:Plugin]]}; * PHP-5.1 以降で、new プラグインが正常動作しない。 [#p13d2475] - 元タイトル:php-5.1.0RC1でnewプラグインが正常動作しない。 - ページ: BugTrack - 投稿者: [[よっちい]] - 優先順位: 低 - 状態: 完了 - カテゴリー: プラグイン - 投稿日: 2005-11-02 (水) 11:29:20 - バージョン: 1.4.6 - リリース予定バージョン: 1.5.1 ** メッセージ [#t8fd9373] php-5.1.0RC1を用いてPukiWikiを運用すると、newプラグインにおいて「New!」表示の対象であってもそのように表示されません。 php-5.0.5では「New!」表示が出ます。 -------- - %%php-5.0.5以前(?)とphp-5.1.0RC1では時間の書式が異なる%% &new{2005-11-02 12:03:50 (水)}; <- php-5.1.0b1のcomment pluginの入力結果 &new{2005-11-02 (水) 12:03:50}; <- php-5.1.0RC1のcomment pluginの入力結果 %%ようです。%% COLOR(crimson){php-5.0.5とphp-5.1.0RC1は同じでした。}php-5.1.0RC1ではどちらも「New!」表示がされませが、php-5.0.5ではどちらも「New!」表示されます。 -- [[よっちい]] &new{2005-11-02 (水) 12:05:13}; - PHP5.1 で strtotime の関数の挙動が変更されたのが原因のようです。 -- [[kawai]] &new{2005-11-05 (土) 21:45:14}; -- see: http:// www.php.net/strtotime -- [[kawai]] &new{2005-11-05 (土) 21:45:57}; -- それから、pukiwiki 側での該当行は、plugin/new.inc.php の 37 行目です。 -- [[kawai]] &new{2005-11-05 (土) 22:09:30}; - この修正は結構根が深いですね…。とりあえず次のパッチで動くようになるようです。 -- [[kawai]] &new{2005-11-05 (土) 22:24:37}; Index: new.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/new.inc.php,v retrieving revision 1.9 diff -u -r1.9 new.inc.php --- new.inc.php 16 Jun 2005 15:04:08 -0000 1.9 +++ new.inc.php 5 Nov 2005 14:34:15 -0000 @@ -34,8 +34,12 @@ // Show 'New!' message by the time of the $date string if (func_num_args() > 2) return '&new([nodate]){date};'; - $timestamp = strtotime($date); - if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + $timestamp = strtotime(preg_replace('/\([^\x00-\x7F]+\)/','',$date)); + if(version_compare(phpversion(),'5.1')<0){ + if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + }else{ + if ($timestamp === FALSE) return '&new([nodate]){date}: Invalid date string;'; + } $timestamp -= ZONETIME; $retval = in_array('nodate', $args) ? '' : htmlspecialchars($date); -- 本当は strptime を使ってパースしたかったのですけれども、date のフォーマット文字列と strftime のフォーマット文字列は違うので上手なコード方法が思いつきませんでした。とりあえず「strtotime でなんとなくパースする」という方針のもと、動作を妨げている非 ASCII 文字を除去しました。 -- [[kawai]] &new{2005-11-05 (土) 23:38:08}; - なるほど、 - strtotime()が非ASCII文字を厳密に扱うようになった(?) - エラーの戻り値の変更によりエラーハンドリングができていない という2つの問題があったわけですね。とりあえず上記修正にて「New!」表示されるようになりました(RC4で確認)。 -- [[よっちい]] &new{2005-11-07 (月) 09:45:51}; - 英語モードでは関係ないと思うので、このように --- new.inc.php.orig Tue Nov 8 09:17:37 2005 +++ new.inc.php Tue Nov 8 09:19:47 2005 @@ -34,8 +34,12 @@ // Show 'New!' message by the time of the $date string if (func_num_args() > 2) return '&new([nodate]){date};'; - $timestamp = strtotime($date); - if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + if(LANG == 'ja'){ + $timestamp = strtotime(preg_replace('/\([^\x00-\x7f]+\)/','',$date)); + } else { + $timestamp = strtotime($date); + } + if ($timestamp === -1 || $timestamp === FALSE) return '&new([nodate]){date}: Invalid date string;'; $timestamp -= ZONETIME; $retval = in_array('nodate', $args) ? '' : htmlspecialchars($date); してみました。 -- [[よっちい]] &new{2005-11-08 (火) 12:54:07}; - [[BugTrack/2141]] -- &new{2005-12-17 (土) 09:07:28}; - PHP5.1.4でも状況は変わりませんでした。なので上記パッチを取り込んでいただけないでしょうか?((自分のところは上記パッチを適用済み)) -- [[okkez]] &new{2006-09-25 (月) 00:32:05}; - $weeklabelsを積極的に使うようにすれば、 --- new.inc.php.orig Fri Jun 17 00:04:08 2005 +++ new.inc.php Fri Nov 3 16:41:26 2006 @@ -24,7 +24,7 @@ function plugin_new_inline() { - global $vars, $_plugin_new_elapses; + global $vars, $_plugin_new_elapses, $weeklabels; $retval = ''; $args = func_get_args(); @@ -34,8 +34,8 @@ // Show 'New!' message by the time of the $date string if (func_num_args() > 2) return '&new([nodate]){date};'; - $timestamp = strtotime($date); - if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;'; + $timestamp = strtotime(str_replace($weeklabels,'',$date)); + if ($timestamp === -1 || $timestamp === FALSE) return '&new([nodate]){date}: Invalid date string;'; $timestamp -= ZONETIME; $retval = in_array('nodate', $args) ? '' : htmlspecialchars($date); 言語に依存しない書き方ができそうですが、カッコ''()''が残るのでこれでも動作しません。lngファイルをいじれば --- ja.lng.php.orig Tue Apr 11 02:36:56 2006 +++ ja.lng.php Fri Nov 3 15:01:08 2006 @@ -52,7 +52,7 @@ $_msg_symbol = '記号'; $_msg_other = '日本語'; $_msg_help = 'テキスト整形のルールを表示する'; -$_msg_week = array('日','月','火','水','木','金','土'); +$_msg_week = array('日','月','火','水','木','金','土','(',')'); $_msg_content_back_to_top = '<div class="jumpmenu"><a href="#navigator">↑</a></div>'; $_msg_word = 'これらのキーワードがハイライトされています:'; イケそうですが、ちょっとイマイチ感があります。 -- [[よっちい]] &new{2006-11-03 (金) 16:45:44}; - イマイチかもしれませんが、単純にこのようにしてはどうでしょうか。 -- [[teanan]] &new{2006-12-07 (木) 15:40:16}; $_date = str_replace($weeklabels, '', $date); $_date = str_replace('()', '', $_date); $timestamp = strtotime($_date); -- あ、それはわたしも考えました。2回書くの嫌だな、と思っただけです。preg_replace()よりはコスト的にいいんでしょうね。しかし、本質的にはformat_date()で生成する文字列をplugin以下でゴニョゴニョするのはいかがかなぁと思ってます。 -- [[よっちい]] &new{2006-12-09 (土) 15:11:12}; - 掘り起こしありがとうございます :) どうやるかはともかく、私も上手にparseできるならそれがいいと思います。 -- [[henoheno]] &new{2006-12-07 (木) 23:28:53}; // BugTrack2/301 を削除して移動 - SourceForge.jp がPHP 5.2 になったので、なるべく早く解決することを希望します。 -- &new{2008-03-21 (金) 19:06:21}; -- とはいえ、上の方法だと $date_format = 'Y年m月d日'; のように設定して、''&new{2008年03月21日 (金) 19:00:00};'' として使っている場合はダメなんですよね・・・ -- &new{2008-03-21 (金) 19:06:21}; -- これphp4で動作してましたか? ''この関数はUS英文形式の日付を含む文字列が指定されることを期待しており....''とありますから正常動作する気がしないのですけど。 -- [[よっちい]] &new{2008-03-22 (土) 08:55:41}; -- あ、曜日の件も含めて2バイト文字をハイフンに変換してみるのがいいのかな.... -- [[よっちい]] &new{2008-03-22 (土) 08:58:09}; -- わざわざ、すみません。実際には上のようにして使ってはいないのですが、全面解決させるのなら$date_format や$time_format がデフォルトでない時のことも考えた方がいいのかな、と提示しただけです。 -- &new{2008-03-22 (土) 12:02:10}; -- ちなみに、PHP-4.4.8 で試したら動いてました。それどころか、''&new{2008-03-21- --- 19:00:00};'' みたいな日時表示としてはアウトだろ、というのでも動いてます。どちらも、ここ(PHP-5.2)では動かないんですけどね。 -- &new{2008-03-22 (土) 12:20:17}; - この問題まだ解決していませんね -- [[umorigu]] &new{2016-01-17 (日) 18:53:53}; - 日付はnewプラグインの引数から数字部分を抜き出してISO8601形式に整形するようにしました [[php.net:manual/ja/function.strtotime.php]] -- [[umorigu]] &new{2016-01-17 (日) 21:59:38}; if (preg_match('/^\D*(\d{4})\D+(\d{1,2})\D+(\d{1,2})\D+(\d{1,2}:\d{2}:\d{2})\D*$/', $date, $dm)) { $iso8601_date = $dm[1] . '-' . substr('0' . $dm[2], -2) . '-' . substr('0' . $dm[3], -2) . ' ' . $dm[4]; $timestamp = strtotime($iso8601_date); } - 完了にします。数値部分しか見てないので ''&new{2016年01月17日 21:26:07};'' みたいなのでも認識します。年月日の順番が変わるとアウトですが、PukiWiki自体がほぼ日本でしか使われてないので許容範囲かなと -- [[umorigu]] &new{2016-01-17 (日) 22:13:35}; - 上記の対応内容: [[commit:30594c96900ce1a6d46d20d7a9cce7fadc3bff85]] -- &new{2017-01-22 (日) 00:36:56}; - 一部修正: [[BugTrack/2410]] -- &new{2017-01-22 (日) 00:36:56}; //#comment
テキスト整形のルールを表示する