//
// 説明
// 再帰的な内部解析ルーチン。 これにより、動的な下位テンプレートを含む
// テンプレートが再帰的に解析されます。 これらの
// 下位テンプレートのそれぞれは、TEMPLATE 配列に独自のエントリを取得します。
//
function &parse_internal_1 ($tag, $rest = '') {
$debug = $this->DEBUGALL || $this->DEBUG['parse_internal_1'];
if (empty($tag)) {
$this->error ("parse_internal_1: 空のタグが無効です", true);
}
if ($debug)
$this->logwrite ("parse_internal_1 (tag=$tag,rest=$rest)");
while (!empty($rest)) {
if ($debug)
$this->logwrite ('parse_internal_1 : REGEX_DYNBEG search:rest => ' . $rest);
if (preg_match ($this->REGEX_DYNBEG, $rest, $dynbeg)) {
// 2 つの部分に分割して検索します
// 一致する END の半分。
// 次の要素に入る文字列には、BEGIN
// ブロックを形成する HTML コメントが含まれています。
if ($debug)
$this->logwrite ('parse_internal_1: match beg =& gt; $dynbeg [1]);
$pos = strpos ($rest, $dynbeg[1]);
// BEGIN コメントの両側のテキストが
// 空白のみであるかどうかを確認します。 そうであれば、行全体を削除します。
$okay = false;
for ($offbeg = $pos - 1; $offbeg >= 0; $offbeg--) {
$c = $rest{$offbeg};
if ($c == "n") {
$okay = true;
$offbeg++;
break;
}
if (($c != ' ') && ($c != "t")) {
$offbeg = $pos;
break;
}
}
if (! $oky) {
$offend = $pos + strlen($dynbeg[1]);
} else {
$l = strlen ($rest );
for ($offend = $pos + strlen($dynbeg[1]); $offend < $l; $offend++) {
$c = $rest{$offend};
if ($c == "n") {
$offend++;
break;
if (($c != ' ') && ($c != "t")) {
$offend = $pos + strlen($dynbeg[1]);
break;
}
}
//これには、出力の REGEX_DYNBEG の内容が含まれます
// $part[] = substr ($rest, 0, $pos) ;
// これにより、END ブロック行の空白が保持されます。
// $part[] = substr ($rest, 0, $pos+strlen($dynbeg[1]));
// $rest = substr ($rest, $pos+strlen($dynbeg[1]));
// BEGIN ブロックが位置 0 にあるケースをキャッチします。
if ($offbeg > 0)
$part[] = substr ($rest , 0, $offbeg);
$rest = substr ($rest, $offend);
$sub = '';
if ($debug)
$this->logwrite ("parse_internal_1 : pos = $pos で見つかりました");
// さて、ここでは実際には次の
// END ブロックだけに興味はありません。 私たちが関心があるのは、
// この BEGIN ブロックと一致する次の END ブロックだけです。 これは最も効率的ではありません
// 実際には、BEGIN ブロックと END ブロックをマークするだけの文字列
// を介してこれを 1 回のパスで実行できるためです。 しかし、再帰
// は単純なアルゴリズムになります (逆の場合
// preg...)。 ) ) {
if ($debug)
$this->logwrite ('parse_internal_1: REGEX_DYNEND search:rest => ' . $rest);
if ($debug)
$this->logwrite ('parse_internal_1: match beg => ' . $dynend[1]);
$pos = strpos ($rest, $dynend[1]);
if ($dynbeg[2] == $dynend[2]) {
$見つかった =本当;
// END コメントの両側のテキストが
// 空白のみであるかどうかを確認します。 その場合、行全体を削除します。
$okay = false;
for ($offbeg = $pos - 1; $offbeg >= 0; $offbeg--) {
$c = $rest{ $offbeg};
if ($c == "n") {
$offbeg++;
$okay = true;
break;
}
if (($c != ' ') && ($c != "t")) {
$offbeg = $pos;
break;
}
}
if (! $okay) {
$offend = $pos + strlen($dynend[1]);
else {
$l = ($rest );
for ($offend = $pos + strlen($dynend[1]); $offend < $l; $offend++) {
$c = $rest{$offend};
if ($c == " n") {
$offend++;
休憩;
}
if (($c != ' ') && ($c != "t")) {
$offend = $pos + strlen($dynend[1] );
休憩;
}
}
}
// if ($debug)
// $this->logwrite ("parse_internal_1: DYNAMIC BEGIN: (pos,len,beg,end) => ($pos, " . strlen($dynbeg[1]) . ", $offbeg, $offend)
// これには出力の REGEX_DYNEND の内容が含まれます
// $rest = substr ($rest, $pos);
// これにより、END ブロック行の空白が保持されます(s) .
// $ rets = substr($ rest、$ pos+strlen($ dynend [1])); $rest, 0, $offbeg);
$rest = substr ($rest, $offend);
// すでにロードされているテンプレートは再ロードされません。
// 'clear' テストは実際にはバグを隠していましたはっきりと( )
// ロジック....
if (false && isset($this->TEMPLATE[$dynend[2]]['clear'])
&& $this->TEMPLATE [$ダイネンド[2]] ['clear']) {
$this->TEMPLATE[$dynend[2]]['string'] = '';
$this->TEMPLATE[$dynend[2]]['result'] = '';
$this->TEMPLATE[$dynend[2]]['part'] =
$this->parse_internal_1 ($dynend[2], ');
} else if (!isset($ this->TEMPLATE[$dynend[2]]['loaded'])
|| !$this->TEMPLATE[$dynend[2]]['loaded']) {
// 空の動的テンプレートの異常なケースを省略します。
if (strlen($sub) > 0) {
$this-> ;TEMPLATE[$dynend[2]]['string'] = $sub;
$this->TEMPLATE[$dynend[2]]['part'] =
$this->parse_internal_ 1 ($dynend[2 ], $sub);
$this->TEMPLATE[$dynend[2]]['part']['parent'] = $tag;
}
$this->TEMPLATE[$dynend[2]]['loaded'] = true;
$part[] = &$this->TEMPLATE[$dynend[2]];
$this->TEMPLATE[ $dynend[2]]['tag'] = $dynend[2];
break;
} else {
$sub .= substr ($rest, 0, $pos+strlen($dynend[1])) ;
$rest = substr ($rest, $pos+strlen($dynend[1]));
if ($debug)
$this->logwrite ("parse_internal_1: nbeg[2] != $dynend[2] ]");
}
}
if (!$found) {
$this->error (「不正な動的テンプレート、END
n がありません。」 「$dynbeg[1]
}
} else {
// ぶら下がった END ブロックがないことを確認することは意味があるように見えますが、実際には、常にぶら下がっているように見えます
// ぶら下がり END ブロックがあります。 下位テンプレートの前の
// 部分に BEGIN 文字列を詰め込み、下位テンプレートの後の
// 部分に END 文字列を詰め込みます。 したがって、このテストが機能するには、
// 最終一致の直後を調べる必要があります。
if (preg_match ($this->REGEX_DYNEND, $rest, $dynend)) {
// $this->error ("不正な動的テンプレート、ぶら下がり END
n" .
// "$dynend[1]
n", 1);
$part[] = ;
$ rest = '';
}
}
return $part;
}
//
// 説明
// テンプレートを解析します。 $tag が実際に配列である場合、配列要素を反復処理します
// 。 単純な文字列タグの場合でも、テンプレートに動的テンプレートが含まれていれば
// テンプレートを再帰的に解析できます。また、
// それらも自動的にロードするように設定されています。
//
function parse_internal ($tag) {
$デバッグ = $this->デバッグ || $this->DEBUG['parse_internal'];
$append = false;
if ($debug)
$this->logwrite ("parse_internal (tag=$tag)");
// タグの配列を渡された場合、それらすべてを反復処理します。 this
// これは実際には class.FastTemplate.php3 の仕組みからの名残です;
// subst() は既にその配列を分解していると思いますので、this
// 誰かが内部メンバーを呼び出さない限り、 this
// は必要ないはずです
// 直接関数を実行します。
if (gettype($tag) == 'array') {
reset ($tag);
foreach ($tag as $t) {
$this->parse_internal ($t);
}
} else {
// ファイルがまだロードされていない場合はロードします。 もしかしたら
// ファイルが最後にロードしてから変更された場合
// があった場合にファイルを再ロードするロジックを組み込むと良いかもしれません
// 複雑になりすぎるため、フローティング状態にし始めた場合にのみ意味があります
// ページ間を永続変数として読み込みます。
if (!isset($this->TEMPLATE[$tag]['loaded'])) {
if ($this->TEMPLATE[$tag][' Dynamic']) {
// テンプレートはdefine_dynamic()で宣言されました。
if ($this->TEMPLATE[$tag]['parent'])
$tag = $this->TEMPLATE[$tag][ 'parent'];
else {
// 同じファイルを持つ非動的テンプレートを見つけてみます。
// これは、define(array(), true) によって定義されます
リセット ($this->TEMPLATE );
foreach (array_keys($this->TEMPLATE) as $ptag) {
if ($debug)
$this->logwrite ("par se_internal: 非動的親 $ptag を探しています");
if (!$this->TEMPLATE[$ptag]['dynamic']
&& ($this->TEMPLATE[$ptag]['file'] == $this->TEMPLATE[$tag]['file '])) {
$tag = $ptag;
break;
}
}
}
}
$this->TEMPLATE[$tag]['string'] = &$this->load($this ->TEMPLATE[$tag]['file']);
$this->TEMPLATE[$tag]['loaded'] = 1;🎜 }
// 動的テンプレートを自動的に検出することになっており、dynamic
// フラグが設定されていない場合は、動的セクションのテンプレートをスキャンします。 動的セクション
// マーカーは HTML コメントとして非常に厳密な構文を持っています....
if ($this->DYNAMIC) {
$this->TEMPLATE[$tag]['tag'] = $tag;
if (!isset($this->TEMPLATE[$tag]['parsed'])
|| !$this->TEMPLATE[$tag]['parsed']) {
$this->TEMPLATE[ $tag]['part'] = $this->parse_internal_1 ($tag, $this->TEMPLATE[$tag]['string']);
$this->TEMPLATE[$tag]['parsed '] = true;
}
}
}
}
//
// 説明
// class.FastTemplate.php3 互換インターフェイス
//
/ / メモ
// 私は「subst」という名前の方が好きです。このフェーズでは、実際にテンプレートへの変数置換を行っているため、「解析」します。 ただし、
// ある時点でテンプレートをロードして解析する必要があり、「subst」も
// それも行います...
//
function parse ($handle, $tag, $autoload = true) {
return $this->subst ($handle, $tag, $autoload);
}
// 未完待ち续