1行に複数のインライン型プラグインがあるとき呼び出し順が乱れる。

  • ページ: BugTrack
  • 投稿者: sha
  • 優先順位: 重要
  • 状態: 完了
  • カテゴリー: 本体バグ
  • 投稿日: 2003-08-04 (月) 01:21:56
  • バージョン:

メッセージ

  • 【症状】

    body「{...}」を指定したインライン型プラグインを1行内に複数記述した場合、その呼び出し順が乱れます。左から右へ順序よく呼び出されることを期待していますが、「{...}」があると、実際にはそうはなりません。

  • 【説明】

    現在、行内のインライン型プラグインの呼び出し順が重要なプラグインを作成しています(official:自作プラグイン/attachref.inc.phpofficial:自作プラグイン/addline.inc.php)。この呼び出し順が乱れると、変化を加えるプラグイン記述の場所を間違えてしまい、動作に致命的な不都合を引き起こします。なんとか御対処願えませんか?

  • 【場所】

    原因の位置は分かっておりまして、make_link.phpの約240行目のfunction make_inline()内です。そもそもは正規表現が変な風に記述を分割してしまうのが根本のようですが、それを再帰呼び出しで対処したために、呼び出し順序が乱れてしまったようです。なんとか変更しようとしましたが、うまくいきませんでした。

    どうやら、make_inline()自体が、再帰的に{...}の内部の方から外側の方へ、呼ばれているのが原因のようです。しかも、make_inline()では前後の評価順が逆になっているようです。

  • 【動作例】

    ここに→動作例を示す


  • あるいは、その行を入力すると、指定関数名の呼び出し順を出力する関数を用意するとかでも対処できるかな? -- sha 2003-08-04 (月) 02:01:34
  • 入れ子になったプラグインが{}の内側 → {}の外側 の順に処理されるのは仕様です。 {}の中身は、外側のプラグインに引数として渡る時点で、整形後の(make_link済みの)文字列になっている必要があります。 -- ぱんだ 2003-08-05 (火) 14:21:56
  • インラインプラグインの処理順序を調整しました。 cvs:make_link.php(v1.4:r1.54) -- ぱんだ 2003-08-05 (火) 14:16:56

    以下のような記述

    &color(red){赤 &size(16){16};&size(24){24};}; &version;
    の場合、呼び出し順は size(16) → size(24) → color(red) → version となるはずです。
    • プラグインの入れ子を処理する部分を、再帰パターン(?R)を無理やり*1使って単純化しました。 -- ぱんだ 2003-08-05 (火) 14:21:56
      • attachref{attachref}やaddline{addline}などという使い方をしなければ問題ないのではないかと…
      • この関数に限らず、pregとかereg って、結構バグが多いのかなぁ?と思っているんですけど。-- upk 2003-08-06 (水) 02:28:11
    • すばらしいっ!&attachref(){};を並べたときに、左から右へ順序よく実行されることを確認しました。ありがとうございます。 -- sha 2003-08-05 (火) 18:22:06

*1 PHP4.1.2で期待した戻り値が得られないことがあるので、これまで使用を控えていたんですが XD

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2003-08-08 (金) 03:13:18
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.253 sec.

OSDN