// // Description // Perform substitution on the template. We do not really recurse // downward in the sense that we do not do subsitutions on inferior // templates. For each inferior template which is a part of this // template, we insert the current value of their results. // // Notes // Do I want to make this return a reference? function subst ($handle, $tag, $autoload = true) { $append = false; $debug = $this->DEBUGALL || $this->DEBUG[subst]; $this->LAST = $handle; if ($debug) $this->logwrite ("subst (handle=$handle, tag=$tag, autoload=$autoload)"); // For compatibility with FastTemplate, the results need to overwrite // for an array. This really only seems to be useful in the case of // something like // $t->parse (MAIN, array (array, main)); // Where the main template has a variable named MAIN which will be // set on the first pass (i.e., when parasing array) and used on the // second pass (i.e., when parsing main). if (gettype($tag) == array) { foreach (array_values($tag) as $t) { if ($debug) $this->logwrite ("subst: calling subst($handle,$t,$autoload)"); $this->subst ($handle, $t, $autoload); } return $this->HANDLE[$handle]; } // Period prefix means append result to pre-existing value. if (substr($tag,0,1) == .) { $append = true; $tag = substr ($tag, 1); if ($debug) $this->logwrite ("subst (handle=$handle, tag=$tag, autoload=$autoload) in append mode"); } // $this->TEMPLATE[$tag] will only be set if it was explicitly // declared via define(); i.e., inferior templates will not have an // entry. if (isset($this->TEMPLATE[$tag])) { if (!isset($this->TEMPLATE[$tag][parsed]) || !$this->TEMPLATE[$tag][parsed]) $this->parse_internal ($tag); } else { if (!$this->DYNAMIC) { $this->error ("subst (handle=$handle, tag=$tag, autoload=$autoload): " . no such tag and dynamic templates are turned off, true); } if ($autoload) { if ($debug) $this->logwrite ("subst: TEMPLATE[tag=$tag] not found, trying autoload"); foreach (array_keys($this->TEMPLATE) as $t) { if ($debug) $this->logwrite ("subst: calling parse_internal (tag=$t)"); if (!isset($this->TEMPLATE[$tag][parsed]) || !$this->TEMPLATE[$tag][parsed]) $this->parse_internal ($t); } if ($debug) $this->logwrite (subst: retrying with autoload = false); $this->subst ($handle, $tag, false); if ($debug) $this->logwrite (subst: completed with autoload = false); return; } else { $this->error ("subst (handle=$handle, tag=$tag, autoload=$autoload): no such tag", true); } } if (!$append) { $this->TEMPLATE[$tag][result] = ; if ($debug) $this->logwrite ("subst (handle=$handle, tag=$tag, autoload=$autoload) in overwrite mode"); } if ($debug) $this->logwrite (subst: type(this->TEMPLATE[$tag][part]) => . gettype($this->TEMPLATE[$tag][part])); // Hmmm, clear() called before subst() seems to result in this not // being defined which leaves me a bit confused.... $result = ; if (isset($this->TEMPLATE[$tag][part])) { reset ($this->TEMPLATE[$tag][part]); foreach (array_keys($this->TEMPLATE[$tag][part]) as $p) { if ($debug) $this->logwrite ("subst: looking at TEMPLATE[$tag][part][$p]"); $tmp = $this->TEMPLATE[$tag][part][$p]; // Dont try if ($p == parent).... if (strcmp ($p, parent) == 0) { if ($debug) $this->logwrite ("subst: skipping part $p"); $tmp = ; } else if (gettype($this->TEMPLATE[$tag][part][$p]) == string) { if ($debug) $this->logwrite ("subst: using part $p"); reset ($this->VAR); // Because we treat VAR and HANDLE separately (unlike // class.FastTemplate.php3), we have to iterate over both or we // miss some substitutions and are not 100% compatible. while (list($key,$val) = each ($this->VAR)) { if ($debug) $this->logwrite ("subst: substituting VAR $key = $val in $tag"); $key = {.$key.}; $tmp = str_replace ($key, $val, $tmp); } reset ($this->HANDLE); while (list($key,$val) = each ($this->HANDLE)) { if ($debug) $this->logwrite ("subst: substituting HANDLE $key = $val in $tag"); $key = {.$key.}; $tmp = str_replace ($key, $val, $tmp); } $result .= $tmp; } else { $xtag = $this->TEMPLATE[$tag][part][$p][tag]; if ($debug) { $this->logwrite ("subst: substituting other tag $xtag result in $tag"); } // The assignment is a no-op if the result is not set, but when // E_ALL is in effect, a warning is generated without the // isset() test. if (isset ($this->TEMPLATE[$xtag][result])) $result .= $this->TEMPLATE[$xtag][result]; } } } if ($this->STRICT) { // If quiet-mode is turned on, skip the check since were not going // to do anything anyway. if (!$this->QUIET) { if (preg_match ($this->REGEX_VAR, $result)) { $this->error ("unmatched tags still present in $tag
"); } } } else { $result = preg_replace ($this->REGEX_VAR, , $result); } if ($append) { if ($debug) { $this->logwrite ("subst: appending TEMPLATE[$ tag][result] = $result"); $this->logwrite ("subst: old HANDLE[$handle] = {$this->HANDLE[$handle]}"); $this->logwrite ("subst: old TEMPLATE[$tag][result] = {$this->TEMPLATE[$tag][result]}"); } // isset() テストは、E_ALL が有効な場合に警告を抑制します // 変数が// ユーザーが追加モードを指定したとしても、実際にはまだ設定されていません。 if (isset ($this->HANDLE[$handle])) $this->HANDLE[$handle] .= else $this; ->HANDLE[$handle] = $result; if (isset ($this->TEMPLATE[$tag][result])) $this->TEMPLATE[$tag][result] .= else $this- >TEMPLATE[$tag][result] = $result; if ($debug) { $this->logwrite ("subst: new HANDLE[$handle] = {$this->HANDLE[$handle]}"); this->logwrite ("subst: new TEMPLATE[$tag][result] = {$this->TEMPLATE[$tag][result]}") } } else { if ($debug) $this->logwrite ( "subst: TEMPLATE[$tag][result] = $result を設定します"); $this->HANDLE[$handle] = $result; $this->TEMPLATE[$tag][結果] = $結果; $this->HANDLE[$handle] を返します。 } // // 説明 // テンプレートからブロックをクリアします。 // 親から下位のテンプレートを削除することが目的です。これは、指定されたテンプレートに直接進み、 // 結果要素をクリアするため、テンプレートが既に解析されている場合でも機能します。 // 指定されたテンプレートがまだロードされていない場合、parse_internal() を呼び出すことによってロードが強制されます。 // function clear_dynamic ($tag = NULL) { $debug = $this->DEBUGALL || $this->DEBUG[clear_dynamic]; if (is_null ($tag)) { // すべての結果要素をクリアします。うーん、テストする必要があります。 if ($debug) $this->logwrite ("clear_dynamic (NULL)"); foreach (array_values ($this->TEMPLATE) as $t) { $this->clear_dynamic ($t); } 戻る; } else if (gettype($tag) == array) { if ($debug) $this->logwrite ("clear_dynamic ($tag)"); foreach (array_values($tag) as $t) { $this->clear_dynamic ($t); } 戻る; } else if (!isset($this->TEMPLATE[$tag])) { if ($debug) $this->logwrite ("clear_dynamic ($tag) --> $tag が設定されていません。parse_internal を呼び出しています"); $this->parse_internal ($tag); // $this->TEMPLATE[$tag] = 配列(); if ($debug) $this->logwrite ("clear_dynamic ($tag)"); // $this->TEMPLATE[$tag][loaded] = true; // $this->TEMPLATE[$tag][文字列] = ; $this->TEMPLATE[$tag][結果] = ; // $this->TEMPLATE[$tag][clear] = true; } // // 説明 // parse() によって設定されたハンドルの結果をクリアします。入力ハンドルは、 // 単一の値、配列、または PHP 定数 NULL にすることができます。 // 最後のケースでは、すべてのハンドルがクリアされました。 // 関数クリア ($handle = NULL) { $debug = $this->DEBUGALL || $this->デバッグ[クリア]; if (is_null ($handle)) { // わざわざ設定を解除する必要はなく、 // 全体を新しい空の配列に設定するだけです。 if ($debug) $this->logwrite ("クリア (NULL)"); $this->HANDLE = 配列(); } else if (gettype ($handle) == array) { if ($debug) $this->logwrite ("clear ($handle)"); foreach (array_values ($handle) as $h) { $this->clear ($h); else if (isset ($this->HANDLE[$h