Category::Plugin

PHP-5.1 以降で、new プラグインが正常動作しない。

  • 元タイトル:php-5.1.0RC1でnewプラグインが正常動作しない。
  • ページ: BugTrack
  • 投稿者: よっちい?
  • 優先順位: 低
  • 状態: 完了
  • カテゴリー: プラグイン
  • 投稿日: 2005-11-02 (水) 11:29:20
  • バージョン: 1.4.6
  • リリース予定バージョン: 1.5.1

メッセージ

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の入力結果
    ようです。 php-5.0.5とphp-5.1.0RC1は同じでした。php-5.1.0RC1ではどちらも「New!」表示がされませが、php-5.0.5ではどちらも「New!」表示されます。 -- よっちい? 2005-11-02 (水) 12:05:13
  • PHP5.1 で strtotime の関数の挙動が変更されたのが原因のようです。 -- kawai? 2005-11-05 (土) 21:45:14
    • see: http:// www.php.net/strtotime -- kawai? 2005-11-05 (土) 21:45:57
    • それから、pukiwiki 側での該当行は、plugin/new.inc.php の 37 行目です。 -- kawai? 2005-11-05 (土) 22:09:30
  • この修正は結構根が深いですね…。とりあえず次のパッチで動くようになるようです。 -- kawai? 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? 2005-11-05 (土) 23:38:08
  • なるほど、
    - strtotime()が非ASCII文字を厳密に扱うようになった(?)
    - エラーの戻り値の変更によりエラーハンドリングができていない
    という2つの問題があったわけですね。とりあえず上記修正にて「New!」表示されるようになりました(RC4で確認)。 -- よっちい? 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);
    してみました。 -- よっちい? 2005-11-08 (火) 12:54:07
  • BugTrack/2141 -- 2005-12-17 (土) 09:07:28
  • PHP5.1.4でも状況は変わりませんでした。なので上記パッチを取り込んでいただけないでしょうか?*1 -- okkez 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">&uarr;</a></div>';
     $_msg_word           = 'これらのキーワードがハイライトされています:';
    イケそうですが、ちょっとイマイチ感があります。 -- よっちい? 2006-11-03 (金) 16:45:44
  • イマイチかもしれませんが、単純にこのようにしてはどうでしょうか。 -- teanan 2006-12-07 (木) 15:40:16
    		$_date = str_replace($weeklabels, '', $date);
    		$_date = str_replace('()', '', $_date);
    		$timestamp = strtotime($_date);
    • あ、それはわたしも考えました。2回書くの嫌だな、と思っただけです。preg_replace()よりはコスト的にいいんでしょうね。しかし、本質的にはformat_date()で生成する文字列をplugin以下でゴニョゴニョするのはいかがかなぁと思ってます。 -- よっちい? 2006-12-09 (土) 15:11:12
  • 掘り起こしありがとうございます :) どうやるかはともかく、私も上手にparseできるならそれがいいと思います。 -- henoheno 2006-12-07 (木) 23:28:53
  • SourceForge.jp がPHP 5.2 になったので、なるべく早く解決することを希望します。 -- 2008-03-21 (金) 19:06:21
    • とはいえ、上の方法だと
      $date_format = 'Y年m月d日';
      のように設定して、&new{2008年03月21日 (金) 19:00:00}; として使っている場合はダメなんですよね・・・ -- 2008-03-21 (金) 19:06:21
    • これphp4で動作してましたか? この関数はUS英文形式の日付を含む文字列が指定されることを期待しており....とありますから正常動作する気がしないのですけど。 -- よっちい? 2008-03-22 (土) 08:55:41
    • あ、曜日の件も含めて2バイト文字をハイフンに変換してみるのがいいのかな.... -- よっちい? 2008-03-22 (土) 08:58:09
    • わざわざ、すみません。実際には上のようにして使ってはいないのですが、全面解決させるのなら$date_format や$time_format がデフォルトでない時のことも考えた方がいいのかな、と提示しただけです。 -- 2008-03-22 (土) 12:02:10
    • ちなみに、PHP-4.4.8 で試したら動いてました。それどころか、&new{2008-03-21- --- 19:00:00}; みたいな日時表示としてはアウトだろ、というのでも動いてます。どちらも、ここ(PHP-5.2)では動かないんですけどね。 -- 2008-03-22 (土) 12:20:17
  • この問題まだ解決していませんね -- umorigu 2016-01-17 (日) 18:53:53
  • 日付はnewプラグインの引数から数字部分を抜き出してISO8601形式に整形するようにしました php.net:manual/ja/function.strtotime.php -- umorigu 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 2016-01-17 (日) 22:13:35
  • 上記の対応内容: commit:30594c96900ce1a6d46d20d7a9cce7fadc3bff85 -- 2017-01-22 (日) 00:36:56
  • 一部修正: BugTrack/2410 -- 2017-01-22 (日) 00:36:56

*1 自分のところは上記パッチを適用済み

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-01-22 (日) 00:36:57
Site admin: PukiWiki Development Team

PukiWiki 1.5.1+ © 2001-2016 PukiWiki Development Team. Powered by PHP 5.6.38-0+deb8u1. HTML convert time: 0.313 sec.

OSDN